HBase 系統架構及資料結構

單人影發表於2019-06-24

一、基本概念

一個典型的Hbase Table 表如下:

HBase 系統架構及資料結構

1.1 Row Key (行鍵)

Row Key是用來檢索記錄的主鍵。想要訪問HBase Table中的資料,只有以下三種方式:

  • 通過指定的Row Key進行訪問;
  • 通過Row Key的range進行訪問,即訪問指定範圍內的行;
  • 進行全表掃描。

Row Key可以是任意字串,儲存時資料按照Row Key的字典序進行排序。這裡需要注意以下兩點:

  • 因為字典序對Int排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。如果你使用整型的字串作為行鍵,那麼為了保持整型的自然序,行鍵必須用0作左填充。
  • 行的一次讀寫操作時原子性的 (不論一次讀寫多少列)。

1.2 Column Family(列族)

HBase表中的每個列,都歸屬於某個列族。列族是表的Schema的一部分,所以列族需要在建立表時進行定義。列族的所有列都以列族名作為字首,例如courses:historycourses:math都屬於courses這個列族。

1.3 Column Qualifier (列限定符)

列限定符,你可以理解為是具體的列名,例如courses:historycourses:math都屬於courses這個列族,它們的列限定符分別是historymath。需要注意的是列限定符不是表Schema的一部分,你可以在插入資料的過程中動態建立列。

1.4 Column(列)

HBase中的列由列族和列限定符組成,它們由:(冒號)進行分隔,即一個完整的列名應該表述為列族名 :列限定符

1.5 Cell

Cell是行,列族和列限定符的組合,幷包含值和時間戳。你可以等價理解為關係型資料庫中由指定行和指定列確定的一個單元格,但不同的是HBase中的一個單元格是由多個版本的資料組成的,每個版本的資料用時間戳進行區分。

1.6 Timestamp(時間戳)

HBase 中通過row keycolumn確定的為一個儲存單元稱為Cell。每個Cell都儲存著同一份資料的多個版本。版本通過時間戳來索引,時間戳的型別是 64位整型,時間戳可以由HBase在資料寫入時自動賦值,也可以由客戶顯式指定。每個Cell中,不同版本的資料按照時間戳倒序排列,即最新的資料排在最前面。

二、儲存結構

2.1 Regions

HBase Table中的所有行按照Row Key的字典序排列。HBase Tables 通過行鍵的範圍(row key range)被水平切分成多個Region, 一個Region包含了在start key 和 end key之間的所有行。

HBase 系統架構及資料結構

每個表一開始只有一個Region,隨著資料不斷增加,Region會不斷增大,當增大到一個閥值的時候,Region就會等分為兩個新的Region。當Table中的行不斷增多,就會有越來越多的Region

HBase 系統架構及資料結構

Region是HBase中分散式儲存和負載均衡的最小單元。這意味著不同的Region可以分佈在不同的Region Server上。但一個Region是不會拆分到多個Server上的。

HBase 系統架構及資料結構

2.2 Region Server

Region Server執行在HDFS的DataNode上。它具有以下元件:

  • WAL(Write Ahead Log,預寫日誌):用於儲存尚未進持久化儲存的資料記錄,以便在發生故障時進行恢復。
  • BlockCache:讀快取。它將頻繁讀取的資料儲存在記憶體中,如果儲存不足,它將按照最近最少使用原則清除多餘的資料。
  • MemStore:寫快取。它儲存尚未寫入磁碟的新資料,並會在資料寫入磁碟之前對其進行排序。每個Region上的每個列族都有一個MemStore。
  • HFile :將行資料按照Key\Values的形式儲存在檔案系統上。
HBase 系統架構及資料結構

Region Server存取一個子表時,會建立一個Region物件,然後對錶的每個列族建立一個Store例項,每個Store會有 0 個或多個StoreFile與之對應,每個StoreFile則對應一個HFile,HFile 就是實際儲存在HDFS上的檔案。

