1. 程式人生 > >-ROOT-表和.META.表詳解

-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包含了三個Column

regioninfo: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 中。