自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入理解HBase的系統(tǒng)架構(gòu)

大數(shù)據(jù)
物理上來說,HBase是由三種類型的服務(wù)器以主從模式構(gòu)成的。這三種服務(wù)器分別是:Region server,HBase HMaster,ZooKeeper。其中Region server負(fù)責(zé)數(shù)據(jù)的讀寫服務(wù)。用戶通過溝通Region server來實現(xiàn)對數(shù)據(jù)的訪問。

HBase的構(gòu)成

物理上來說,HBase是由三種類型的服務(wù)器以主從模式構(gòu)成的。這三種服務(wù)器分別是:Region server,HBase HMaster,ZooKeeper。

其中Region server負(fù)責(zé)數(shù)據(jù)的讀寫服務(wù)。用戶通過溝通Region server來實現(xiàn)對數(shù)據(jù)的訪問。

HBase HMaster負(fù)責(zé)Region的分配及數(shù)據(jù)庫的創(chuàng)建和刪除等操作。

ZooKeeper作為HDFS的一部分,負(fù)責(zé)維護(hù)集群的狀態(tài)(某臺服務(wù)器是否在線,服務(wù)器之間數(shù)據(jù)的同步操作及master的選舉等)。

另外,Hadoop DataNode負(fù)責(zé)存儲所有Region Server所管理的數(shù)據(jù)。HBase中的所有數(shù)據(jù)都是以HDFS文件的形式存儲的。出于使Region server所管理的數(shù)據(jù)更加本地化的考慮,Region server是根據(jù)DataNode分布的。HBase的數(shù)據(jù)在寫入的時候都存儲在本地。但當(dāng)某一個region被移除或被重新分配的時候,就可能產(chǎn)生數(shù)據(jù)不在本地的情況。這種情況只有在所謂的compaction之后才能解決。

NameNode負(fù)責(zé)維護(hù)構(gòu)成文件的所有物理數(shù)據(jù)塊的元信息(metadata)。

HBase結(jié)構(gòu)如下圖所示:

 

Regions

HBase中的表是根據(jù)row key的值水平分割成所謂的region的。一個region包含表中所有row key位于region的起始鍵值和結(jié)束鍵值之間的行。集群中負(fù)責(zé)管理Region的結(jié)點(diǎn)叫做Region server。Region server負(fù)責(zé)數(shù)據(jù)的讀寫。每一個Region server大約可以管理1000個region。Region的結(jié)構(gòu)如下圖所示:

 

HBase的HMaster

HMaster負(fù)責(zé)region的分配,數(shù)據(jù)庫的創(chuàng)建和刪除操作。

具體來說,HMaster的職責(zé)包括:

  • 調(diào)控Region server的工作
  • 在集群啟動的時候分配region,根據(jù)恢復(fù)服務(wù)或者負(fù)載均衡的需要重新分配region。
  • 監(jiān)控集群中的Region server的工作狀態(tài)。(通過監(jiān)聽zookeeper對于ephemeral node狀態(tài)的通知)。
  • 管理數(shù)據(jù)庫
  • 提供創(chuàng)建,刪除或者更新表格的接口。

HMaster的工作如下圖所示:

 

ZooKeeper

HBase利用ZooKeeper維護(hù)集群中服務(wù)器的狀態(tài)并協(xié)調(diào)分布式系統(tǒng)的工作。ZooKeeper維護(hù)服務(wù)器是否存活,是否可訪問的狀態(tài)并提供服務(wù)器故障/宕機(jī)的通知。ZooKeeper同時還使用一致性算法來保證服務(wù)器之間的同步。同時也負(fù)責(zé)Master選舉的工作。需要注意的是要保證良好的一致性及順利的Master選舉,集群中的服務(wù)器數(shù)目必須是奇數(shù)。例如三臺或五臺。

ZooKeeper的工作如下圖所示:

 

HBase各組成部分之間的合作

ZooKeeper用來協(xié)調(diào)分布式系統(tǒng)的成員之間共享的狀態(tài)信息。Region Server及HMaster也與ZooKeeper連接。ZooKeeper通過心跳信息為活躍的連接維持相應(yīng)的ephemeral node。如下圖所示:

 

