其他更多java基礎文章:
java基礎學習(目錄)
HBase框架
HBase內建有zookeeper,但一般我們會有其他的Zookeeper叢集來監管master和regionserver,Zookeeper通過選舉,保證任何時候,叢集中只有一個活躍的HMaster,HMaster與HRegionServer 啟動時會向ZooKeeper註冊,儲存所有HRegion的定址入口,實時監控HRegionserver的上線和下線資訊。並實時通知給HMaster,儲存HBase的schema和table後設資料,預設情況下,HBase 管理ZooKeeper 例項,Zookeeper的引入使得HMaster不再是單點故障。一般情況下會啟動兩個HMaster,非Active的HMaster會定期的和Active HMaster通訊以獲取其最新狀態,從而保證它是實時更新的,因而如果啟動了多個HMaster反而增加了Active HMaster的負擔。一個RegionServer可以包含多個HRegion,每個RegionServer維護一個HLog,和多個HFiles以及其對應的MemStore。RegionServer執行於DataNode上,數量可以與DatNode數量一致。
HBase重要概念
HMaster
- 監控RegionServer
- 處理RegionServer故障轉移
- 處理後設資料的變更
- 處理region的分配或移除
- 在空閒時間進行資料的負載均衡
- 通過Zookeeper釋出自己的位置給客戶端
Write-Ahead logs
HBase的修改記錄,當對HBase讀寫資料的時候,資料不是直接寫進磁碟,它會在記憶體中保留一段時間(時間以及資料量閾值可以設定)。如果機器突然原地爆炸,把資料儲存在記憶體中會引起資料丟失,為了解決這個問題,資料會先寫在一個叫做Write-Ahead logfile的檔案中,然後再寫入記憶體中。所以在系統出現故障的時候,資料可以通過這個日誌檔案重建。
RegionServer
- 負責儲存HBase的實際資料
- 處理分配給它的Region
- 重新整理快取到HDFS
- 維護HLog
- 執行壓縮
- 負責處理Region分片
Region
Hbase表的分片,HBase表會根據RowKey值被切分成不同的region儲存在RegionServer中,在一個RegionServer中可以有多個不同的region
HFile
這是在磁碟上儲存原始資料的實際的物理檔案,是實際的儲存檔案。
Store
HFile儲存在Store中,一個Store對應HBase表中的一個列族
MemStore
顧名思義,就是記憶體儲存,位於記憶體中,用來儲存當前的資料操作,所以當資料儲存在WAL中之後,RegsionServer會在記憶體中儲存鍵值對。
Zookeeper
HMaster與HRegionServer 啟動時會向ZooKeeper註冊,儲存所有HRegion的定址入口,實時監控HRegionserver的上線和下線資訊。並實時通知給HMaster,儲存HBase的schema和table後設資料,預設情況下,HBase 管理ZooKeeper 例項,Zookeeper的引入使得HMaster不再是單點故障。一般情況下會啟動兩個HMaster,非Active的HMaster會定期的和Active HMaster通訊以獲取其最新狀態,從而保證它是實時更新的,因而如果啟動了多個HMaster反而增加了Active HMaster的負擔。
HBase讀寫流程
HBase讀資料流程
-
HRegionServer儲存著meta表以及表資料,要訪問表資料,首先Client先去訪問zookeeper,從zookeeper裡面獲取meta表所在的位置資訊,即找到這個meta表在哪個HRegionServer上儲存著。
-
接著Client通過剛才獲取到的HRegionServer的IP來訪問Meta表所在的HRegionServer,從而讀取到Meta,進而獲取到Meta表中存放的後設資料。
-
Client通過後設資料中儲存的資訊,訪問對應的HRegionServer,然後掃描所在HRegionServer的Memstore和Storefile來查詢資料。
-
最後HRegionServer把查詢到的資料響應給Client。
HBase寫資料流程
-
Client也是先訪問zookeeper,找到Meta表,並獲取Meta表後設資料。確定當前將要寫入的資料所對應的HRegion和HRegionServer伺服器。
-
Client向該HRegionServer伺服器發起寫入資料請求,然後HRegionServer收到請求並響應。
-
Client先把資料寫入到HLog,以防止資料丟失。然後將資料寫入到Memstore。如果HLog和Memstore均寫入成功,則這條資料寫入成功。
-
- 如果Memstore達到閾值,會把Memstore中的資料flush到Storefile中。
- 當Storefile越來越多,會觸發Compact合併操作,把過多的Storefile合併成一個大的Storefile。
- 當Storefile越來越大,Region也會越來越大,達到閾值後,會觸發Split操作,將Region一分為二。