開源組件系列(7):分佈式結構化存儲(HBase)

目錄

(一)概述

(二)HBase數據模型

(三)HBase基本架構

(四)HBase內部原理

(五)HBase訪問方式


 

(一)概述

 

長期以來,傳統的關係型數據庫(Mysql)等因爲其易懂的關係模型、高效的查詢引擎和易用的查詢語言而被廣泛應用,但在一些互聯網應用場景中,數據量的膨脹非常快,基於關係型數據庫的方案很難滿足系統擴展的需求。同時,引入了分佈式文件系統HDFS之後,除了直接以文件形式保存的數據以外,還有大量的結構化和半結構化數據,這類數據通常需要支持更新操作,例如隨機插入和刪除,例如在Facebook上,用戶的評論內容是隨機的,但是評論的ID、評論人和評論對象是有序的,而且這種有序的數據是需要隨機插入和刪除操作的,這使得HDFS難以適應OLAP的場景。

爲了解決以上問題,HBase應運而生,作爲Google BigTable的開源實現,非常適合存儲海量的結構化或者半結構化數據。HBase具備以下優點:

1.極好的擴展性:隨着數據量的增加,架構支持水平擴展以滿足存儲需求;

2.弱化ACID需求:關係型數據庫的一個優點是支持ACID,但在HBase場景下,對事務的要求較低,可以選擇性的降低一些性能,強化查詢等性能;

3.良好的容錯性:HBase傾向於用較低的成本實現橫向擴展方案。

 

(二)HBase數據模型

 

與數據庫的Database和Table的概念類似,HBase將這兩項稱之爲namespace和table,一個namespace能夠包含多個table,HBase內置了兩個默認的namespace:

1.hbase:系統內建表,包括了namespace和meta表;

2.default:用戶建表時未指定namespace的表都創建在這裏。

HBase表有一系列行構成,每行數據都有一個rowkey,以及若干個column family構成,每個column family可以包含無限多的列。因此,可以將HBase看成一個有序多維映射表,也可以看作是一個key/value存儲系統,rowkey作爲key,其他部分是value。相關概念解釋如下:

1.rowkey:HBase表中的數據都是以rowkey作爲標識的,rowkey類似於關係型數據庫中的“主鍵”,每行數據都有一個rowkey,唯一標識該行,是定位數據的索引。同一張表內,rowkey是全局有序的。rowkey沒有數據類型,以字節數組(byte[])的形式保存。

2.column family:HBase表中的數據是按照column family組織的,每行數據擁有相同的column family,column family屬於schema的一部分,定義表結構時就需要指定好。column family是訪問控制的基本單元,同一個column family的數據再物理上會存儲在同一個文件內。

3.column qualifier:column family內部列標識,HBase每列數據可以通過family:qualifier來做唯一標識。Qualifier不屬於schema的一部分,可以動態制定,且每行數據可以有不同的schema。跟rowkey一樣,column qualifier也是沒有數據類型的,以字節數組(byte[])的形式保存。

4.cell:通過rowkey,column family + column qualifier可以唯一定位一個cell,內部保存了多個版本的數值,默認情況下,每個數值的版本號是寫入時間戳。C

5.timestamp:cell內部數據是多版本的,默認將寫入時間戳作爲版本號,用戶可以根據自己的業務需求設置版本號,timestamp的數據類型爲long類型。每個column family保留最大版本數可以單獨配置,默認是3,如果讀取數據時未指定版本號,HBase只會返回最新版本的數值。如果一個cell內部數據超過最大版本數,舊的版本數據會被自動刪除。

HBase的數據模型如下所示:

HBase是列簇式存儲引擎,數據在存儲介質中按照下圖所示形式保存:

HBase同一表中的數據是按照rowkey升序排列的,同一行中的不同列是按照column qualifier升序排列的,同一cell中的數值是按照版本號降序排列的,下圖是HBase表從邏輯視圖到物理視圖的映射關係:

HBase是列式存儲引擎嗎?

 

(三)HBase基本架構

 

爲了將數據表分佈到集羣中以提供並行讀寫服務,HBase按照rowkey將數據劃分成爲多個固定大小的有序分區,每個分區被稱爲一個“region”,這些region會被均衡地存在在不同的節點上。如果HBase是構建在HDFS之上的,那麼所有的region均會以文件的形式保存到HDFS上,以保證這些數據的高可靠存儲。

