HBase超詳細版本教學一

HBase基礎

在這裏插入圖片描述
什麼是HBase
在這裏插入圖片描述
它第一句就告訴我們了是Hadoop的Database,跟Hadoop有關係的,a distributed分佈式的,scalable可擴展的,根據這句話的描述,我們可以知道,HBase的數據是存儲再Hadoop中HDFS中的,它數據是要落盤的。我們搭建HBase的時候呢,它是一個集羣,是分佈式的,可擴展的意思就是橫向擴展的意思。可以添加很多很多的節點。big data store海量數據的存儲。所以HBase是存儲系統。

什麼時候用HBase

在這裏插入圖片描述
其中有些詞彙我們拿出來分析一下,random隨機的,realtime實時的,read/write讀寫,Big Data海量數據,這句話大概意思就是,你想隨機實時的讀寫海量數據,這個時候我們就可以考慮使用HBase。並且看圖:
在這裏插入圖片描述
它還是一個數十萬行和數百萬列的大表。這是它項目的目標,支持這麼大的表

在這裏插入圖片描述
而且它還說了是將谷歌的BigTable進行了開源實現,相當於借鑑了谷歌的BigTable

HBase定義

HBase是一種分佈式、可擴展、支持海量數據存儲的NoSQL數據庫
思考題:什麼是NoSQL?

在這裏插入圖片描述
說的具體點,就是,非關係型,分佈式,不提供ACID的數據庫設計模式,這裏的ACID指的是數據庫四個事務特性。原子,一致,隔離,持久。以鍵值形式,和麪向文檔形式存儲。
我們其實再大數據領域,已經有了海量存儲系統,HDFS,那麼爲什麼還要一個HBase呢?我們關心存儲系統,主要關心就是讀寫問題,HDFS的讀寫太慢了,它是批量讀寫,一次寫海量數據,一次讀海量數據,不能做到隨機讀寫,比如說:我在10億條數據中修改一個數據,HDFS是不支持這個操作的,我們的HDFS主要做什麼呢?主要存儲靜態數據,所以我們搞了個HBase,它快在了哪裏呢?快在了隨機實時讀寫上。它是支持這個的。我現在有海量的數據,在10億條數據中修改某一條,刪除某一條,都是能做到的

HBase數據模型

所謂的數據模型,就是指的我們HBase的數據結構。我數據扔進去之後,給用戶展現出什麼樣子的。底層又存儲成什麼樣的。
邏輯上,HBase的數據模型同關係型數據庫很類似,數據存儲在一張表中,有行有列。但從HBase的底層物理存儲結構(K-V)來看,很多個kv鍵值對我們通常稱之爲Map,HBase更像是一個multi-dimensional map

HBase簡單邏輯結構

這個簡單的邏輯架構先帶我們認識HBase的結構。後面還會豐富它,並且糾正它,這裏只是爲了方便好理解。

所謂的邏輯結構,就是HBase給我們展現出來的是什麼樣的數據。
如圖所示:底下這張圖就是HBase他給我們用戶呈現出來的樣子。與我們關係型數據庫中的表是一樣的,非常相似。有行有列

在這裏插入圖片描述
而在這張圖中,有一個非常重要的概念在裏面,就是personal_info和Office_info的位置,我們稱之爲列族。它的英文爲Colum n Family,意思就是多個列的組合。一個列族下面有多個列。

在這裏插入圖片描述
在底層存儲的時候,一個列族的數據,我們是存儲在一起的,不同列族的數據,我們是分開存儲的。
在這裏插入圖片描述
第二個就是列的概念,相當於關係型數據庫中的字段是一個概念。其實這個列理解起來簡單

在這裏插入圖片描述
但是它沒有那麼簡單,我們關係型數據庫中是不是要建表,建表的時候需要聲明這個表中有哪些字段。有哪些列,都要提前規劃好,而每個字段都會有相應的數據類型跟隨,是Int類型,還是Varchar類型,而在我們HBase中建表的時候,我們其實是不需要聲明列的,我們建表的時候只需要聲明列明就夠了。
在這裏插入圖片描述
我們沒有列怎麼插入數據呢?我們HBase的列,就是在我們插入數據的時候纔會出現。那我們是不是這個列可以隨便寫呢,我們插入數據的時候,想插入那個列,就插入哪個列,如果這個列以前沒有,那麼插入數據的時候是不是就有了呀。這個其實是和我們的底層存儲有關係的。一會兒我們說底層存儲時會講。