每一個Region server都在ZooKeeper中創(chuàng)建相應(yīng)的ephemeral node。HMaster通過監(jiān)控這些ephemeral node的狀態(tài)來發(fā)現(xiàn)正常工作的或發(fā)生故障下線的Region server。HMaster之間通過互相競爭創(chuàng)建ephemeral node進(jìn)行Master選舉。ZooKeeper會選出區(qū)中***個創(chuàng)建成功的作為唯一一個活躍的HMaster?;钴S的HMaster向ZooKeeper發(fā)送心跳信息來表明自己在線的狀態(tài)。不活躍的HMaster則監(jiān)聽活躍HMaster的狀態(tài),并在活躍HMaster發(fā)生故障下線之后重新選舉,從而實現(xiàn)了HBase的高可用性。

如果Region server或者HMaster不能成功向ZooKeeper發(fā)送心跳信息,則其與ZooKeeper的連接超時之后與之相應(yīng)的ephemeral node就會被刪除。監(jiān)聽ZooKeeper狀態(tài)的其他節(jié)點(diǎn)就會得到相應(yīng)node不存在的信息,從而進(jìn)行相應(yīng)的處理?;钴S的HMaster監(jiān)聽Region Server的信息,并在其下線后重新分配Region server來恢復(fù)相應(yīng)的服務(wù)。不活躍的HMaster監(jiān)聽活躍HMaster的信息,并在起下線后重新選出活躍的HMaster進(jìn)行服務(wù)。

HBase的***次讀寫

HBase中有一個特殊的起目錄作用的表格,稱為META table。META table中保存集群region的地址信息。ZooKeeper中會保存META table的位置。

當(dāng)用戶***次想HBase中進(jìn)行讀或?qū)懖僮鲿r,以下步驟將被執(zhí)行:

  • 客戶從ZooKeeper中得到保存META table的Region server的信息。
  • 客戶向該Region server查詢負(fù)責(zé)管理自己想要訪問的row key的所在的region的Region server的地址??蛻魰彺孢@一信息以及META table所在位置的信息。
  • 客戶與負(fù)責(zé)其row所在region的Region Server通信,實現(xiàn)對該行的讀寫操作。

在未來的讀寫操作中,客戶會根據(jù)緩存尋找相應(yīng)的Region server地址。除非該Region server不再可達(dá)。這時客戶會重新訪問META table并更新緩存。這一過程如下圖所示:

 

HBase的META table

  • META table中保存了HBase中所有region的信息。
  • META table的格式類似于B tree。
  • META table的結(jié)構(gòu)如下:
  • 鍵:region的起始鍵,region id。
  • 值:Region server

如下圖所示:

 

Region Server的組成

運(yùn)行在HDFS DataNode上的Region server包含如下幾個部分:

  • WAL:既Write Ahead Log。WAL是HDFS分布式文件系統(tǒng)中的一個文件。WAL用來存儲尚未寫入***性存儲區(qū)中的新數(shù)據(jù)。WAL也用來在服務(wù)器發(fā)生故障時進(jìn)行數(shù)據(jù)恢復(fù)。
  • Block Cache:Block cache是讀緩存。Block cache將經(jīng)常被讀的數(shù)據(jù)存儲在內(nèi)存中來提高讀取數(shù)據(jù)的效率。當(dāng)Block cache的空間被占滿后,其中被讀取頻率***的數(shù)據(jù)將會被殺出。
  • MemStore:MemStore是寫緩存。其中存儲了從WAL中寫入但尚未寫入硬盤的數(shù)據(jù)。MemStore中的數(shù)據(jù)在寫入硬盤之前會先進(jìn)行排序操作。每一個region中的每一個column family對應(yīng)一個MemStore。
  • Hfiles:Hfiles存在于硬盤上,根據(jù)排序號的鍵存儲數(shù)據(jù)行。

Region server的結(jié)構(gòu)如下圖所示:

 

HBase的寫操作步驟

步驟一

當(dāng)HBase的用戶發(fā)出一個PUT請求時(也就是HBase的寫請求),HBase進(jìn)行處理的***步是將數(shù)據(jù)寫入HBase的write-ahead log(WAL)中。

  • WAL文件是順序?qū)懭氲?,也就是所有新添加的?shù)據(jù)都被加入WAL文件的末尾。WAL文件存在硬盤上。
  • 當(dāng)server出現(xiàn)問題之后,WAL可以被用來恢復(fù)尚未寫入HBase中的數(shù)據(jù)(因為WAL是保存在硬盤上的)。

如下圖所示:

 

步驟二

當(dāng)數(shù)據(jù)被成功寫入WAL后,HBase將數(shù)據(jù)存入MemStore。這時HBase就會通知用戶PUT操作已經(jīng)成功了。

過程如下圖所示:

 

HBase的MemStore

Memstore存在于內(nèi)存中,其中存儲的是按鍵排好序的待寫入硬盤的數(shù)據(jù)。數(shù)據(jù)也是按鍵排好序?qū)懭際File中的。每一個Region中的每一個Column family對應(yīng)一個Memstore文件。因此對數(shù)據(jù)的更新也是對應(yīng)于每一個Column family。

如下圖所示:

 

HBase Region Flush

當(dāng)MemStore中積累了足夠多的數(shù)據(jù)之后,整個Memcache中的數(shù)據(jù)會被一次性寫入到HDFS里的一個新的HFile中。因此HDFS中一個Column family可能對應(yīng)多個HFile。這個HFile中包含了相應(yīng)的cell,或者說鍵值的實例。這些文件隨著MemStore中積累的對數(shù)據(jù)的操作被flush到硬盤上而創(chuàng)建。

需要注意的是,MemStore存儲在內(nèi)存中,這也是為什么HBase中Column family的數(shù)目有限制的原因。每一個Column family對應(yīng)一個MemStore,當(dāng)MemStore存滿之后,里面所積累的數(shù)據(jù)就會一次性flush到硬盤上。同時,為了使HDFS能夠知道當(dāng)前哪些數(shù)據(jù)已經(jīng)被存儲了,MemStore中還保存***一次寫操作的序號。

每個HFile中***的序號作為meta field存儲在其中,這個序號標(biāo)明了之前的數(shù)據(jù)向硬盤存儲的終止點(diǎn)和接下來繼續(xù)存儲的開始點(diǎn)。當(dāng)一個region啟動的時候,它會讀取每一個HFile中的序號來得知當(dāng)前region中***的操作序號是什么(***的序號)。

如下圖所示:

 

HFile

HBase中的鍵值數(shù)據(jù)對存儲在HFile中。上面已經(jīng)說過,當(dāng)MemStore中積累足夠多的數(shù)據(jù)的時候就會將其中的數(shù)據(jù)整個寫入到HDFS中的一個新的HFile中。因為MemStore中的數(shù)據(jù)已經(jīng)按照鍵排好序,所以這是一個順序?qū)懙倪^程。由于順序?qū)懖僮鞅苊饬舜疟P大量尋址的過程,所以這一操作非常高效。

如下圖所示:

 

HFile的結(jié)構(gòu)

HFile中包含了一個多層索引系統(tǒng)。這個多層索引是的HBase可以在不讀取整個文件的情況下查找數(shù)據(jù)。這一多層索引類似于一個B+樹。

  • 鍵值對根據(jù)鍵大小升序排列。
  • 索引指向64KB大小的數(shù)據(jù)塊。
  • 每一個數(shù)據(jù)塊還有其相應(yīng)的葉索引(leaf-index)。
  • 每一個數(shù)據(jù)塊的***一個鍵作為中間索引(intermediate index)。
  • 根索引(root index)指向中間索引。

文件結(jié)尾指向meta block。因為meta block是在數(shù)據(jù)寫入硬盤操作的結(jié)尾寫入該文件中的。文件的結(jié)尾同時還包含一些別的信息。比如bloom filter及時間信息。Bloom filter可以幫助HBase加速數(shù)據(jù)查詢的速度。因為HBase可以利用Bloom filter跳過不包含當(dāng)前查詢的鍵的文件。時間信息則可以幫助HBase在查詢時跳過讀操作所期望的時間區(qū)域之外的文件。

如下圖所示:

 

HFile的索引

HFile的索引在HFile被打開時會被讀取到內(nèi)存中。這樣就可以保證數(shù)據(jù)檢索只需一次硬盤查詢操作。

如下圖所示:

 

HBase的讀合并(Read Merge)以及讀放大(Read amplification)

通過上面的論述,我們已經(jīng)知道了HBase中對應(yīng)于某一行數(shù)據(jù)的cell可能位于多個不同的文件或存儲介質(zhì)中。比如已經(jīng)存入硬盤的行位于硬盤上的HFile中,新加入或更新的數(shù)據(jù)位于內(nèi)存中的MemStore中,最近讀取過的數(shù)據(jù)則位于內(nèi)存中的Block cache中。所以當(dāng)我們讀取某一行的時候,為了返回相應(yīng)的行數(shù)據(jù),HBase需要根據(jù)Block cache,MemStore以及硬盤上的HFile中的數(shù)據(jù)進(jìn)行所謂的讀合并操作。

  • HBase會首先從Block cache(HBase的讀緩存)中尋找所需的數(shù)據(jù)。
  • 接下來,HBase會從MemStore中尋找數(shù)據(jù)。因為作為HBase的寫緩存,MemStore中包含了***版本的數(shù)據(jù)。
  • 如果HBase從Block cache和MemStore中沒有找到行所對應(yīng)的cell所有的數(shù)據(jù),系統(tǒng)會接著根據(jù)索引和bloom filter從相應(yīng)的HFile中讀取目標(biāo)行的cell的數(shù)據(jù)。

如下圖所示:

 

這里一個需要注意的地方是所謂的讀放大效應(yīng)(Read amplification)。根據(jù)前文所說,一個MemStore對應(yīng)的數(shù)據(jù)可能存儲于多個不同的HFile中(由于多次的flush),因此在進(jìn)行讀操作的時候,HBase可能需要讀取多個HFile來獲取想要的數(shù)據(jù)。這會影響HBase的性能表現(xiàn)。

如下圖所示:

 

HBase的Compaction

Minor Compaction

HBase會自動選取一些較小的HFile進(jìn)行合并,并將結(jié)果寫入幾個較大的HFile中。這一過程稱為Minor compaction。Minor compaction通過Merge sort的形式將較小的文件合并為較大的文件,從而減少了存儲的HFile的數(shù)量,提升HBase的性能。

這一過程如下圖所示:

 

Major Compaction

所謂Major Compaction指的是HBase將對應(yīng)于某一個Column family的所有HFile重新整理并合并為一個HFile,并在這一過程中刪除已經(jīng)刪除或過期的cell,更新現(xiàn)有cell的值。這一操作大大提升讀的效率。但是因為Major compaction需要重新整理所有的HFile并寫入一個HFile,這一過程包含大量的硬盤I/O操作以及網(wǎng)絡(luò)數(shù)據(jù)通信。這一過程也稱為寫放大(Write amplification)。在Major compaction進(jìn)行的過程中,當(dāng)前Region基本是處于不可訪問的狀態(tài)。

Major compaction可以配置在規(guī)定的時間自動運(yùn)行。為避免影響業(yè)務(wù),Major compaction一般安排在夜間或周末進(jìn)行。

需要注意的一點(diǎn)事,Major compaction會將當(dāng)前Region所服務(wù)的所有遠(yuǎn)程數(shù)據(jù)下載到本地Region server上。這些遠(yuǎn)程數(shù)據(jù)可能由于服務(wù)器故障或者負(fù)載均衡等原因而存儲在于遠(yuǎn)端服務(wù)器上。

這一過程如下圖所示:

 

Region的分割(Region split)

首先我們快速復(fù)習(xí)一下Region:

  • HBase中的表格可以根據(jù)行鍵水平分割為一個或幾個region。每個region中包含了一段處于某一起始鍵值和終止鍵值之間的連續(xù)的行鍵。
  • 每一個region的默認(rèn)大小為1GB。
  • 相應(yīng)的Region server負(fù)責(zé)向客戶提供訪問某一region中的數(shù)據(jù)的服務(wù)。
  • 每一個Region server能夠管理大約1000個region(這些region可能來自同一個表格,也可能來自不同的表格)。

如下圖所示:

 

每一個表格最初都對應(yīng)于一個region。隨著region中數(shù)據(jù)量的增加,region會被分割成兩個子region。每一個子region中存儲原來一半的數(shù)據(jù)。同時Region server會通知HMaster這一分割。出于負(fù)載均衡的原因,HMaster可能會將新產(chǎn)生的region分配給其他的Region server管理(這也就導(dǎo)致了Region server服務(wù)遠(yuǎn)端數(shù)據(jù)的情況的產(chǎn)生)。

如下圖所示:

 

讀操作的負(fù)載均衡(Read Load Balancing)

Region的分割最初是在Region server本地發(fā)生的。但是出于負(fù)載均衡的原因,HMaster可能會將新產(chǎn)生的region分配給其他的Region server進(jìn)行管理。這也就導(dǎo)致了Region server管理存儲在遠(yuǎn)端服務(wù)器上的region情況的產(chǎn)生。這一情況會持續(xù)至下一次Major compaction之前。如上文所示,Major compaction會將任何不在本地的數(shù)據(jù)下載至本地。

也就是說,HBase中的數(shù)據(jù)在寫入時總是存儲在本地的。但是隨著region的重新分配(由于負(fù)載均衡或數(shù)據(jù)恢復(fù)),數(shù)據(jù)相對于Region server不再一定是本地的。這種情況會在Major compaction后得到解決。

如下圖所示:

 

