hbase 二進位制資料寫入 Hbase的儲存

2021-10-13 03:20:51 字數 2560 閱讀 8050

hbase中的每張表都通過行鍵按照一定的範圍被分割成多個子表(hregion),預設乙個hregion超過256m就要被分割成兩個,由hregionserver管理,管理哪些hregion由hmaster分配。

hregionserver訪問乙個子表時,會建立乙個hregion物件,然後對錶的每個列族(column family)建立乙個store例項,每個store都會有0個或多個storefile與之對應,每個storefile都會對應乙個hfile, hfile就是實際的儲存檔案。因此,乙個hregion有多少個列族就有多少個store。另外,每個hregion還擁有乙個memstore例項。memstore儲存在記憶體中,storefile儲存在hdfs上。

region雖然是分布式儲存的最小單元,但並不是儲存的最小單元。region由乙個或者多個store組成,每個store儲存乙個columns family;每個store又由乙個memstore和0至多個storefile組成,storefile包含hfile;memstore儲存在記憶體中,storefile儲存在hdfs上。

hbase是基於bigtable的面向列的分布式儲存系統,其儲存設計是基於memtable / sstable設計的,主要分為兩部分,一部分為記憶體中的memstore (memtable),另外一部分為磁碟(這裡是hdfs)上的hfile (sstable)。還有就是儲存wal的log,主要實現類為hlog.

本質上memstore就是乙個記憶體裡放著乙個儲存key/value的map,當memstore(預設64mb)寫滿之後,會開始刷磁碟操作。

hbase儲存在hdfs上的主要包含兩種檔案型別:

1.hfile, hbase中keyvalue資料的儲存格式,hfile是hadoop的二進位制格式檔案,實際上storefile就是對hfile做了輕量級包裝,即storefile底層就是hfile

2. hlog file,hbase中wal(write ahead log) 的儲存格式,物理上是hadoop的sequence file

hfile結構:

data block:儲存表中的資料,這部分可以被壓縮

meta block:(可選)儲存使用者自定義的kv對,可以被壓縮。

file info :hfile的meta元資訊,不被壓縮,定長。

data block index :data block的索引。每個data塊的起始點。

meta block index:(可選的)meta block的索引,meta塊的起始點。

trailer: 定長。儲存了每一段的偏移量,讀取乙個hfile時,會首先讀取trailer,trailer有指標指向其他資料塊的起始點,儲存了每個段的起始位置(段的magic number用來做安全check),然後,datablock index會被讀取到記憶體中,這樣,當檢索某個key時,不需要掃瞄整個hfile,而只需從記憶體中找到key所在的block,通過一次磁碟io將整個block讀取到記憶體中,再找到需要的key。datablock index採用lru機制淘汰。

hfile的data block,meta block通常採用壓縮方式儲存。data block是hbase i/o的基本單元,為了提高效率,hregionserver中有基於lru的block cache機制。每個data塊的大小可以在建立乙個table的時候通過引數指定,大號的block有利於順序scan,小號block利於隨機查詢。每個data塊除了開頭的magic以外就是乙個個keyvalue對拼接而成, magic內容就是一些隨機數字,目的是防止資料損壞。

hfile中的key-value結構

hfile中的每個key-value對就是乙個簡單的byte陣列。但這個byte陣列包含了很多項資訊,並含有固定的結構。(有點類似資料流)

開始是兩個長度固定的數值,分別表示key的長度和value的長度。緊接著是key,開始是固定長度的數值,表示rowkey的長度,緊接著是rowkey,然後是固定長度的數值,表示family的長度,然後是family(列族),接著是qualifier(小列),然後是兩個固定長度的數值,表示time stamp和key type(put/delete)。value部分則相對簡單,是純粹的二進位制資料。

hbase 為每個值維護了多級索引,即:

hbase寫資料流程

a)  client發起了乙個htable.put(put)請求給hregionserver

b)  hregionserver會將請求匹配到某個具體的hregion上面

c)  決定是否寫wal log。wal log檔案是乙個標準的hadoop sequencefile,檔案中儲存了hlogkey,這些keys包含了和實際資料對應的序列號,主要用於崩潰恢復。

d)put資料儲存到memstore中,同時檢查memstore狀態,如果滿了,則觸發flush to disk請求。

e)  hregionserver處理flush to disk的請求,將資料寫成hfile檔案並存到hdfs上,並且儲存最後寫入的資料序列號,這樣就可以知道哪些資料已經存入了永久儲存的hdfs中。

由於不同的列族會共享region,所以有可能出現,乙個列族已經有1000萬行,而另外乙個才100行。當乙個要求region分割的時候,會導致100行的列會同樣分布到多個region中。所以,一般建議不要設定多個列族。

二進位制檔案寫入

被二進位制檔案寫入困擾了2天之後終於寫出來 先把 貼上,明天補說明 imports system imports system.io imports system.text imports microsoft.visualbasic public sub a1 byval mystr as stri...

操作二進位制寫入二進

操作二進位制 寫入二進位制 1 宣告變數 sqlite3 stmt stat 2 把sql語句解析到stat結構中去 sqlite3 prepare 3 繫結替換 sqlite3 bind blob 4 儲存到資料庫 int result sqlite3 step 5 釋放stat結構 sqlite...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...