1. 程式人生 > >HBase學習總結(4):HBase的工作原理

HBase學習總結(4):HBase的工作原理

一、切分和分配大表
HBase中的表是由行和列組成的。HBase中的表可能達到數十億行和數百萬列。每個表的大小可能達到TB級,有時甚至PB級。這些表會切分成小一點兒的資料單位,然後分配到多臺伺服器上。這些小一點兒的資料單位叫region。託管region的伺服器叫RegionServer。一張表由多個小一點的region組成,如圖1所示。
這裡寫圖片描述
圖1 多個小一點的region組成一張表
RegionServer和HDFS DataNode典型情況下並列配置在同一物理硬體上,如圖2所示。RegionServer本質上是HDFS客戶端,在上面儲存/訪問資料。主(master)程序分配region給RegionServer,每個RegionServer一般託管多個region。
這裡寫圖片描述


圖2 RegionServer和DataNode典型情況下並列配置在同一臺主機上
考慮到基礎資料儲存在HDFS上,所有客戶端都可以在一個名稱空間下訪問。所有RegionServer都可以訪問檔案系統裡同一個檔案,因此RegionServer可以託管任何region,如圖3所示。通過DataNode和RegionServer並列配置,理論上RegionServer可以把本地DataNode作為主要DataNode進行讀寫操作。
這裡寫圖片描述
圖3 RegionServer託管region的示意圖
單個region大小由hbase-site.xml檔案裡的配置引數HBase.hregion.max.filesize決定,當一個region大小變得大於該值時,它會切分成兩個region。

二、如何找到region
當一個region分配給RegionServer時,客戶端應用如何知道它的位置?
HBase中有兩個特殊的表,-ROOT-和.META.,用來查詢各種表的region位置在哪裡。-ROOT-和.META.也會切分成region,其中,-ROOT-永遠不會切分超過一個region,.META.和其他表一樣可以按需切分成許多region。
當客戶端應用要訪問某行時,它先找-ROOT-表,查詢什麼地方可以找到負責某行的region。-ROOT-指向.META.表的region去尋找答案。.META.表由入口地址組成,客戶端應用使用這個入口地址判斷哪一個RegionServer託管待查詢的region。這個查詢過程就像是一個3層分散式B+樹(如圖4所示),-ROOT-表是B+樹的-ROOT-節點,.META. region是-ROOT-節點的葉子,使用者表的region是.META. region的葉子。
這裡寫圖片描述


圖4 -ROOT-、.META.和使用者表的B+樹檢視
在圖4中,-ROOT-表只包含了一個region,託管在RegionServer RS1上;.META.表包含了3個region,託管在RS1、RS2和RS3上面;使用者表T1和T2分別包含3個和4個region,分別在RS1、RS2和RS3上面。
這裡寫圖片描述
圖5 HBase中的表分佈在各個RegionServer上
如圖5所示,RegionServer 1(RS1)託管使用者表T1的region R1和.META.表的region M2;RegionServer 2(RS2)託管使用者表的region R2、R3和.META.表的region M1;RegionServer 3(RS3)只託管了-ROOT-。

三、如何找到-ROOT-表
一個叫做ZooKeeper的系統提供了HBase系統的入口點。ZooKeeper是一種集中服務,用來維護配置資訊、命名服務、提供分散式同步和提供分組服務等。這是一種高可用的、可靠的分散式配置服務。
客戶端與HBase系統的互動分幾個步驟,ZooKeeper是入口點。整個互動過程如圖6所示。
這裡寫圖片描述
圖6 客戶端與HBase系統的互動過程
從圖6可以看出,互動步驟為:
第一步:客戶端詢問ZooKeeper,-ROOT-在哪裡?
第二步:ZooKeeper回覆客戶端,-ROOT-在RegionServer RS1上面。
第三步:客戶端詢問在RS1上的-ROOT-表,哪一個.META. region可以找到表T1裡的行00007?
第四步:RS1上的-ROOT-表回覆客戶端,在RegionServer RS3上的.META. region M2可以找到。
第五步:客戶端詢問RS3上的.META. region M2,在哪一個region上可以找到表T1裡的行00007以及哪一個RegionServer為它提供服務?
第六步:RS3上的.META. region M2回覆客戶端,資料在RegionServer RS3上面的region T1R3上。
第七步:客戶端發訊息給RS3上面的region T1R3,要求讀取行00007。
第八步:RS3上面的region T1R3將資料返回給客戶端。

本人微信公眾號:zhouzxi,請掃描以下二維碼:
這裡寫圖片描述