hbase創建二級索引


1. 參考https://www.sohu.com/a/252317049_610458

2. 

01 HBase簡介

HBase是一個構建在HDFS之上,用於海量數據存儲分布式列存儲系統。

參見下圖,由於在HBase中:

  • 表的每行都是按照RowKey的字典序排序存儲
  • 表的數據是按照RowKey區間進行分割存儲成多個region

所以HBase主要適用下面這兩種常見場景:

  • 適用於基於rowkey的單行數據快速隨機讀寫
  • 適合基於rowkey前綴的范圍掃描

02 為什么需要HBse二級索引

HBase里面只有rowkey作為一級索引, 如果要對庫里的非rowkey字段進行數據檢索和查詢, 往往要通過MapReduce/Spark等分布式計算框架進行,硬件資源消耗和時間延遲都會比較高。

為了HBase的數據查詢更高效、適應更多的場景, 諸如使用非rowkey字段檢索也能做到秒級響應,或者支持各個字段進行模糊查詢和多字段組合查詢等, 因此需要在HBase上面構建二級索引, 以滿足現實中更復雜多樣的業務需求。

03 HBse二級索引方案

基於Coprocessor方案

1、官方特性

其實從0.94版本開始,HBase官方文檔已經提出了hbase上面實現二級索引的一種路徑:

  • 基於Coprocessor(0.92版本開始引入,達到支持類似傳統RDBMS的觸發器的行為)
  • 開發自定義數據處理邏輯,采用數據“雙寫”(dual-write)策略,在有數據寫入同時同步到二級索引表

2、開源方案:

雖然官方一直也沒提供內置的支持二級索引的工具, 不過業界也有些比較知名的基於Coprocessor的開源方案:

  • 華為的hindex : 基於0.94版本,當年剛出來的時候比較火,但是版本較舊,看GitHub項目地址最近這幾年就沒更新過。
  • Apache Phoenix: 功能圍繞着SQL on hbase,支持和兼容多個hbase版本, 二級索引只是其中一塊功能。 二級索引的創建和管理直接有SQL語法支持,使用起來很簡便, 該項目目前社區活躍度和版本更新迭代情況都比較好。

ApachePhoenix在目前開源的方案中,是一個比較優的選擇。主打SQL on HBase , 基於SQL能完成HBase的CRUD操作,支持JDBC協議。 Apache Phoenix在Hadoop生態里面位置:

3、Phoenix二級索引特點:

  • Covered Indexes(覆蓋索引) :把關注的數據字段也附在索引表上,只需要通過索引表就能返回所要查詢的數據(列), 所以索引的列必須包含所需查詢的列(SELECT的列和WHRER的列)。
  • Functional indexes(函數索引): 索引不局限於列,支持任意的表達式來創建索引。
  • Global indexes(全局索引):適用於讀多寫少場景。通過維護全局索引表,所有的更新和寫操作都會引起索引的更新,寫入性能受到影響。 在讀數據時,Phoenix SQL會基於索引字段,執行快速查詢。
  • Local indexes(本地索引):適用於寫多讀少場景。 在數據寫入時,索引數據和表數據都會存儲在本地。在數據讀取時, 由於無法預先確定region的位置,所以在讀取數據時需要檢查每個region(以找到索引數據),會帶來一定性能(網絡)開銷。

其他的在網上也很多自己基於Coprocessor實現二級索引的文章,大體都是遵循類似的思路:構建一份“索引”的映射關系,存儲在另一張hbase表或者其他DB里面。

4、方案優缺點:

  • 優點: 基於Coprocessor的方案,從開發設計的角度看, 把很多對二級索引管理的細節都封裝在的Coprocessor具體實現類里面, 這些細節對外面讀寫的人是無感知的,簡化了數據訪問者的使用。
  • 缺點: 但是Coprocessor的方案入侵性比較強, 增加了在Regionserver內部需要運行和維護二級索引關系表的代碼邏輯等,對Regionserver的性能會有一定影響。

非Coprocessor方案

選擇不基於Coprocessor開發,自行在外部構建和維護索引關系也是另外一種方式。

常見的是采用底層基於Apache Lucene的Elasticsearch(下面簡稱ES)或Apache Solr ,來構建強大的索引能力、搜索能力, 例如支持模糊查詢、全文檢索、組合查詢、排序等。

1、Lily HBase Indexer:

LilyHBase Indexer(也簡稱 HBase Indexer)是國外的NGDATA公司開源的基於solr的索引構建工具, 特色是其基於HBase的備份機制,開發了一個叫SEP工具, 通過監控HBase 的WAL日志(Put/Delete操作),來觸發對solr集群索引的異步更新, 基本對HBase無侵入性(但必須開啟WAL ), 流程圖如下所示:

2、CDH Search:

CDHSearch是Hadoop發行商Cloudera公司開發的基於solr的HBase檢索方案,部分集成了Lily HBase Indexer的功能。

下面是CDH search的核心組件交互圖, 體現了在單次client端查詢過程中,核心的zookeeper和solr等的交互流程:

3、CDH 支持構建索引方式:

  • 批量索引:
    • 使用 Spark :CDH自帶 spark 批量index工具
    • 使用MapReduce :集成Lily Indexer、自帶MR index等工具
  • 近實時索引(增量場景):
    • 使用 Flume 近實時(NRT)索引
    • 集成Lily NRT Indexer
  • 基於Solr REST API自定義索引場景

4、CDH Solr 索引查詢流程示意圖:

04 DataStory二級索引方案介紹

其實對於在外部自定義構建二級索引的方式, 有自己的大數據團隊的公司一般都會針對自己的業務場景進行優化,自行構建ES/Solr的搜索集群。 例如數說故事企業內部的百億級數據全量庫,就是基於ES構建海量索引和檢索能力的案例。 主要優化點包括:

  • 對企業的索引集群面向的業務場景和模式定制,對通用數據模型進行抽象和平台化復用
  • 需要針對多業務、多項目場景進行ES集群資源的合理划分和運維管理
  • 查詢需要針對多索引集群、跨集群查詢進行優化
  • 共用集群場景需要做好防護、監控、限流

下面顯示了數說基於ES做二級索引的兩種構建流程,包含:

  • 增量索引: 日常持續接入的數據源,進行增量的索引更新
  • 全量索引: 配套基於Spark/MR的批量索引創建/更新程序, 用於初次或重建已有HBase庫表的索引

數據查詢流程:

Datastory在做全量庫的過程中,還是有更多遇到的問題要解決,諸如數據一致性、大量小索引、多版本ES集群共存等, 會在后續進行更細致的介紹和分享。

參考資料:

  • HBase coprocessor: https://blogs.apache.org/hbase/entry/coprocessor_introduction
  • Cloudera Search: https://www.cloudera.com/documentation/enterprise/5-14-x/topics/search.html
  • Apache Phoenix Secondary indexing: https://phoenix.apache.org/secondary_indexing.html
  • NGDATA Lily HBase Indexer:
    • https://github.com/NGDATA/hbase-indexer/wiki
    • https://www.ngdata.com/the-hbase-side-effect-processor-and-hbase-replication-monitoring/
  • 深入理解HBase Indexer: https://blog.csdn.net/d6619309/article/details/51500368
  • 華為hindex: https://github.com/Huawei-Hadoop/hindex


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM