整體架構
- client負責訪問hbase,並維護cache
- zookeeper
負責master的主備切換;
負責監控RegionServer的狀態,將Region server的上線和下線信息實時通知給Master
存儲所有Region尋址入庫;
保存hbase的schema,包含有哪些table,每個table有哪些列簇 - master
負責分配region到不同的RegionServer,既RegionServer的負載均衡;
負責處理schema的更新請求 - RegionServer
維護master分配的region,負責對這些region的IO請求(讀寫);
切分比較大的region
存儲方式
- 一個table會按行分爲多個region,最開始只有一個region,在region變大之後,regionserver會對region進行切分;
- 一個region有多個store,每個store存儲一個列簇;store由一個在內存中的memstore和0到多個storefile組成。數據寫入時是寫入到memstore中,如果memstore超過了一定閾值,則會新開一個memstore,而原來的memstore則有單獨的進程寫到磁盤上。
- 每個storefile以HFile的格式保存到HDFS上。
- HFile由多個部分組成,其中比較重要的是DataBlock和DataBlockIndex(每條索引的key是被索引的block的第一條記錄的key)組成,在讀取一個HFile時,會先把DataBlockIndex加載到內存中,定位到具體的DataBlock段,然後再把此段加載到內存中
- HLog:每個Region Server維護一個Hlog,而不是每個Region一個。HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是”寫入時間”,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。HLog Sequece File的Value是Hbase的KeyValue對象,即對應HFile中的KeyValue
關鍵流程
- region定位
第一層是保存zookeeper裏面的文件,它持有root region的位置。
第二層root region是.META.表的第一個region其中保存了.META.z表其它region的位置。通過root region,我們就可以訪問.META.表的數據。
META.是第三層,它是一個特殊的表,保存了Hbase中所有數據表的region 位置信息。META.表每行保存一個region的位置信息,row key 採用表名+表的最後一樣編碼而成。保存了HRegionInfo(包含了startkey、endkey),服務器的信息 - 讀流程
獲取將要讀取Region的位置信息;
Client向HRegionServer發出讀請求。
HRegionServer先從MemStore讀取數據,如未找到,再從StoreFile中讀取。 - 寫流程
數據在更新時首先寫入Log(WAL log)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,並 且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成爲一個StoreFile。