HBase學習之路 四 理解HBase的基本架構

2021-09-20 21:51:12 字數 3416 閱讀 4548

二、hbase表資料模型

三、hbase核心架構

四、hbase讀寫流程

五、總結

hbase是面向列的非關係型資料庫,可以簡單地總結,列是hbase最基本的單位,一行由多列組成。具體組成結構如下:

1. 行健

行健(rowkey)的作用是在hbase表中唯一標識一行,與關係型資料庫中的主鍵很類似,在同一張表中唯一。行健會按字典序排序,如何保證行健的有序性呢?與關係型資料庫不同,在hbase中行健最終會轉化為位元組陣列儲存的,所以無論你的行健輸入是什麼型別,最終統一會轉化為位元組陣列儲存,從而保證了可排序性。

圖中為一張表的資料,可以發現row-2比row-10大這是因為,轉化為位元組陣列時從高位比起,「row-」大家都相等,「2」比「1」要大,因此row-2比row-10大,和我們正常的想法是不一樣的。行健不需要在建立表的時候就定義好,等到插入資料時才隨著資料一同插入。

2. 列族

列族(column family)包含若干列,列族名必須是可見字元,可以由任意二進位制字元組成,列族有助於構建資料語義邊界或區域性邊界,同乙個列族的所有列儲存在同乙個底層儲存檔案中,這個檔案是hfile。列族必須在健表時就要定義好,數量不宜過多一般不超過2個,並且不宜頻繁修改。

3. 列

列必須屬於某乙個列族下,列與列族不同,在建立表時不需要先在表中定義列,而是等到往表中插入資料時隨著資料一同插入,列名可以由任意二進位制字元組成。

4. 單元格

可以把單元格理解為最終你要儲存的內容,在hbase中,一切皆為位元組陣列,沒有資料型別可言,這一點與關係型資料庫差別非常大,因此你存貯的內容也將變成位元組陣列儲存在hbase中。

5. 時間戳

每乙個存入的值都具有時間戳,預設由系統指定,也可以由使用者顯式指定。時間戳會被使用,例如通過不同的時間戳區分不同版本的值,同乙個單元格的值按照時間戳降序排序,訪問時優先讀取最新版本的值。

綜上,對於hbase表結構可以得出如下結論:

傳統的關係型資料庫面向行設計,採用二維表的電子**模型儲存資料,表中的各個字段必須在定義表時給出且必須先定義型別,由主鍵確定一行,假設某一行的某個字段沒有值,必須要用null佔位,表示該個字段為空,以下是一張典型的二維表:

而hbase則是面向列設計的,行和列沒有向關係型資料庫的二維表那樣排列,而是採用了標籤描述,每乙個值都儲存在乙個標籤下,且很重要的一點事是hbase採用稀疏儲存,對於每一行如果某個列缺失,則不儲存內容,不需要使用null來佔位,所以你可能會看到一些奇怪的現象,有的行有很多值,有的行只有乙個值,這就是稀疏儲存,它不像二維表那麼規整,會不規則,以下便是一張典型的hbase表:

可以看到該錶有兩個列族family1和family2,對於第一行而言,行健是rowa,它在family1下有一列a,存有值,在family2上有一列b存有值;對於第二行僅僅在列族family1上有一列b,且列名與第一行不一樣,印證上文所說的,列名是隨著資料插入而決定的;第三行也是類似的,僅僅在列族family2有列c。

進一步**,不難發現hbase實際上是乙個key-value資料庫,所謂的key其實是行健,列族和列,時間戳,因此可以下乙個結論在給定一張表中,hbase依靠**座標唯一定位資料,第一級座標是行健,第二級座標是列族和列,第三極座標是時間戳,因此有了如下的資料儲存模式:

(rowkey,family,column,timestamp) --> value

我們從hbase裡讀取資料的過程就是輸入對應的座標,然後獲取value的過程,以下一張圖可以直觀地看到這三個座標在hbase表中的分布:

hmaster沒有單點問題,hbase中可以啟動多個hmaster,通過zookeeper的master election機制保證總有乙個master執行,hmaster在功能上主要負責table和region的管理工作:

管理使用者對錶的增、刪、改、查操作

管理hregionserver的負載均衡,調整region分布

在region split後,負責新region的分配

在hregionserver停機後,負責失效hregionserver 上的regions遷移

2. hregionserver

hregionserver主要負責響應使用者i/o請求,向hdfs檔案系統中讀寫資料,是hbase中最核心的模組。hregionserver內部管理了一系列hregion物件,每個hregion對應了table中的乙個region,hregion中由多個hstore組成。每個hstore對應了table中的乙個列族(column family)的儲存,可以看出每個列族其實就是乙個集中的儲存單元,因此最好將具備共同io特性的列放在乙個列族中,這樣最高效。

hstore儲存是hbase儲存的核心了,其中由兩部分組成,一部分是memstore,一部分是storefiles。memstore是sorted memory buffer,使用者寫入的資料首先會放入memstore,當memstore滿了以後會flush成乙個storefile(底層實現是hfile),當storefile檔案數量增長到一定閾值,會觸發compact合併操作,將多個storefiles合併成乙個storefile,合併過程中會進行版本合併和資料刪除,因此可以看出hbase其實只有增加資料,所有的更新和刪除操作都是在後續的compact過程中進行的,這使得使用者的寫操作只要進入記憶體中就可以立即返回,保證了hbase i/o的高效能。當storefiles compact後,會逐步形成越來越大的storefile,當單個storefile大小超過一定閾值後,會觸發split操作,同時把當前region split成2個region,父region會下線,新split出的2個孩子region會被hmaster分配到相應的hregionserver上,使得原先1個region的壓力得以分流到2個region上。

3. zookeeper

zookeeper quorum中除了儲存了-root-表的位址和hmaster的位址,hregionserver也會把自己以ephemeral方式註冊到zookeeper中,使得hmaster可以隨時感知到各個hregionserver的健康狀態。此外,zookeeper也避免了hmaster的單點問題。

1. 讀流程

hbase把各個region的位置資訊儲存在乙個特殊的表中,這個表叫meta table。zookeeper裡面儲存了這個meta table的位置資訊。hbase的讀流程如下:

2. 寫流程

HBase學習之路 全文鏈結

hbase學習之路 一 hbase基礎介紹 hbase學習之路 二 hbase集群安裝 hbase學習之路 三 hbase集群shell操作 hbase學習之路 四 hbase的api操作 hbase學習之路 五 mapreduce操作hbase hbase學習之路 六 過濾器 hbase學習之路 ...

Hadoop學習筆記(四) HBase

hbase是乙個高可靠性 高效能 面向列 可伸縮的分布式儲存系統,它是google bigtable的開源實現,執行於hdfs檔案系統之上,利用mapreduce處理資料,使用zookeeper作為協同服務,因此可以容錯地儲存海量稀疏的資料。海量資料儲存,方便擴充套件 快速的隨機訪問,獨特的設計使得...

Hbase學習之四 Hbase表設計案例

環境 虛擬機器 vmware 10 linux版本 centos 6.5 x86 64 客戶端 xshell4 ftp xftp4 jdk8 hadoop 2.6.5 hbase 0.98.12.1 hadoop2 hbase中表的設計 主要是將原來的關係解開 問題 例子 表設計一 表設計二 這是乙...