动态

详情 返回 返回

【趙渝強老師】HBase的物理存儲結構 - 动态 详情

HBase的存儲結構分為邏輯存儲結構與物理存儲結構,並且HBase通過邏輯存儲結構來管理物理存儲結構。而最終物理存儲對應的文件又是存儲在HDFS之上。而HBase的物理存儲結構主要包括StoreFile、HFile和HLog日誌。視頻講解如下:
https://www.bilibili.com/video/BV1T3BrYcE8a/?aid=113529894410...

一、 數據文件HFile

HBase會定時刷新MemStore中的數據從而生成StoreFile。Store File底層又是以HFile的格式保存在HDFS上。因此從根本上説,HBase的物理存儲結構指的是HFile。視頻講解如下:
https://www.bilibili.com/video/BV1CKz8YZE6K/?aid=113558952089...

通過下面的方式可以查看員工表emp所對應的HFile。

(1)執行HDFS命令查看錶emp對應的HDFS目錄。

hdfs dfs -lsr /hbase/data/default/emp

# 輸出的信息如下:
/hbase/data/default/emp/.tabledesc
/hbase/data/default/emp/.tabledesc/.tableinfo.0000000001
/hbase/data/default/emp/.tmp
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/.regioninfo
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info/da157b802d4f41849363fda1956926bd
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/money
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/money/ba4e83b1887144d588f71cfec7a437c3

(2)可以emp表上info列族的數據信息。

hbase hfile -p -f \
/hbase/data/default/emp/459580d88e589ba8194336a7c578876f/info/da157b802d4f41849363fda1956926bd

# 輸出的信息如下:
K: 7369/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 20
K: 7369/info:ename/1649559894497/Put/vlen=5/seqid=4 V: SMITH
K: 7369/info:hiredate/1649559894497/Put/vlen=10/seqid=4 V: 1980/12/17
K: 7369/info:job/1649559894497/Put/vlen=5/seqid=4 V: CLERK
K: 7369/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7902
K: 7499/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 30
K: 7499/info:ename/1649559894497/Put/vlen=5/seqid=4 V: ALLEN
K: 7499/info:hiredate/1649559894497/Put/vlen=9/seqid=4 V: 1981/2/20
K: 7499/info:job/1649559894497/Put/vlen=8/seqid=4 V: SALESMAN
K: 7499/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7698
K: 7521/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 30
K: 7521/info:ename/1649559894497/Put/vlen=4/seqid=4 V: WARD
K: 7521/info:hiredate/1649559894497/Put/vlen=9/seqid=4 V: 1981/2/22
K: 7521/info:job/1649559894497/Put/vlen=8/seqid=4 V: SALESMAN
K: 7521/info:mgr/1649559894497/Put/vlen=4/seqid=4 V: 7698
K: 7566/info:deptno/1649559894497/Put/vlen=2/seqid=4 V: 20
K: 7566/info:ename/1649559894497/Put/vlen=5/seqid=4 V: JONES
K: 7566/info:hiredate/1649559894497/Put/vlen=8/seqid=4 V: 1981/4/2
......

從上面輸出的信息可以看出,HFile是一個Key-Value格式的數據存儲文件,並最終以二進制的形式存儲在了HDFS上。一個Store File對應着一個HFile。HFile的格式如下圖所示。
image.png

從HFile的格式可以看出,HFile分為了以下六個部分:

  • Data塊:該塊保存了表中的數據,並且這部分可以被壓縮以節約HFile所佔用的存儲空間。
  • Meta塊:該塊保存了用户自定義的Key-Value數據。與Data塊一樣也可以被壓縮,但區別是Meta塊不是必須存在。
  • File Info塊:HBase使用File Info塊來存儲HFile的元信息,且這一部分的元信息是不能被壓縮的。HBase也允許用户利用File Info塊來存儲自定義的元信息數據。
  • Data Index塊:該塊包含了Data塊的索引信息。Data塊中的每一條索引信息都會被記錄到Data Index塊的Key中。
  • Meta Index塊:該塊包含了Meta塊的索引信息。
  • Trailer塊:Trailer塊保存了一個塊的偏移量的地址,這裏的塊包括:Data塊、Meta塊 、File Info塊、Data Index塊和Meta Index塊。讀取一個HFile的數據時,HBase會首先讀取Trailer中的信息以確定每一個塊的位置。
