Apache HBase 物理存儲架構

物理存儲架構

整體結構

在這裏插入圖片描述
Table中的所有行都按照row key的字典序排列。
Table 在行的方向上分割爲多個Hregion。
在這裏插入圖片描述
region按大小分割的(默認10G),每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閾值的時候,Hregion就會等分會兩個新的Hregion。當table中的行不斷增多,就會有越來越多的Hregion。
在這裏插入圖片描述
Hregion是Hbase中分佈式存儲和負載均衡的最小單元。最小單元就表示不同的Hregion可以分佈在不同的HRegion server上。但一個Hregion是不會拆分到多個server上的。
在這裏插入圖片描述
HRegion雖然是負載均衡的最小單元,但並不是物理存儲的最小單元。
事實上,HRegion由一個或者多個Store組成,每個store保存一個column family。

每個Strore又由一個memStore和0至多個StoreFile組成。如上圖
在這裏插入圖片描述
在這裏插入圖片描述

STORE FILE & HFILE結構

StoreFile以HFile格式保存在HDFS上。

附:HFile的格式爲:
在這裏插入圖片描述
首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他數據塊的起始點。

File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。
Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點。

Data Block是HBase I/O的基本單元,爲了提高效率,HRegionServer中有基於LRU的Block Cache機制。每個Data塊的大小可以在創建一個Table的時候通過參數指定,大號的Block有利於順序Scan,小號Block利於隨機查詢。 每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞。

HFile裏面的每個KeyValue對就是一個簡單的byte數組。但是這個byte數組裏麪包含了很多項,並且有固定的結構。我們來看看裏面的具體結構:
在這裏插入圖片描述
開始是兩個固定長度的數值,分別表示Key的長度和Value的長度。

緊接着是Key,開始是固定長度的數值,表示RowKey的長度,緊接着是 RowKey,然後是固定長度的數值,表示Family的長度,然後是Family,接着是Qualifier(限定符),然後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這麼複雜的結構,就是純粹的二進制數據了。

HFile分爲六個部分:

  1. Data Block 段–保存表中的數據,這部分可以被壓縮
  2. Meta Block 段 (可選的)–保存用戶自定義的kv對,可以被壓縮。
  3. File Info 段–Hfile的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。
  4. Data Block Index 段–Data Block的索引。每條索引的key是被索引的block的第一條記錄的key。
  5. Meta Block Index段 (可選的)–Meta Block的索引。
  6. Trailer–這一段是定長的。保存了每一段的偏移量,讀取一個HFile時,會首先讀取Trailer,Trailer保存了每個段的起始位置(段的Magic Number用來做安全check),然後,DataBlock Index會被讀取到內存中,這樣,當檢索某個key時,不需要掃描整個HFile,而只需從內存中找到key所在的block,通過一次磁盤io將整個 block讀取到內存中,再找到需要的key。DataBlock Index採用LRU機制淘汰。
  7. HFile的Data Block,Meta
    Block通常採用壓縮方式存儲,壓縮之後可以大大減少網絡IO和磁盤IO,隨之而來的開銷當然是需要花費cpu進行壓縮和解壓縮。
    目標Hfile的壓縮支持兩種方式:Gzip,Lzo。

Memstore與storefile

一個region由多個store組成,每個store包含一個列族的所有數據
Store包括位於內存的memstore和位於硬盤的storefile
寫操作先寫入memstore,當memstore中的數據量達到某個閾值,Hregionserver啓動flashcache進程寫入storefile,每次寫入形成單獨一個storefile,輸出多個storefile後,當storefile數量達到閾值時,將多個合併成一個大的storefile。
當storefile大小超過一定閾值後,會把當前的region分割成兩個,並由Hmaster分配給相應的region服務器,實現負載均衡
客戶端檢索數據時,先在memstore找,找不到再找storefile

HLog(WAL log)

WAL 意爲Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging),類似mysql中的binlog,用來 做災難恢復時用,Hlog記錄數據的所有變更,一旦數據修改,就可以從log中進行恢復。

每個Region Server維護一個Hlog,而不是每個Region一個。這樣不同region(來自不同table)的日誌會混在一起,這樣做的目的是不斷追加單個文件相對於同時寫多個文件而言,可以減少磁盤尋址次數,因此可以提高對table的寫性能。帶來的麻煩是,如果一臺region server下線,爲了恢復其上的region,需要將region server上的log進行拆分,然後分發到其它region server上進行恢復。
HLog文件就是一個普通的Hadoop Sequence File:

HLog Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是”寫入時間”,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。
HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue,可參見上文描述。

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