hbase的讀寫過程

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操做。

相關文章
相關標籤/搜索