下一個概念教RowKey,非常非常重要,在HBase中非常重要。這個RowKey可以和關係型數據庫中的主鍵做一個類比
在這裏插入圖片描述
我們這個RowKey,在我們的HBase中比哪個主鍵要強太多了。那麼這個重要性體現在什麼地方呢?首先我們觀察一下,會發現它時有序的。也就是說,我們HBase中的數據是有序的。排序的時候我們是按照RowKey的字典順序排序的。看第二個11和第三個2就會發現了。他是一個字符一個字符比的

在這裏插入圖片描述
而在我們檢索數據庫的時候,我們需要對數據庫進行查詢,我們檢索數據的時候只能根據這個RowKey去檢索。比如說穩要查一下這個李四的電話號碼是多少?如果是關係型數據庫,穩直接用SQL就可以查詢select name from 表名 where name = 李四,我們如果在HBase中查詢李四數據的時候,只能查詢RowKey11這條數據在哪裏

在這裏插入圖片描述
用其他的什麼列區檢索能不能實現?其實也是能實現的,只不過性能是非常差的,如果穩通過name去檢索李四,它會掃描全表,將姓名等於李四的過濾出來。如果我們就想要姓名等於李四的手機號,通過RowKey去查詢,我們怎麼做呢?我們可以將姓名這個字段融入到RowKey當中。RowKey是我們自己設定的,我們就可以通過RowKey加上Name去過濾李四。RowKey我們自己設計,想怎麼設計,就怎麼設計。我們效率之所以高,也是因爲RowKey是有序的。完全可以混入二分查找法來加速我們的查詢。至於RowKey到底怎麼設計,我們後面再說。
這裏注意一個小點,就是同一個RowKey的列族是會別切分的。如圖:

在這裏插入圖片描述
我們HBase是一個分佈式存儲系統,一旦涉及到分佈式,我們就要有一個分區的概念,這裏和Kafka比較類似。它的分區時橫向分的,而每一個分區都叫做Region,Region地區地域的意思。而每一個分區都有一個RowKey的範圍。至於分區怎麼分,我們後面會說。相同的RowKey不可以跨Region,言外之意就是一行的數據只能存儲在一個分區裏面。

在這裏插入圖片描述
下面還有一個概念叫做Store,Store存儲的意思,它時幹什麼用的呢?他就是幹數據存儲的一個組件。那麼我一個Store存儲的單元是什麼?也就是說我一個Store負責的區域是什麼?它負責的是一個Region中的一個列族。如圖:
在這裏插入圖片描述
我們的一個表中會有多個Region,我們的一個表中也會有很多個列族,而我們剛纔的那個圖中應該有幾個Store纔對呢?有6個纔對。
下圖是回顧總結。

在這裏插入圖片描述

HBase簡單物理結構

所謂物理結構,就是HBase在底層是怎麼存儲的。我們以上面的一個Store爲例,看一下它底層是怎麼存儲的。以張三這個數據爲例

在這裏插入圖片描述
我們存儲一行數據要存儲這麼多東西?它看着也像一張表。我們看一下都是什麼,如圖所示:
在這裏插入圖片描述
看到這裏我們感覺HBase更像一個多維的Map,V是誰呢?就是什麼張三,北京電話,誰是K呢?每一行除去V,前面的一大堆都叫K。這個K是多個字段組成的,所以我們叫他多維的Map。下面的一行數據對應的就是上面的一個小單元格,入下面張三一大行數據,對應的就是上面一個單元格張三的位置,北京也是如此。但是我們上面只有三個單元格,爲啥下面有四行數據呢?最後兩行數據都是電話,爲什麼會存儲兩條數據呢?其實是更新了。HBase會認時間戳的,他會顯示最新時間戳的數據信息。它是以追加一條數據的方式,實現了修改和刪除的功能。爲什麼不直接修改呢?是因爲我們的數據是海量數據,直接修改數據首先要定位數據,開銷非常大。其實HBase是犧牲了一部分讀取的性能換來了它寫性能的提升。我們在HBase中刪除一條數據使用Delete的時候,我們會將數據類型進行更改變成Delete,當HBase檢索到這條數據看到它這個類型,HBase會判斷的,刪除的數據不會再顯示。這個刪除的數據不會永久保留,我們後續再說
這裏還牽扯數來一個版本的問題,就是時間戳,我們可以設定我們要幾個版本的數據,我想保留一條數據的三個版本,我就將version設成3,會顯示出最近一條數據追加更新的三條歷史記錄一樣的東西。

需要更多大數據資料或者討論技術,加微信
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章