HBase採用了經典的master/slave架構,與HDFS不同的是,它的master與slave不直接互連,而是通過引入Zookeeper來讓兩類服務解耦,這使得Master變得完全無狀態,避免了master宕機導致的整個集羣不可用。HBase各個服務的功能如下:

HMaster:HMaster可以存在多個,主HMaster由Zookeeper動態選舉產生,當主HMaster出現故障後,系統可由Zookeeper動態選舉出新的HMaster來接管。HMaster主要負責協調RegionServer的均衡性和元信息的管理,爲用戶提供增刪改查的操作。

RegionServer:RegionServer負責單個Region的存儲和管理,例如文件的切分等,並與Client進行交互,處理讀寫請求。

Zookeeper:Zookeeper內部存儲着有關HBase的重要元信息和狀態信息,擔任着Master與RegionServer之間的服務協調角色,具體包括:集羣中只有一個Master、存儲Region的尋址入口、實時監控RegionServer的上線和下線信息、存儲HBase的schema和table元數據等功能。

Client;提供HBase的訪問接口,並與RegionServer交互讀寫數據,維護cache以加快對HBase的訪問。

 

(四)HBase內部原理

 

HBase是構建在HDFS之上的,利用HDFS的高可靠性存儲數據文件,以實現對Region定位、讀寫流程和文件管理等功能的實現。相關原理如下

1.Region定位

HBase支持put、get、delete和scan等基礎操作,所有操作的基礎是region定位:給定一個rowkey或者是rowkey區間,其基本步驟爲:客戶端與Zookeeper交互,查找hbase:meta系統表所在的RegionServer,隨後客戶端與RegionServer進行交互,獲取rowkey所在的RegionServer信息,執行該rowkey的相關操作。圖示流程如下:

2.RegionServer內部關鍵組件

RegionServer內部關鍵組件如下圖所示:

BlockCache:讀緩存,負責緩存頻繁讀取的數據,採用了LRU置換策略。

MemStore:寫緩存,負責暫時緩存未寫入磁盤的數據,並在寫入磁盤前對數據進行排序,每個region內的每個column family擁有一個MemStore。

HFile:一種支持多級索引的數據存儲格式,用戶保存HBase表中的實際數據,所有HFile均保存在HDFS中。

WAL:即Write Ahead Log,保存在HDFS上的日誌,用於保存那些未持久化到HDFS中的HBase數據,以便RegionServer宕機後恢復這些數據。

3.RegionServer讀寫操作

RegionServer讀寫流程如下圖所示:

(1)寫流程

爲了提高HBase的寫效率,RegionServer將所有收到的寫請求暫時寫入內存,之後再順序刷新到磁盤上,進行將隨機寫轉化爲順序寫以提升性能。具體流程爲:RegionServer收到寫請求後,將數據寫入內存數據結構MemStore中,並通知客戶端數據寫入成功。當MemStore所佔內存達到一定閥值之後,RegionServer會將數據刷新到HDFS中,保存成HFile格式的文件。

(2)讀流程

由於寫流程可能使得數據位於內存或者磁盤上,因此讀取數據時,需要從多個數據存放位置中尋找數據,包括BlockCache、MemStore及HFile,並將讀到的數據合併在一起返回給用戶。查找的順序爲:BlockCache、MemStore、HFile。

4.MemStore與HFile組織結構

MemStore負責將最近寫入的數據緩存到內存中,它是一個有序的key/value內存存儲格式,每個column family擁有一個MemStore,格式如下圖所示:

HFile是Google SSTable的開源實現,作爲有序的key/value磁盤存儲格式,帶有多級索引,以方便定位數據,HFile中的多級索引類似於B+樹。HFile格式如下圖所示:

HFile具有以下特點:

(1)數據按照key以升序排列;

(2)文件由若干64KB的block構成,每個block包含一系列key/value;

(3)每個block擁有自己的索引,稱之爲“leaf index”,按照key構建;

(4)每個block的最後一個key被放倒“intermediate index”中;

(5)每個HFile文件包含一個“root index”,指向“intermediate index”;

(6)每個文件末尾包含一個tralier域,記錄了block meta,bloom filter等信息。

 

(五)HBase訪問方式

 

常用的HBase Shell命令如下:

 

常用的HBase Java API命令如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章