-ROOT-表和.META.表詳解
HBase中有兩個特殊的表:-ROOT-和.META.。
由於HBase中的表可能非常大,故HBase會將表按行分成多個region,然後分配到多臺RegionServer上。資料訪問的整個流程如下圖所示:
注意兩點:
Client端在訪問資料的過程中並沒有涉及到Master節點,也就是說HBase日常的資料操作並不需要Master,不會造成Master的負擔。
並不是每次資料訪問都要執行上面的整個流程,因為很多資料都會被Cache起來。
從儲存結構和操作方法的角度來說,-ROOT-、.META.與其他表沒有任何區別。它們與眾不同的地方是HBase用它們來存貯一個重要的系統資訊
-ROOT-:記錄.META.表的Region資訊。
.META.:記錄使用者表的Region資訊。
其中-ROOT-表本身只會有一個region,這樣保證了只需要三次跳轉,就能定位到任意region.
1. META表結構
在 HBase Shell 裡對.META.表進行 scan 和 describe :
可以看出,.META.表的結構如下:
.META.表中每一行記錄了一個Region的資訊。
RowKey
RowKey就是Region Name,它的命名形式是TableName,StartKey,TimeStamp.Encoded.。
其中 Encoded 是TableName,StartKey,TimeStamp的md5值。例如:mytable,,1438832261249.ea2b47e1eba6dd9a7121315cdf0e4f67.
表名是mytable,StartKey為空,時間戳是1438832261249,前面三部分的md5是:$ echo -n “mytable,,1438832261249” | md5sum # -n選項表示不輸出換行符
ea2b47e1eba6dd9a7121315cdf0e4f67 -
Column Family
.META.表有兩個Column Family:info 和 historian。
其中info包含了三個Columnregioninfo:region的詳細資訊,包括StartKey、EndKey以及Table資訊等等。
server:管理該region的 RegionServer 的地址。
serverstartcode:RegionServer 開始託管該region的時間。
historian:用來追蹤一些region操作的,例如open、close、compact等。綜上,.META.表中儲存了所有使用者表的region資訊,在進行資料訪問時,它是必不可少的一個環節。當Region被拆分、合併或者重新分配的時候,都需要來修改這張表的內容 來保證訪問資料時能夠正確地定位region。
ROOT表結構
當用戶表特別大時,使用者表的region也會非常多。.META.表儲存了這些region資訊,也變得非常大,這時.META.自己也需要劃分成多個Region,託管到多個RegionServer上。
這時就出現了一個問題:當.META.被託管在多個RegionServer上,如何去定位.META.呢? HBase的做法是用另外一個表來記錄.META.的Region資訊,就和.META.記錄使用者表的Region資訊一樣,這個表就是-ROOT-表。
在 HBase Shell 裡對-ROOT-表進行 scan 和 describe
-ROOT-表的結構如下:
-ROOT-表除了沒有historian列族之外,-ROOT-表的結構與.META.表的結構是一樣的。另外,-ROOT-表的 RowKey 沒有采用時間戳,也沒有Encoded值,而是直接指定一個數字。
-ROOT-表永遠只有一個Region,也就只會存放在一臺RegionServer上。—— 在進行資料訪問時,需要知道管理-ROOT-表的RegionServer的地址。這個地址被存在 ZooKeeper 中。