溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HBase ROOT和META表結(jié)構(gòu)是怎樣的

發(fā)布時(shí)間:2021-12-09 13:49:38 來源:億速云 閱讀:284 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“HBase ROOT和META表結(jié)構(gòu)是怎樣的”,在日常操作中,相信很多人在HBase ROOT和META表結(jié)構(gòu)是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”HBase ROOT和META表結(jié)構(gòu)是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

在此基礎(chǔ)上我們引入兩個(gè)特殊的概念:-ROOT-和.META.。這是什么?它們是HBase的兩張內(nèi)置表,從存儲(chǔ)結(jié)構(gòu)和操作方法的角度來說,它們和其他HBase的表沒有任何區(qū)別,你可以認(rèn)為這就是兩張普通的表,對(duì)于普通表的操作對(duì)它們都適用。它們與眾不同的地方是HBase用它們來存貯一個(gè)重要的系統(tǒng)信息——Region的分布情況以及每個(gè)Region的詳細(xì)信息。

好了,既然我們前面說到-ROOT-.META.可以被看作是兩張普通的表,那么它們和其他表一樣就應(yīng)該有自己的表結(jié)構(gòu)。沒錯(cuò),它們有自己的表結(jié)構(gòu),并且這兩張表的表結(jié)構(gòu)是相同的,在分析源碼之后我將這個(gè)表結(jié)構(gòu)大致的畫了出來:

-ROOT-和.META.表結(jié)構(gòu)

HBase ROOT和META表結(jié)構(gòu)是怎樣的

我們來仔細(xì)分析一下這個(gè)結(jié)構(gòu),每條Row記錄了一個(gè)Region的信息。

首先是RowKey,RowKey由三部分組成:TableName, StartKey 和 TimeStamp。RowKey存儲(chǔ)的內(nèi)容我們又稱之為Region的Name。哦,還記得嗎?我們在前面的文章中提到的,用來存放Region的文件夾的名字是RegionName的Hash值,因?yàn)镽egionName可能包含某些非法字符?,F(xiàn)在你應(yīng)該知道為什么RegionName會(huì)包含非法字符了吧,因?yàn)镾tartKey是被允許包含任何值的。將組成RowKey的三個(gè)部分用逗號(hào)連接就構(gòu)成了整個(gè)RowKey,這里TimeStamp使用十進(jìn)制的數(shù)字字符串來表示的。這里有一個(gè)RowKey的例子: 

Java代碼          HBase ROOT和META表結(jié)構(gòu)是怎樣的  

  1. Table1,RK10000,12345678  

 然后是表中最主要的Family:info,info里面包含三個(gè)Column:regioninfo, server, serverstartcode。其中regioninfo就是Region的詳細(xì)信息,包括StartKey, EndKey 以及每個(gè)Family的信息等等。server存儲(chǔ)的就是管理這個(gè)Region的RegionServer的地址。

所以當(dāng)Region被拆分、合并或者重新分配的時(shí)候,都需要來修改這張表的內(nèi)容。

到目前為止我們已經(jīng)學(xué)習(xí)了必須的背景知識(shí),下面我們要正式開始介紹Client端尋找RegionServer的整個(gè)過程。我打算用一個(gè)假想的例子來學(xué)習(xí)這個(gè)過程,因此我先構(gòu)建了假想的-ROOT-表和.META.表。

我們先來看.META.表,假設(shè)HBase中只有兩張用戶表:Table1和Table2,Table1非常大,被劃分成了很多Region,因此在.META.表中有很多條Row用來記錄這些Region。而Table2很小,只是被劃分成了兩個(gè)Region,因此在.META.中只有兩條Row用來記錄。這個(gè)表的內(nèi)容看上去是這個(gè)樣子的: 

.META.行記錄結(jié)構(gòu)

HBase ROOT和META表結(jié)構(gòu)是怎樣的

