在
HBase里的HRegion
里,談過,HRegion是按照表名+開始/結束主鍵,即表名+主鍵范圍來區分的。由於主鍵范圍是連續的,所以一般用開始主鍵就可以表示相應的HRegion了。
不過,因為我們有合並和分隔操作,此時,如果正好在執行這些操作的過程中出現死機,那么就可能存在多份表名和開始主鍵相同的數據,這樣的話,只有光靠開始主鍵就不夠了,這就需要通過HBase的元數據信息來區分哪一份才是正確的數據文件。為此,為了區分這樣的情況,每個HRegion都有一個'regionId'來標識它的唯一性。
所以一個HRegion的表達符,最終是: 表名+開始主鍵+唯一Id,即tablename+startkey+regionId。
我們可以用這個識別符來區分不同的HRegion,這些數據就是元數據(META),而元數據本身也是被保存在HRegion里面的,所以,我們稱呼這個表為元數據表(META表),即META Table,里面保存的就是HRegion標識符和實際HRegion服務器的映射關系。
元數據表也會增長,並且可能被分割為幾個HRegion,為了定位這些HRegion,我們采用一個根數據表(ROOT表),即ROOT Table,它保存了所有元數據表的位置,而跟數據表是不能被分割的,永遠只保存在一個HRegion。
在HBase啟動的時候,主服務器先去掃描根數據表,因為這個表只會有一個HRegion,所有這個HRegion的名字是被寫死的。當然要把跟數據表分配到一個HRegion服務器中需要一定的時間。
當根數據表被分配好之后,主服務器就會掃描根數據表,獲取元數據表的名字和位置,然后把元數據表分配到不同的HRegion服務器中。最后就是掃描元數據表,找到所有HRegion區域的信息,把它們分配給不同的HRegion服務器。
主服務器在內存中保存着當前活躍的HRegion服務器的數據,因此如果主服務器死機,整個系統也就無法訪問了,這時服務器的信息也就沒有必要保存到文件里面了。
元數據和跟數據表的每一行都包含一個列簇(info列簇):
info:regioninfo包含了一個串行化的HRegionInfo對象
info:server保存了一個字符串,是服務器的地址HServerAddress.toString()
info:startcode是一個長整型的數字字符串,它是在HRegion服務器啟動的時候傳給主服務器的,讓主服務器確定這個HRegion服務器的信息有沒有更改。
因此,當一個客戶端拿到根數據表地址以后,就沒有必要再連接主服務器了,主服務器發負載相對就小了很多。它只會處理超時的HRegion服務器,並在啟動的時候掃描根數據表和元數據表,以及返回根數據表的HRegion服務器地址。
META表,相當於ROOT表來說,存儲更多。一個單個的META表能夠在Rgion中包含所有的信息,能夠詳細到如此地步。
假設,把ROOT表當做一級目錄,則META表是詳細的一級目錄。
總結
ROOT表可以看作是一張簡表,簡單的信息,記錄不是很多,但ROOT表記錄了META的信息。
META表可以看作是一張詳表,記錄了所有HRegion的信息。ROOT表也記錄了HRegion表的信息,但沒META表記錄詳細。
理解了么,各博友們。~