HDFS的數(shù)據(jù)備份(Data Replication)

HDFS中所有的數(shù)據(jù)讀寫操作都是針對主節(jié)點(diǎn)進(jìn)行的。HDFS會自動備份WAL和HFile。HBase以來HDFS來提供可靠的安全的數(shù)據(jù)存儲。當(dāng)數(shù)據(jù)被寫入HDFS本地時,另外兩份備份數(shù)據(jù)會分別存儲在另外兩臺服務(wù)器上。

如下圖所示:

 

HBase的異常恢復(fù)(Crash Recovery)

WAL文件和HFile都存儲于硬盤上且存在備份,因此恢復(fù)它們是非常容易的。那么HBase如何恢復(fù)位于內(nèi)存中的MemStore呢?

 

當(dāng)Region server宕機(jī)的時候,其所管理的region在這一故障被發(fā)現(xiàn)并修復(fù)之前是不可訪問的。ZooKeeper負(fù)責(zé)根據(jù)服務(wù)器的心跳信息來監(jiān)控服務(wù)器的工作狀態(tài)。當(dāng)某一服務(wù)器下線之后,ZooKeeper會發(fā)送該服務(wù)器下線的通知。HMaster收到這一通知之后會進(jìn)行恢復(fù)操作。

HMaster會首先將宕機(jī)的Region server所管理的region分配給其他仍在工作的活躍的Region server。然后HMaster會將該服務(wù)器的WAL分割并分別分配給相應(yīng)的新分配的Region server進(jìn)行存儲。新的Region server會讀取并順序執(zhí)行WAL中的數(shù)據(jù)操作,從而重新創(chuàng)建相應(yīng)的MemStore。

如下圖所示:

 

數(shù)據(jù)恢復(fù)(Data Recovery)

WAL文件之中存儲了一系列數(shù)據(jù)操作。每一個操作對應(yīng)WAL中的一行。新的操作會順序?qū)懺赪AL文件的末尾。

那么當(dāng)MemStore中存儲的數(shù)據(jù)因為某種原因丟失之后應(yīng)該如何恢復(fù)呢?HBase以來WAL對其進(jìn)行恢復(fù)。相應(yīng)的Region server會順序讀取WAL并執(zhí)行其中的操作。這些數(shù)據(jù)被存入內(nèi)存中當(dāng)前的MemStore并排序。最終當(dāng)MemStore存滿之后,這些數(shù)據(jù)被flush到硬盤上。

如下圖所示:

 

Apache HBase的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 強(qiáng)一致性模型
  • 當(dāng)一個寫操作得到確認(rèn)時,所有的用戶都將讀到同一個值。
  • 可靠的自動擴(kuò)展
  • 當(dāng)region中的數(shù)據(jù)太多時會自動分割。
  • 使用HDFS分布存儲并備份數(shù)據(jù)。
  • 內(nèi)置的恢復(fù)功能
  • 使用WAL進(jìn)行數(shù)據(jù)恢復(fù)。
  • 與Hadoop集成良好
  • MapReduce在HBase上非常直觀。

缺點(diǎn)

  • WAL回復(fù)較慢。
  • 異常恢復(fù)復(fù)雜且低效。
  • 需要進(jìn)行占用大量資源和大量I/O操作的Major compaction。
責(zé)任編輯:未麗燕 來源: 網(wǎng)絡(luò)大數(shù)據(jù)
相關(guān)推薦

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運(yùn)維

2022-01-14 12:28:18

架構(gòu)OpenFeign遠(yuǎn)程

2023-06-07 15:34:21

架構(gòu)層次結(jié)構(gòu)

2023-02-10 08:11:43

Linux系統(tǒng)調(diào)用

2022-09-01 08:08:35

Android移動操作系統(tǒng)

2021-09-03 09:55:43

架構(gòu)Yarn內(nèi)部

2018-12-27 12:34:42

HadoopHDFS分布式系統(tǒng)

2019-03-18 09:50:44

Nginx架構(gòu)服務(wù)器

2019-09-24 13:41:22

Hadoop面試分布式

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2023-01-16 18:32:15

架構(gòu)APNacos

2012-11-22 10:11:16

LispLisp教程

2021-04-25 10:45:59

Docker架構(gòu)Job

2020-09-23 10:00:26

Redis數(shù)據(jù)庫命令

2017-01-10 08:48:21

2019-06-25 10:32:19

UDP編程通信

2024-02-21 21:14:20

編程語言開發(fā)Golang

2013-09-22 14:57:19

AtWood
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號