這么一來Client端就需要先去訪問-ROOT-表。所以需要知道管理-ROOT-表的RegionServer的地址。這個(gè)地址被存在ZooKeeper中。默認(rèn)的路徑是: 

Java代碼          HBase ROOT和META表結(jié)構(gòu)是怎樣的  

  1. /hbase/root-region-server  

 等等,如果-ROOT-表太大了,要被分成多個(gè)Region怎么辦?嘿嘿,HBase認(rèn)為-ROOT-表不會(huì)大到那個(gè)程度,因此-ROOT-只會(huì)有一個(gè)Region,這個(gè)Region的信息也是被存在HBase內(nèi)部的。 

現(xiàn)在讓我們從頭來過,我們要查詢Table2中RowKey是RK10000的數(shù)據(jù)。整個(gè)路由過程的主要代碼在org.apache.hadoop.hbase.client.HConnectionManager.TableServers中: 

Java代碼          HBase ROOT和META表結(jié)構(gòu)是怎樣的  

  1. private HRegionLocation locateRegion(final byte[] tableName,  

  2.         final byte[] row, boolean useCache) throws IOException {  

  3.     if (tableName == null || tableName.length == 0) {  

  4.         throw new IllegalArgumentException("table name cannot be null or zero length");  

  5.     }  

  6.     if (Bytes.equals(tableName, ROOT_TABLE_NAME)) {  

  7.         synchronized (rootRegionLock) {  

  8.             // This block guards against two threads trying to find the root  

  9.             // region at the same time. One will go do the find while the  

  10.             // second waits. The second thread will not do find.  

  11.             if (!useCache || rootRegionLocation == null) {  

  12.                 this.rootRegionLocation = locateRootRegion();  

  13.             }  

  14.             return this.rootRegionLocation;  

  15.         }  

  16.     } else if (Bytes.equals(tableName, META_TABLE_NAME)) {  

  17.         return locateRegionInMeta(ROOT_TABLE_NAME, tableName, row, useCache, metaRegionLock);  

  18.     } else {  

  19.         // Region not in the cache – have to go to the meta RS  

  20.         return locateRegionInMeta(META_TABLE_NAME, tableName, row, useCache, userRegionLock);  

  21.     }  

  22. }  

 這是一個(gè)遞歸調(diào)用的過程: 

Java代碼             

  1. 獲取Table2,RowKey為RK10000的RegionServer => 獲取.META.,RowKey為Table2,RK10000, 99999999999999的RegionServer => 獲取-ROOT-,RowKey為.META.,Table2,RK10000,99999999999999,99999999999999的RegionServer => 獲取-ROOT-的RegionServer => 從ZooKeeper得到-ROOT-的RegionServer => 從-ROOT-表中查到RowKey最接近(小于) .META.,Table2,RK10000,99999999999999,99999999999999的一條Row,并得到.META.的RegionServer => 從.META.表中查到RowKey最接近(小于)Table2,RK10000, 99999999999999的一條Row,并得到Table2的RegionServer => 從Table2中查到RK10000的Row  

 到此為止Client完成了路由RegionServer的整個(gè)過程,在整個(gè)過程中使用了添加“99999999999999”后綴并查找最接近(小于)RowKey的方法。對(duì)于這個(gè)方法大家可以仔細(xì)揣摩一下,并不是很難理解。

最后要提醒大家注意兩件事情:

1. 在整個(gè)路由過程中并沒有涉及到MasterServer,也就是說HBase日常的數(shù)據(jù)操作并不需要MasterServer,不會(huì)造成MasterServer的負(fù)擔(dān)。

2. Client端并不會(huì)每次數(shù)據(jù)操作都做這整個(gè)路由過程,很多數(shù)據(jù)都會(huì)被Cache起來。至于如何Cache,則不在本文的討論范圍之內(nèi)。

到此,關(guān)于“HBase ROOT和META表結(jié)構(gòu)是怎樣的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI