HBase之功能細節
1.Region定位
在Google的BigTable體系中,tablet的存儲地址通過3層目錄結構來定位的,如圖所示:
注:tablet等同與HBase中的Region
圖釋說明:
(1)METADATATable
METADATATable是系統預定義的Table,當用戶自定義表格被拆分成多個tablet之后,METADATA Table用來存儲這些tablet的地址,在目錄層級中處于第3層
(2)Root tablet
METADATA表格在分布式存儲過程中也會被拆分成多個tablet,其中第一個tablet比較特殊,用來存儲其他tablet的地址,稱之為Roottablet,在目錄層級中處于第2層
(3)Chunbby file
用來存儲Roottablet的地址,在目錄結構中處于頂層
這樣,客戶端可通過Chubby file遍歷到任何tablet的地址
在HBase中:
Region的概念等同于tablet
.META.表格等同于METADATATable
而-ROOT-表格等同于Chunbby file
這樣,客戶端可通過-ROOT- Table遍歷到任何Region的地址,并把這些地址在本地進行緩存,以加快下次查詢效率
2.Region分配
在HBase中,MasterServer負責將Region分配給RegionServer
首先,看一下BigTable中tablet如何分配:
當master機器啟動的時候,它會處理如下事情:
(1)首先在Chunbby中獲取masterlock,在分布式部署中,系統中只能有一個master處于運行狀態,當其獲得master鎖之后,其他的master機器將會進入等待狀態
(2)master會掃描Chunbby目錄,以獲取處于運行狀態的table server(RegionServer)
(3)master會和每一臺tabletserver進行通信,來記錄哪些tablet已經成功分配
(4)master會掃描METADATA表格,如果發現有tablet不在已分配記錄中,則將其分配到合適的tablet server
在HBase中,是通過如下API來完成Region的分配過程:
(1)Master在啟動的時候,會去調用AssignmentManager類
(2)AssignmentManager通過查找.META.表格來獲取Region信息
(3)如果Region尚未分配,則調用LoadBalancerFactory將其分配,默認的分配器(DefaultLoadBalancer)會將該Region分配給一個隨機的RegionServer
(4)更新.META.表格信息
3.數據存儲
在HDFS中,HBase的數據存儲呈如下目錄結構:
|__
|__
|__
|__
在物理存儲上SSTable由多個Block塊組成,SSTable記錄了每個Block快的索引位置,并且在被訪問的時候將這些塊索引加載到內存,以便系統快速定位Block塊所在磁盤位置。
4.Region Serving
在Google的BigTable體系中,tablet會持久化存儲到GFS文件系統中,如圖:
圖釋說明:
(1)當有寫操作到達時,系統首先會將信息寫入到tablet log,然后把所提交的數據存儲在memtable上,這樣,tablet log就記錄了每次寫操作的日志信息以及操作的數據信息,當需要執行undo/redo操作式,可通過遍歷查找該tablet log來實現撤銷/恢復的功能。
寫操作提交之后,數據并沒有持久化存儲到本地硬盤上,而是放到了memtable里,memtable是存儲在內存當中的,當其大小達到一定上限之后,才持久化存儲到SSTable File中去,隨后進行數據的壓縮處理(參考5-數據壓縮)
(2)因為memtable也存儲了相關的數據信息,而且是寫操作提交后的最新信息,所以查詢操作的數據來源有兩方面,一方面是SSTable Files,另一方面是memtable。
(3)tablet恢復
當tablet數據需要恢復到歷史版本時,tablet server首先會查詢METADATA表格,從中獲取該tablet的元數據信息,包括:
存儲該tablet的SSTable文件
Tablet的恢復點(存儲在tabletlog中)
隨后,tablet server會把要恢復的相關記錄加載到內存,根據tablet log所記錄的操作日志來重新構建memtable
5.數據壓縮
數據壓縮主要有3中方式,分別是:
(1)Minor compaction:
當memtable的大小達到一定上限之后便會被系統凍結。此時,一個新的memtable將會創建,而被凍結的memtable將會持久化儲存到SSTable文件中去。
(2)Merging compaction:
每一個minor compaction都會生成一個SSTable文件,當minor compaction操作較多時, SSTable文件將會包含很多實體的歷史信息,造成數據冗余,解決辦法是系統會定期執行merging compaction,將相關SSTable存儲的實體進行合并,以保證實體信息處于最新版本,為查詢提供方便。
(3)Major compaction:
將所有的SSTable合并成一個SSTable稱之為major compaction,Major compaction通常用來回收邏輯上已被刪除的數據,以節省磁盤空間。