一文讀懂 HBase 核心原理與應用場景

  • 2020 年 3 月 11 日
  • 筆記

HBase是大數據NoSQL領域裡非常重要的分散式KV資料庫,是一個高可靠、高性能、高伸縮的分散式存儲系統,目前中國知名公司都有在大規模使用,社區也非常活躍。本文就是學習HBase的敲門磚,主要從以下幾個方面解讀HBase。

1、存儲引擎

HBase是Google的BigTable的開源實現,底層存儲引擎是基於LSM-Tree數據結構設計的。寫入數據時會先寫WAL日誌,再將數據寫到寫快取MemStore中,等寫快取達到一定規模後或滿足其他觸發條件才會flush刷寫到磁碟,這樣就將磁碟隨機寫變成了順序寫,提高了寫性能。每一次刷寫磁碟都會生成新的HFile文件。可以參考如下的原理圖:

隨著時間推移,寫入的HFile會越來越多,查詢數據時就會因為要進行多次io導致性能降低,為了提升讀性能,HBase會定期執行compaction操作以合併HFile。此外,HBase在讀路徑上也有諸多設計,其中一個重要的點是設計了BlockCache讀快取。這樣以後,讀取數據時會依次從BlockCache、MemStore以及HFile中seek數據,再加上一些其他設計比如布隆過濾器、索引等,保證了HBase的高性能。

2、數據模型

關於HBase的數據模型,和關係型數據類似,包括命名空間(namespace)、表、行、列、列族、列限定符、單元格(cell)、時間戳等,具體概念比較好理解就不多解釋了。而HBase在實際存儲數據的時候是以有序KV的形式組織的。

參考上圖,這裡重點從KV這個角度切入,Value是實際寫入的數據,比較好理解。其中Key則是由Rowkey、Column Family : Column Qualifier、Timestamp、Type等幾個維度組成,其中rowkey是HBase的行鍵;column family(列族)與qualifier(列限定符即列名)共同組成了HBase的列;timestamp表示的就是數據寫入時的時間戳,主要用於標識HBase數據的版本號;type代表Put/Delete的操作類型,說明一點,HBase刪除是給數據打上delete marker,在數據合併時才會真正物理刪除。此外,HBase的表具有稀疏特性,一行中空值的列並不佔用任何存儲空間。

3、列族式存儲

HBase並不是行式存儲,也不是完全的列式存儲,而是面向列族的列族式存儲。前面也提到了,HBase的每一列數據在底層都是以 KV 形式存儲的,而針對一行數據,同一列族的不同列的數據是順序相鄰存放的,這種模式實際上是行式存儲;而如果一個列族下只有一個列的話,就是一種列式存儲。因此我們可以說HBase是一種列族式存儲。

4、關於索引

默認情況下HBase只對rowkey做了單列索引,所以HBase能通過rowkey進行高效的單點查詢及小範圍掃描。HBase索引還是比較單一的,通過非rowkey列查詢性能比較低,除非對非Rowkey列做二級索引,否則不建議根據非rowkey列做查詢。

HBase的二級索引一般是基於HBase協處理器實現,目前比較成熟的方案可以使用Phoenix,可以參考筆者最近的另一篇文章:HBase 集成 Phoenix 構建二級索引實踐,Phoenix不僅能夠為HBase提供二級索引能力,還扮演著HBase的SQL層,增強了HBase即席查詢的能力。

5、HBase主要特點

每個組件都有它的強項和弱項,HBase也有它擅長與短板之處。

優點:

  • 容量大:HBase單表可以很龐大,加上其分散式、高伸縮性的特點,使得HBase特別適合海量數據的永久性存儲。
  • 高性能:HBase具有非常高的讀寫性能,基於LSM-Tree的數據結構使得HBase寫入數據性能強勁,另外得益於HBase讀路徑上的各種設計及優化,HBase讀數據的性能也可以保持在毫秒級。
  • 高可靠:因為數據寫路徑上是先寫WAL日誌,防止快取數據的丟失,加上HBase底層數據的多副本機制,保證了數據的可靠性。
  • 原始支援Hadoop:HBase底層存儲基於HDFS,也原生集成了MapReduce做離線計算。HBase這種架構體系也使得HBase非常易於擴展。
  • 無模式:HBase的表是schema-free的,無需提前定義schema,只會在數據寫入時才會增加列。
  • 稀疏性:HBase是表具有稀疏性,null值的列並不佔用任何存儲空,這一點和關係庫不同,大大節省了存儲空間。
  • 多版本:HBase支援多版本,每一個單元格包含timestamp時間戳,標識著數據的版本號。

缺點:

  • 數據分析能力弱:數據分析是HBase的弱項,比如聚合運算、多維度複雜查詢、多表關聯查詢等。所以,我們一般在HBase之上架設Phoenix或Spark等組件,增強HBase數據分析處理的能力。
  • 原生不支援二級索引:默認HBase只對rowkey做了單列索引,因此正常情況下對非rowkey列做查詢比較慢。所以,我們一般會選擇一個HBase二級索引解決方案,目前比較成熟的解決方案是Phoenix,此外還可以選擇Elasticsearch/Solr等搜索引擎自己設計實現。
  • 原生不支援SQL:SQL查詢也是HBase的一個弱項,好在這塊可以通過引入Phoenix解決,Phoenix是專為HBase設計的SQL層。

6、HBase的應用場景

HBase經常應用在訂單/消息存儲、用戶畫像、搜索推薦、社交Feed流、安全風控、以及物聯網時序數據等諸多場景。社區也寫過HBase應用場景的相關文章:再談HBase八大應用場景,可以參考。

如果你的場景里需要存儲海量數據,並發讀寫非常高,而且並不需特別複雜的數據分析,那麼強烈建議你使用HBase。