分佈式列存儲數據庫Hbase簡述

    Hadoop 可以通過 HDFS 來存儲結構化、半結構甚至非結構化的數據,它是傳統數據庫的補充,是海量數據存儲的最佳方法,它針對大文件的存儲,批量訪問和流式訪問都做了優化,同時也通過多副本解決了容災問題。但是 Hadoop 的缺陷在於它只能執行批處理,並且只能以順序方式訪問數據,這意味着即使是最簡單的工作,也必須搜索整個數據集,無法實現對數據的隨機訪問。實現數據的隨機訪問是傳統的關係型數據庫所擅長的,但它們卻不能用於海量數據的存儲。在這種情況下,必須有一種新的方案來解決海量數據存儲和隨機訪問的問題,HBase 就是其中之一 (HBase,Cassandra,couchDB,Dynamo 和 MongoDB 都能存儲海量數據並支持隨機訪問),國內主要Hbase應用更爲廣泛。

基本概念

    Hbase是構建在Hadoop文件系統之上的面向列存儲的分佈式數據庫。我覺得HBase 是一個面向 列族 的分佈式數據庫更爲貼切。表 schema 僅定義列族,一個表可以有多個列族,每個列族可以包含任意數量的列,列由多個單元格(cell )組成,單元格可以存儲多個版本的數據,多個版本數據以時間戳進行區分。

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 作左填充。
  • 行的一次讀寫操作時原子性的 (不論一次讀寫多少列)。
Column Family(列族)

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

Column Qualifier (列限定符)

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

Column(列)

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

Cell

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

Timestamp(時間戳)

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

Hbase 的表具有以下特點:

  • 容量大:一個表可以有數十億行,上百萬列
  • 面向列:數據是按照列存儲,每一列都單獨存放,數據即索引,在查詢時可以只訪問指定列的數據,有效地降低了系統的 I/O 負擔
  • 稀疏性:空 (null) 列並不佔用存儲空間,表可以設計的非常稀疏
  • 數據多版本:每個單元中的數據可以有多個版本,按照時間戳排序,新的數據在最上面
  • 存儲類型:所有數據的底層存儲格式都是字節數組 (byte[])

存儲結構

Regions

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

每個表一開始只有一個 Region,隨着數據不斷增加,Region 會不斷增大,當增大到一個閥值的時候,Region 就會拆分爲兩個新的 Region。當 Table 中的行不斷增多,就會有越來越多的 Region。

Region 是 HBase 中分佈式存儲和負載均衡的最小單元。這意味着不同的 Region 可以分佈在不同的 Region Server 上。但一個 Region 是不會拆分到多個 Server 上的。
Region雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。事實上Region由一個或者多個Store組成,每個Store保存一個列族;每個Strore又由一個memStore和0至多個StoreFile組成;StoreFile以HFile格式保存在HDFS上。

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 上的文件。

Hbase架構

    HBase 是一種類似於 Google’s Big Table 的數據模型的開源實現,它是 Hadoop 生態系統的一部分,它將數據存儲在 HDFS 上,客戶端可以通過 HBase 實現對 HDFS 上數據的隨機訪問。
在這裏插入圖片描述
HBase 系統遵循 Master/Salve 架構,由以下服務組成:
Zookeeper

  • 保證任何時候,集羣中只有一個 Master
  • 存貯所有 Region 的尋址入口
  • 實時監控 Region Server 的狀態,將 Region Server 的上線和下線信息實時通知給 Master
  • 存儲 HBase 的 Schema,包括有哪些 Table,每個 Table 有哪些 Column Family 等信息

Master

  • 爲 Region Server 分配 Region
  • 負責 Region Server 的負載均衡
  • 發現失效的 Region Server 並重新分配其上的 Region
  • GFS 上的垃圾文件回收
  • 處理 Schema 的更新請求

RegionServer

  • Region Server 負責維護 Master 分配給它的 Region ,並處理髮送到 Region 上的 IO 請求
  • Region Server 負責切分在運行過程中變得過大的 Region

服務之間的協作
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 的選舉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章