.tableinfo文件在.tabledesc目錄裡面
region級文件
region級文件位於表目錄裡面。region級文件的目錄時一部分region名字的MD5散列值。
目錄/文件名 | 用途 |
---|---|
.regioninfo | 對應region的HRegionInfo實例反序列化的信息 |
recovered.edits | 存放臨時的拆分文件 |
- 在WAL回收時,任何未提交的修改都會被寫入到每個region的一個單獨的文件(splitlog)中。
- 將上述文件移動到臨時的recovered.edits文件中
- 若region被打開,region服務器將會看到需要恢復的文件,並放回其中對應的條目
一旦region超過了配置中region大小的最大值,region就需要拆分,其會創建一個對應的splits目錄,它被用來臨時存放兩個region相關的數據。如果拆分成功(通常這個過程持續幾秒或更短),之後它們會被移動到表目錄中,並形成兩個新的region,每個region代表原始值的一半。
當用戶看到region的目錄中:
- 沒有.tmp目錄,意味著還沒有進行過壓縮操作
- 沒有recovered.edits目錄,意味著WAL沒有進行過回放操作
region拆分
在拆分過程中,所有的步驟在ZooKeeper中都進行跟蹤,這使得一個服務器失效時,其他進程可以直到這個region的狀態。
region合併
存儲文件會被後臺的管理進程仔細的監控起來以確保它們處於控制值夏,隨著memstore的寫入會生成很多的磁盤文件,如果文件的數目達到閾值,合併過程將會把它們合併成數量更少,體積更大的文件。這個過程持續到這些文件超過配置的最大存儲文件大小,會觸發一個region拆分
壓縮合並有兩種,即minor和major。
- minor合併負責重寫最後生成的幾個文件到一個更大的文件中。
- major合併會將所有文件壓縮成一個單獨的文件,在執行壓縮檢查時,系統自動決定運行哪種合併。
minor合併可以處理的最大文件數量默認是10,用戶可以通過hbase.hstore.compaction.max來配置。 如果海沒有達到major合併的執行週期,系統會選擇minor合併執行。當minor合併包括所有的存儲文件,且所有文件均未達到設置的每次壓縮的最大文件數時,minor合併可能被提升成major合併。
HFile 格式
實際的存儲文件功能是由HFile類實現的,它被專門創建達到一個目的:有效的存儲HBase的數據。它們基於Hadoop的TFile類。HFile參考BigTable的SSTable和Hadoop的TFile實現,從HBase開始到現在,HFile經歷了三個版本,其中V2在0.92引入,V3在0.98引入。這裡我們看下V1的格式。
這些文件是可變長度的,唯一固定的塊是File Info塊和Trailer塊。如上圖所示:
Trailer有指向其他塊的指針,它是在持久化數據到文件結束時寫入的,寫入後即確定其成為不可變的數據存儲文件。
Index塊記錄Data和Meta塊的偏移量。
Data和Meta塊實際上都是可選的,但是考慮到HBase如何使用數據文件,在存儲文件中用戶幾乎總能找到Data塊。
在HDFS中,文件的默認塊大小是64MB(現默認是128MB),這個是HFile默認塊大小的1024倍,因此HBase存儲文件的塊與Hadoop的塊之間並沒有匹配關係。事實上,這兩種塊類型之間根本沒有相關性。HBase把它的文件透明的存儲到文件系統中,而HDFS也使用塊來切分文件僅僅是一個巧合,並且HDFS並不知道HBase中存儲的是什麼。
下圖描述了邏輯上把一個單元格的數據存儲到一張表中,到實際存儲到HDFS的映射過程。
KeyValue格式
KeyValue類是HBase中數據存儲的核心,由keylength
、valuelength
、key
、value
四個部分組成。
其中Key又由Row Length
、Row、Column Family Length
、Column Family
、Column Qualifier
、Time Stamp
、Key Type
七部分組成。
KeyValue不會在塊之間拆分。例如,如果有一個8 MB的KeyValue,即使塊大小是64kb,這個KeyValue將作為一個連續塊讀取。
- KeyLength存儲Key的長度,佔4B;
- ValueLength存儲Value的長度,佔4B;
Key存儲具體的Cell數據
Key | 作用 |
---|---|
Row Length | 存儲rowkey的長度,佔2B (Bytes.SIZEOF_INT) |
Row | 存儲Rowkey實際內容,其大小為Row Length |
Column Family Length | 存儲列簇Column Family的長度,佔1B (Bytes.SIZEOF_BYTE) |
Column Family | 存儲Column Family實際內容,大小為Column Family Length |
Column Qualifier | 存儲Column Qualifier對應的數據 |
Time Stamp | 存儲時間戳Time Stamp,佔8B (Bytes.SIZEOF_LONG) |
Key Type | 存儲Key類型Key Type,佔1B ( Bytes.SIZEOF_BYTE),Type分為Put、Delete、DeleteColumn、DeleteFamilyVersion、DeleteFamily、Maximum、Minimum等類型,標記這個KeyValue的類型 |
由於Key中其它的字段佔用大小已經知道,並且知道整個Key的大小,因此沒有存儲Column Qualifier的大小。
Value存儲單元格Cell對應的實際的值Value
示例
對於Put: rowkey=row1, cf:attr1=value1
操作,Key對應關係如下:
key | value |
---|---|
rowlength | 4 |
row | row1 |
columnfamilylength | 2 |
columnfamily | cf |
columnqualifier | attr1 |
timestamp | server time of Put |
keytype | Put |
閱讀更多 中國智慧城市 的文章