提示:HFile文件是不定長的,其中長度固定的只有其中的兩塊:Trailer和File Info。其中Trailer中有指針指向其他數據塊的起始點;而File Info記錄了HFile文件的一些元信息。在Data Index和Meta 塊中則記錄了每個數據塊和元數據塊的起始位置。另外,HFile的Data塊和Meta塊通常採用壓縮方式存儲,壓縮之後可以大大減少網絡I/O和磁盤I/O,隨之而來的開銷則是需要花費CPU進行壓縮和解壓縮。

二、 預寫日誌文件HLog

HBase採用預寫日誌的方式寫入數據。預寫日誌意為Write Ahead Log,簡稱WAL。它類似Oracle數據庫中的Redo log或者MySQL中的Binlog。HBase會將WAL日誌保存到HLog日誌文件中,Hlog文件將記錄數據的所有變更。一旦數據丟失或者損壞,HBase就可以從HLog中進行恢復。

視頻講解如下:

https://www.bilibili.com/video/BV1CmzEYcEWU/?aid=113570025052...

提示:HLog與Region Server相對應,即:每個Region Server只維護一個HLog。換句話説,同一個Region Server上的Region會使用同一個HLog。這樣不同Region的WAL日誌會混在一起。這樣做的優點是可以減少磁盤尋址次數,從而可以提高對錶的寫性能;但是缺點是如果一台Region Server出現故障宕機並下線,為了在其他Region Server上執行恢復則需要要HLog進行拆分,然後分發到其它Region Server上進行恢復,這將增加HBase恢復時的複雜度。

在默認情況下,HLog都被保存到了HDFS的/hbase/WALs/下;而在HDFS的/hbase/oldWALs目錄下保存的是已經過期的WAL日誌。既然HLog保存了HDFS上,因此可以直接使用相關的命令來查看它。操作命令如下:

(1)使用HDFS命令查看目錄/hbase/WALs/。

hdfs dfs -lsr /hbase/WALs/

# 輸出的信息如下:
drwxr-xr-x ......
/hbase/WALs/localhost,16020,1649679358560
-rw-r--r-- ......
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.1649682968518
-rw-r--r-- ......
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.meta.1649682968557.meta

(2)使用HBase提供的命令查看HLog日誌的內容。

hbase wal -j \
/hbase/WALs/localhost,16020,1649679358560/localhost%2C16020%2C1649679358560.1649682968518

# 輸出的信息如下:
......
position: 600, {
    "sequence": "4",
    "region": "d6def4cd3110ca597ad6057936e2b898",
    "actions": [{
        "qualifier": "ename",
        "vlen": 4,
        "row": "7839",
        "family": "info",
        "value": "KING",
        "timestamp": "1649684058161",
        "total_size_sum": "88"
    }],
    "table": {
        "name": [101, 109, 112],
        "nameAsString": "emp",
        "namespace": [100, 101, 102, 97, 117, 108, 116],
        "namespaceAsString": "default",
        "qualifier": [101, 109, 112],
        "qualifierAsString": "emp",
        "systemTable": false,
        "hashCode": 100552
    }
}
edit heap size: 128
......
提示:從HLog日誌中的action可以看出,客户端往列族info的ename列上插入了一個數據,即:KING。

三、 HBase寫數據流程

在瞭解到了HBase的數據文件和預寫日誌文件後,便可以討論HBase寫數據的流程。與Oracle和MySQL類似,HBase在寫入數據的時候也是先寫入日誌。只要預寫日誌WAL寫入成功,客户端寫入數據就成功,如下圖所示。
image.png

當HBase的客户端發出一個寫操作請求時,也就是執行put操作,HBase進行處理的第一步是將數據寫入HBase的WAL中。WAL文件是順序寫入的,也就是所有新寫入的日誌會被寫到WAL文件的末尾。當日志被成功寫入WAL後,HBase將數據寫入MemStore。如果此時MemStore出現了問題,寫入的數據是會丟失的。這時候WAL就可以被用來恢復尚未寫入HBase中的數據。當MemStore中的數據達到一定的量級後,HBase會執行Flush的操作將內存中的數據一次性地寫入HFile中。

視頻講解如下:
https://www.bilibili.com/video/BV1H3UdY9EsZ/?aid=113524475042...

提示:當HBase執行Flush操作將內存中的數據寫入HFile數據文件後,便可以清空WAL的預寫日誌。但是在生產環境中,一般建議保留所有的WAL日誌。這樣做的目的就是為了當HFile數據文件丟失或者損壞後,可以使用WAL日誌來進行數據的恢復。
user avatar greatsql 头像 kongxudexiaoxiongmao 头像 alluxio_com 头像 menglihuaxiangbian 头像
点赞 4 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.