一、HBase讀數據流程
1.Client訪問Zookeeper,從ZK獲取-ROOT-表的位置信息,通過訪問-ROOT-表獲取.META.表的位置,然后確定數據所在的HRegion位置;
2.Client訪問HRegion所在的HRegionServer,通過HRegionServer獲取需要查找的數據;
3.Client到HRegion的中去查找數據,首先到MemStore中查找,查到直接返回;查不到就去ClockCache中查找,查到直接返回;再查不到就去StoreFile中讀數據,把讀到的數據存入BlockCache中再返回Client。
如圖:
二、HBase寫數據流程
1.Client通過Zookeeper調度獲取表的元數據信息;
2.Cilent通過rpc協議與RegionServer交互,通過-ROOT-表與.META.表找到對應的對應的Region;
3.將數據寫入HLog日志中,如出現意外可以同通過HLog恢復信息;
4.將數據寫入Region的MemStore中,當MemStore達到閾值開始溢寫,將其中的數據Flush成一個StoreFile;
5.MemStore不斷生成新的StoreFile,當StoreFile的數量到達閾值后會出發Compact合並操作,將多個StoreFile合並成一個StoreFile;
6.StoreFile文件會不斷增大,當達到閾值后會出發Split操作,把當前的Region且分為兩個新的Region。父Region會下線,兩個子Region會被HMaster分配到相應的RegionServer。
圖略、自己腦補一哈把~~
*********************************************************************************************
補充:1.由讀寫數據的流程可以發現,Region中的內存分為兩塊:MemStore(負責寫數據)、BlockCache(負責讀數據),這是HBase的一大特點——讀寫分離,這也是HBase讀寫速度極快的原因之一;
2.在HBase中,可以看出只有增添操作,所有的更新和刪除都是在后續的Compact合並歷程中進行的,這使得用戶的寫操作只有進入內存就可以立刻返回,實現了I/O的高性能。
*********************************************************************************************
三、-ROOT-表和.META.表的介紹
HBase用-ROOT-表記錄.META.表的位置信息(即元數據信息),而.META.表記錄了用戶表Region的位置信息。
為了定位.META.表中各個Region的位置信息,把.META.表中所有Region的元數據保存在-ROOT-表中,最后由Zookeeper記錄-Root-表的位置信息。
所以客戶端Client要先訪問ZK獲取-ROOT-表的位置,然后訪問-ROOT-表獲取.META.表的位置,最后根據.META.表中的信息確定用戶數據存放的位置。