HBase二級索引方案總結
在HBase中,表格的Rowkey按照字典排序,Region按照RowKey設定split point進行shard,透過這種方式實現的全域性、分散式索引,成為了其成功的最大的砝碼。圖1顯示了HBase表格的Rowkey切分與Region的部署關係圖。
圖1: HBase Rowkey-Region 關係圖
然而,隨著在HBase系統上應用的驅動,人們發現Global-Rowkey-Indexing不再滿足應用的需求。單一的透過Rowkey檢索資料的方式,不再滿足更多應用的需求,人們希望像SQL一樣檢索資料,select * from table where col=val。可是,HBase之前的定位是大表的儲存,要進行這樣的查詢,往往是要透過類似Hive、Pig等系統進行全表的MapReduce計算,這種方式既浪費了機器的計算資源,又因高延遲使得應用黯然失色。於是,在業界和社群,針對HBase Secondary Indexing的方案,成為HBase新版本(0.96)呼聲最高的一項Feature。
粗略分析了當前的技術,大概的方案可以總結為這樣兩類:
1、使用HBase的coprocessor。CoProcessor相當於HBase的Observer+hook,目前支援MasterObserver、RegionObserver和WALObserver,基本上對於HBase Table的管理、資料的Put、Delete、Get等操作都可以找到對應的pre***和post***。這樣如果需要對於某一項Column建立Secondary Indexing,就可以在Put、Delete的時候,將其資訊更新到另外一張索引表中。如圖二所示,對於Indexing裡面的value值是否儲存的問題,可以根據需要進行控制,如果value的空間開銷不大,逆向的檢索又比較頻繁,可以直接儲存在Indexing Table中,反之則避免這種情況。
圖2 使用HBase Coprocessor實現Secondary Indexing
2、由客戶端發起對於主表和索引表的Put、Delete操作的雙重操作。源自:http://hadoop-hbase.blogspot.com/2012/10/musings-on-secondary-indexes.html 【牆外】
它具體的做法總結起來有:
-
設定主表的TTL(Time To Live)比索引表小一點,讓其略早一點消亡。
-
不要在IndexingTable儲存Value值,即刪除如圖2所示的val列。
-
Put操作時,對於操作的主表的所有列,使用同一的Local TimeStamp的值,更新到Indexing Table,然後使用該TimeStamp插入主表資料。
-
Delete操作時,首先操作主表的資料,然後再去更新Indexing Table的資料。
雖然在這種方案裡無法保證原子性和一致性,但是透過TimeStamp的設定,No Locks和 No Server-side codes,使其在二級索引上有著較大的優勢。至於中間出錯的環節,我們看看是否可以容忍:
1)Put索引表成功,Put主表失敗。由於Indexing Table不儲存val值,仍需要跳轉到Main Table,所以這樣的錯誤相當於拿一個Stale index去訪問對應Rowkey吧了,對結果正確性沒有影響。
2)Delete主表成功,Delete索引表失敗。都是索引表的內容>=主表的內容而已,而實際返回值需要透過主表進行。
生產環境下,什麼樣的方法實用性更強?
就這個問題,根據個人當前對於生產環境下HBase叢集的經驗,綜合上面兩種方式的優劣,可以透過這樣的方式設計。
1、主表服務線上業務,它的效能需要保證。使用coprocessor和客戶端的封裝也好,都會影響其效能,所以在正常情況下,直接操作都不太合適。如果想使用方案二,我倒是感覺,可以調整Indexing Table的操作方式,去除保證其安全性的內容,比如可以關閉寫HLOG,這樣會進一步減低其操作的延遲。
2、離線更新索引表。在真正需要二級索引的場景內,其時效性要求往往不高。可以將索引實時更新到Redis等KV系統中,定時從KV更新索引到Hbase的Indexing Table中。PS:Redis裡面有DB設定的概念,可以按照時間段進行隔離,這樣某段時間內的資料會更新到Redis上,保證Redis匯入MapReduce之後仍然可以進行update操作。
原文地址:http://blog.sina.com.cn/s/blog_4a1f59bf01018apd.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1250023/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hbase構建二級索引解決方案索引
- Hbase的二級索引和RowKey的設計索引
- CDH+HBase Indexer+Solr為HBase資料建立二級索引IndexSolr索引
- 關於MySQL InnoDB表的二級索引是否加入主鍵的總結MySql索引
- Phoenix 二級索引索引
- Phoenix二級索引索引
- 索引總結索引
- HBase知識點總結
- mysql索引總結MySql索引
- HBase知識點集中總結
- pandas 設定二級索引索引
- MySQL索引——總結篇MySql索引
- Hbase(二)Hbase常用操作
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- AppBoxFuture: 二級索引及索引掃描查詢資料APP索引
- 使用高斯Redis實現二級索引Redis索引
- mysql關於聚集索引、非聚集索引的總結MySql索引
- mysql索引使用經驗總結MySql索引
- mysql總結筆記 -- 索引篇MySql筆記索引
- MySQL 索引知識點總結MySql索引
- 索引基礎知識總結索引
- 建立索引後,速度變快原因?以及索引失效總結索引
- HBase-Region太多的問題簡單總結
- 理解索引:HBase介紹和架構索引架構
- MySQL系列:索引失效場景總結MySql索引
- MySQL 索引和 SQL 調優總結MySql索引
- web直播方案總結:Web
- 一文總結分析聚集索引、非聚集索引、覆蓋索引的工作原理!索引
- MySQL 索引及查詢優化總結MySql索引優化
- MYSQL order by排序與索引關係總結MySql排序索引
- MySQL-覆蓋索引總結筆記MySql索引筆記
- HBase學習之二: hbase分頁查詢
- 2024.3.19(週二)總結
- docker命令總結(二)Docker
- 第二週總結
- 二分總結
- Kubernetes:Ingress總結(二)
- Kubernetes:Pod總結(二)
- IOS元件化方案總結iOS元件化