HBase 系統架構及數據結構

1、基本概念

一個典型的Hbase Table 表以下:html

1.1 Row Key (行鍵)

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

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

Row Key能夠是任意字符串,存儲時數據按照Row Key的字典序進行排序。這裏須要注意如下兩點:github

  • 由於字典序對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的一部分,你能夠在插入數據的過程當中動態建立列。apache

1.4 Column(列)

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

1.5 Cell

Cell是行,列族和列限定符的組合,幷包含值和時間戳。你能夠等價理解爲關係型數據庫中由指定行和指定列肯定的一個單元格,但不一樣的是HBase中的一個單元格是由多個版本的數據組成的,每一個版本的數據用時間戳進行區分。服務器

1.6 Timestamp(時間戳)

HBase 中經過row keycolumn肯定的爲一個存儲單元稱爲Cell。每一個Cell都保存着同一份數據的多個版本。版本經過時間戳來索引,時間戳的類型是 64位整型,時間戳能夠由HBase在數據寫入時自動賦值,也能夠由客戶顯式指定。每一個Cell中,不一樣版本的數據按照時間戳倒序排列,即最新的數據排在最前面。數據結構

2、存儲結構

2.1 Regions

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

每一個表一開始只有一個Region,隨着數據不斷增長,Region會不斷增大,當增大到一個閥值的時候,Region就會等分爲兩個新的Region。當Table中的行不斷增多,就會有愈來愈多的Region負載均衡

Region是HBase中分佈式存儲和負載均衡的最小單元。這意味着不一樣的Region能夠分佈在不一樣的Region Server上。但一個Region是不會拆分到多個Server上的。

2.2 Region Server

Region Server運行在HDFS的DataNode上。它具備如下組件:

  • WAL(Write Ahead Log,預寫日誌):用於存儲還沒有進持久化存儲的數據記錄,以便在發生故障時進行恢復。
  • BlockCache:讀緩存。它將頻繁讀取的數據存儲在內存中,若是存儲不足,它將按照最近最少使用原則清除多餘的數據。
  • MemStore:寫緩存。它存儲還沒有寫入磁盤的新數據,並會在數據寫入磁盤以前對其進行排序。每一個Region上的每一個列族都有一個MemStore。
  • HFile :將行數據按照Key\Values的形式存儲在文件系統上。

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

3、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。

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的選舉。

4、數據的讀寫流程簡述

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原理-遲到的‘數據讀取流程部分細節

參考資料

本篇文章內容主要參考自官方文檔和如下兩篇博客,圖片也主要引用自如下兩篇博客:

官方文檔:

更多大數據系列文章能夠參見我的 GitHub 開源項目: 大數據入門指南

相關文章
相關標籤/搜索