hbase的讀寫過程:node
hbase的架構:緩存
Hbase真實數據
hbase真實數據存儲在hdfs上,經過配置文件的hbase.rootdir屬性可知,文件在/user/hbase/下
hdfs dfs -ls /user/hbase
Found 8 items
drwxr-xr-x - root supergroup 0 2019-05-30 10:05 /user/hbase/.tmp
drwxr-xr-x - root supergroup 0 2019-05-30 11:11 /user/hbase/MasterProcWALs
drwxr-xr-x - root supergroup 0 2019-05-30 10:05 /user/hbase/WALs
drwxr-xr-x - root supergroup 0 2019-05-27 18:49 /user/hbase/archive
drwxr-xr-x - root supergroup 0 2019-05-27 18:11 /user/hbase/data
-rw-r--r-- 3 root supergroup 42 2019-05-27 14:33 /user/hbase/hbase.id
-rw-r--r-- 3 root supergroup 7 2019-05-27 14:33 /user/hbase/hbase.version
drwxr-xr-x - root supergroup 0 2019-05-30 11:16 /user/hbase/oldWALs
.tmp
當對錶作建立或者刪除操做的時候,會將表move 到該 tmp 目錄下,而後再去作處理操做。
MasterProcWALS
記錄建立表等DDL操做時的一些事務信息,用於處理如 HMaster 中斷致使的 DDL 沒法執行、回滾等問題
WALS
屬於hbase的預寫日誌(write-ahead-logs),記錄Hbase在數據寫入時候的數據信息。數據寫入過程當中是先寫入到WAL中,再寫入到memstore。當發生 RegionServer 宕機重啓後,RS 會讀取 HDFS中的 WAL 進行 REPLAY 回放從而實現故障恢復。從數據安全的角度,建議開啓 WAL
archive
HBase 在作 Split或者 compact 操做完成以後,會將 HFile 先移到archive 目錄中,而後將以前的hfile刪除掉,該目錄由 HMaster 上的一個定時任務按期去清理。
data
真實數據文件HFile,HFile是經過memestore刷下來的.
hbase.id
序列化文件,標識hbase集羣的惟一id號,是一個 uuid。
hbase.version
序列化文件,標識hbase集羣的版本號。
oldWALs
存放舊的被回收的WAL文件安全
命名空間目錄
hdfs dfs -ls /user/hbase/data
Found 2 items
drwxr-xr-x - root supergroup 0 2019-05-30 11:43 /user/hbase/data/default
drwxr-xr-x - root supergroup 0 2019-05-27 14:33 /user/hbase/data/hbase
表級目錄
hdfs dfs -ls -R /user/hbase/data/default/t1
drwxr-xr-x /user/hbase/data/default/t1/.tabledesc
drwxr-xr-x /user/hbase/data/default/t1/.tmp
drwxr-xr-x /user/hbase/data/default/t1/68e61220e866d62a27d0cdeb0c1eed83 #HFile服務器
HFile、WAL和Memstore
HFile
HBase實際的存儲文件功能是由HFile類實現的,它被專門建立以達到一個目的:有效的存儲HBase數據。架構
HFile數據都在前面的data裏:oop
WAL
regionserver會將數據保存到menstore(內存)中,直到積攢足夠多的數據再將其刷寫到磁盤上,這樣能夠避免建立不少小文件。可是存儲在內存中的數據是不穩定的。例如,在服務器斷電的狀況下數據可能會丟失。
一個常見的解決方法是預寫日誌(WAL):每次更新操做都會寫入日誌,只有寫入成功纔會通知客戶端操做成功,而後服務器能夠按需自由的批量處理或聚合內存中的數據性能
優化手段:
hbase數據是先寫入到WAL而後寫入到memstore,因此有的優化,建議你們關閉WAL
可是,關閉WAL以後,寫入數據時若是發生宕機,那麼數據確定會丟失
並且,關閉WAL對於寫入性能的提高,其實不是很明顯.WAL其實就相似於hadoop中的edits文件優化
Hbase元數據:
# 列出hbase名字空間的表
hbase(main):023:0> list_namespace_tables 'hbase'
TABLE
meta
namespace
2 row(s) in 0.0140 secondsui
Hbase數據定位過程:
Hbase在數據讀取的時候,須要先查詢hbase:meta表,經過這個表到指定的regionserver獲取region信息並進行數據的讀取。詳細過程以下:
1.client經過zookeeper獲取管理hbase:meta表的regionserver
2.zookeeper返回oldboy-node103
3.向oldboy-node103獲取hbase:meta表的的數據信息
4.查找到t1的row1所對應的region是被oldboy-node102所管理
5.將信息返回給客戶端
6.向oldboy-node102獲取對應region的數據
一旦知道區域(region)的位置,Hbase會緩存此次查詢信息。以後客戶端能夠經過緩存信息定位所需的數據位置,而不用再次查找hbase:meta。spa
讀取過程:
區域(region)和列族(column family)是以文件夾形式存在於HDFS的,因此在讀取的時候:
若是肯定了區域位置,就直接從指定的region目錄讀取數據。
若是一個列族文件夾中的文件有多個StoreFile,客戶端會經過布隆過濾器篩選出可能存在數據的塊,對這些塊進行數據的查找。
若是此行有多個列族的話,就會在全部的列族文件夾中同時進行以上操做
寫入過程:從上圖能夠看出,除了真實數據(StoreFile)外,Hbase還處理一種HLog文件,此文件稱爲預寫日誌(WAL)。用戶發起put請求時,也會先定位數據位置,而後:第一步,決定數據是否須要寫到由HLog實現的預寫日誌(WAL)中,預寫日誌(WAL)存儲了序列號和實際數據,因此在服務器崩潰時能夠回滾到還未持久化的數據。一旦數據被寫入到WAL中,數據會被放到MemStore內存數據中。同時regionserver會檢查MemStore是否已經寫滿,若是滿了,就會被刷寫(flush)到磁盤中。會把數據寫成HDFS中的新StoreFile,同時也會保存最後寫入的序列號,系統就知道那些數據被持久化了。當Storefile 愈來愈多,會觸發Compact 合併操做,把過多的 Storefile 合併成一個Storefile。當Storefile 愈來愈大,Region 也會愈來愈大。達到閾值後,會觸發Split 切割region操做。