hbase 的架構分析

mcxiaoracle發表於2022-09-18

hbase 架構分析:


大:一個表可以有上億行,上百萬列。

面向列:面向列簇的儲存和許可權控制,列簇獨立檢索。

稀疏:對於空(null)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏。

無模式(no Schema):每一行都有一個可以排序的主鍵和任意多的列,列可以根據需要動態增加,同一張表中不同的行可以有截然不同的列。

資料多版本:每個單元格中的資料可以有多個版本,預設情況下,版本號自動分配,版本號就是單元格插入時的時間戳。


資料型別單一:HBase中的資料都是位元組陣列,沒有型別。


HBase架構元件

Region Server:提供資料的讀寫服務,當客戶端訪問資料時,直接和Region Server通訊。

HBase Master:Region的分配,DDL操作(建立表,刪除表)。

Zookeeper:是HDFS的一部分,維護一個活躍的叢集狀態。


Hadoop DataNode儲存著Region Server管理的資料,所有HBase資料儲存在HDFS檔案系統中,

Region Server在HDFS DataNode中是可配置的,並使資料儲存靠近在它所需要的地方,就近服務,當往HBase寫資料時Local,但是當一個region被移動之後,HBase的資料就不是Local的,除非做了壓縮(compaction)操作。

NameNode維護物理資料塊的後設資料資訊。

HBase Table 透過rowkey range 的範圍被水平切分成多個Region,一個Region包含了所有的,在Region開始鍵和結束之內的行,Regions被分配到叢集的節點上,成為Region Servers,提供資料的讀寫服務,一個region server 可以服務1000個Region。


Region的分裂策略

egion中儲存的是一張表的資料,當region中的資料條數過多的時候,會直接影響查詢效率。當region過大的時候,region會拆分為兩個region,HMaster會將分裂的region分配到不同的region server上,這樣可以讓請求分散到不同的Region Server上,已達到負載均衡,這也是HBase的一個優點。


當region中最大的store大小超過某個閾值(hbase.hregion.max.filesize=10G)之後就會觸發切分,一個region等分為2個region。


但是在生產線上這種切分策略卻有相當大的弊端(切分策略對於大表和小表沒有明顯的區分):


閾值(hbase.hregion.max.filesize)設定較大對大表比較友好,但是小表就有可能不會觸發分裂,極端情況下可能就1個,形成熱點,這對業務來說並不是什麼好事。

如果設定較小則對小表友好,但一個大表就會在整個叢集產生大量的region,這對於叢集的管理、資源使用、failover來說都不是一件好事。



Compaction操作

指選取一些小的、相鄰的StoreFile將他們合併成一個更大的StoreFile,在這個過程中不會處理已經Deleted或Expired的Cell。一次 Minor Compaction 的結果是更少並且更大的StoreFile。



Zookeeper 協調器

??Zookeeper一般在分散式系統中的成員之間協調共享的狀態資訊,Region Server和活躍的HMaster透過會話連線到Zookeeper,Zookeeper維護短暫的階段,透過心跳機制用於活躍的會話。

有一個特殊的HBase目錄表叫做Meta表,它擁有Region在叢集中的位置資訊,Zookeeper儲存著Meta表的位置。


如下就是客戶端首次讀寫HBase 所發生的事情:

客戶端從Zookeeper的Meta表中獲取Region Server。

客戶端將查詢 META 伺服器,獲取它想訪問的相對應的Region Server 的行鍵,客戶端將這些資訊以及META表的位置資訊。

客戶端將從相應的Region Server獲取行。

META 表 叢集中所有Region的列表


META 表像是一個B樹

META 表結構為:

Key:region start key,region id

Values:Region Server

HBase Region 重新整理(Flush)

??當MemStore 積累到足夠的資料,則整個排序後的集合被寫到HDFS的新的HFile中,每個列簇使用多個HFiles,列簇包含真實的單元格,或者是鍵值對的例項,隨著KeyValue鍵值對在MemStores中編輯排序後,作為檔案重新整理到磁碟上。


??注意列簇是有數量限制的,每一個列族有一個MemStore,當MemStore滿了,則進行重新整理。它也會保持最後一次寫的序列號,這讓系統知道直到現在都有什麼已經被持久化了。


??最高的序列號作為一個meta field 儲存在HFile中,來顯示持久化在哪裡結束,在哪裡繼續。當一個region 啟動後,讀取序列號,最高的則作為新編輯的序列號。







https://blog.csdn.net/hujieliang123/article/details/123193751




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69949806/viewspace-2915157/,如需轉載,請註明出處,否則將追究法律責任。

相關文章