HBase 系統架構及資料結構

三、Hbase系統架構

3.1 系統架構

HBase系統遵循Master/Salve架構,由三種不同型別的元件組成:

Zookeeper

  1. 保證任何時候,叢集中只有一個Master;
  2. 存貯所有Region的定址入口;
  3. 實時監控Region Server的狀態,將Region Server的上線和下線資訊實時通知給Master;
  4. 儲存HBase的Schema,包括有哪些Table,每個Table有哪些Column Family等資訊。

Master

  1. 為Region Server分配Region ;
  2. 負責Region Server的負載均衡 ;
  3. 發現失效的Region Server並重新分配其上的Region;
  4. GFS上的垃圾檔案回收;
  5. 處理Schema的更新請求。

Region Server

  1. Region Server負責維護Master分配給它的Region ,並處理髮送到Region上的IO請求;
  2. Region Server負責切分在執行過程中變得過大的Region。
HBase 系統架構及資料結構

3.2 元件間的協作

HBase使用ZooKeeper作為分散式協調服務來維護叢集中的伺服器狀態。 Zookeeper負責維護可用服務列表,並提供服務故障通知等服務:

  • 每個Region Server都會在ZooKeeper上建立一個臨時節點,Master通過Zookeeper的Watcher機制對節點進行監控,從而可以發現新加入的Region Server或故障退出的Region Server;
  • 所有Masters會競爭性地在Zookeeper上建立同一個臨時節點,由於Zookeeper只能有一個同名節點,所以必然只有一個Master能夠建立成功,此時該Master就是主Master,主Master會定期向Zookeeper傳送心跳。備用Masters則通過Watcher機制對主HMaster所在節點進行監聽;
  • 如果主Master未能定時傳送心跳,則其持有的Zookeeper會話會過期,相應的臨時節點也會被刪除,這會觸發定義在該節點上的Watcher事件,使得備用的Master Servers得到通知。所有備用的Master Servers在接到通知後,會再次去競爭性地建立臨時節點,完成主Master的選舉。
HBase 系統架構及資料結構

四、資料的讀寫流程簡述

4.1 寫入資料的流程

  1. Client向Region Server提交寫請求;
  2. Region Server找到目標Region;
  3. Region檢查資料是否與Schema一致;
  4. 如果客戶端沒有指定版本,則獲取當前系統時間作為資料版本;
  5. 將更新寫入WAL Log;
  6. 將更新寫入Memstore;
  7. 判斷Memstore儲存是否已滿,如果儲存已滿則需要flush為Store Hfile檔案。

更為詳細寫入流程可以參考:HBase - 資料寫入流程解析

4.2 讀取資料的流程

以下是客戶端首次讀寫HBase上資料的流程:

  1. 客戶端從Zookeeper獲取META表所在的Region Server;
  2. 客戶端訪問META表所在的Region Server,從META表中查詢到訪問行鍵所在的Region Server,之後客戶端將快取這些資訊以及META表的位置;
  3. 客戶端從行鍵所在的Region Server上獲取資料。

如果再次讀取,客戶端將從快取中獲取行鍵所在的Region Server。這樣客戶端就不需要再次查詢META表,除非Region移動導致快取失效,這樣的話,則將會重新查詢並更新快取。

注:META表是HBase中一張特殊的表,它儲存了所有Region的位置資訊,META表自己的位置資訊則儲存在ZooKeeper上。

HBase 系統架構及資料結構

更為詳細讀取資料流程參考:

HBase原理-資料讀取流程解析

HBase原理-遲到的‘資料讀取流程部分細節

參考資料

本篇文章內容主要參考自官方文件和以下兩篇部落格,圖片也主要引用自以下兩篇部落格:

官方文件:

更多大資料系列文章可以參見個人 GitHub 開源專案: 大資料入門指南

相關文章