HBase 的MOB壓縮分區策略介紹

HBase應用場景非常廣泛;社區前面有一系列文章。大家可以到社區看看看;張少華同學本篇主要講HBase的MOB壓縮分區策略介紹,非常贊!大力推薦!

社區系列文章:

新數倉系列:HBase關鍵能力和特性梳理

HBase 和 Cassandra的淺談

新數倉系列:Hbase周邊生態梳理(1)

HBase設計之rowkey設計



介紹

HBase中等對象(MOB---MediumObject)存儲特性引入是源自社區HBASE-11339。對於中等大小的文檔、圖像等文件的存儲(文件大小從100K到10MB),可降低讀取延遲和寫入訪問時間[1]。通過分離文件的IO路徑和MOB文件對象,對文件採取不同的壓縮策略,從而減少由於HBase壓縮造成的寫入擴大。若一個表的MOB文件存儲在MOB區域(MOB region)中,則意味著該區域中將存在大量的MOB文件。請參考下圖中HBase MOB架構。

HBase 的MOB壓縮分區策略介紹

MOB體系結構

從上圖我們可以看出MOB文件相對較小(小於1或者2個HDFS塊)。為了提高HDFS的效率,通過MOB壓縮方法將MOB文件定期合併為較大的文件,並且這種壓縮方法與正常的壓縮過程相互獨立。MOB壓縮最初是將當天多個MOB文件合併為較大的MOB文件。通過下面示例我們可以更清楚瞭解這一過程。表t1有兩個兩個分區(r1,r2),一個列族f1,並且啟用了MOB功能。你可以看到如下兩個前綴:

D279186428a75016b17e4df5ea43d080 對應分區r1中startkey的散列值

D41d8cd98f00b204e9800998ecf8427e 對應分區r2中startkey的散列值

在MOB區域中,從2016.1.1-2016.1.2,r1分區中每天有兩個MOB文件,2016.1.1當天,分區r2中有三個MOB文件

通過MOB壓縮後,r1、r2分區中同一日期的文件合併為一個文件,如下:

HBase 的MOB壓縮分區策略介紹

由於只有在同一區並且為同一天的MOB文件才可壓縮,因此在一個MOB區域中的目錄下一年產生的MOB文件數量為365乘以分區數目。若有1000個分區,通過MOB壓縮,10年後將會有365 x 1000 x 10,3.65(百萬)個文件產生並且文件數量會一直增長。但是,由於HDFS中一個目錄下文件存儲受限[2],若MOB文件數超過HDFS限制後,MOB表將不再可寫入文件。HDFS的一個目錄下默認的最大文件數為100萬,那麼對於1000個分區來說,文件存儲數目將在3年左右達到這個極限值。分區越多,最大文件數會越快達到這個極限。

從HBASE-16981引入按周和月的MOB壓縮分區策略,對此MOB文件存放比例相應提高了7%和30%。

HBASE-16981基本思路是將一週或者一個月的MOB文件壓縮合併為更大的文件。根據ISO8601定義的周(起始為週一結束為週日),若採用周策略進行MOB壓縮後,則每個分區每週會產生一個文件,同理,用壓縮方法按月壓縮,每月會生成一個文件,最終在一個MOB區域目錄下的文件數分別為52 乘以分區數和12乘以分區數。這樣就大大減少了壓縮後MOB文件的數量。

最初的方法

根據MOB壓縮發生的頻率,文件可能多次被壓縮。例如,第一天所有的MOB文件被壓縮為一個文件,第二天將第一天和第二天的MOB文件壓縮為一個新的文件,第三天將第二天和第三天產生的文件壓縮為一個新文件,以此類推,一個月後,第1天的文件壓縮會超過30次,因此也就將寫的IO數量擴大了30倍以上。

HBase MOB的設計目標是減少由於MOB壓縮而導致的寫入擴大。上述的這種方法沒能達到設計目標。

最終的方法

為了克服最初提出方案的不足,在HBASE-16981中採用了新的按周和月壓縮策略。圖2展示瞭如何按月壓縮策略,同時按周壓縮策略與此類似。

HBase 的MOB壓縮分區策略介紹

圖2 按月MOB壓縮策略

圖2所示的MOB壓縮發生在2016.11.15。根據配置的MOB閾值,每日分區中的文件按周進行壓縮。上圖中11.14和11.15的兩天的文件各自壓縮。當前月份(11月)中過去的幾周的文件基於每週閾值分區進行壓縮(MOB閾值 x 7),如11.1-11.6和11.7-11.13的文件分別壓縮。11月之前的文件按月進行壓縮,例如10.1-10.31文件壓縮在一起。需要注意的是11月的第一週是從10.31-11.6結束。由於2016.10.31是10月的最後一天,因此當天的文件壓縮是按照月分區進行壓縮,這樣11月的第一週壓縮的天數只剩下6天(11.1-11.6),如果MOB壓縮閾值和壓縮大小設置合理,那麼第一週會有5個壓縮文件。

通過這種設計模式,MOB文件可以通過2個階段或3個階段完成壓縮。在每個階段,日、周、月分區都會隨著MOB壓縮閾值的增加而變化。通常情況下,MOB文件按月最多3次壓縮,按周最多壓縮2次。具體的設計細節可以參考[3]。

用法

在默認情況下,MOB壓縮分區策略是每日一次。若要用周或月策略,可以在MOB列族中添加了一個新屬性字段:MOB_COMPACT_PARTITION_POLICY。用戶可通過HBase shell在創建表時設置該屬性。例如:

HBase 的MOB壓縮分區策略介紹

同時也可以改變該屬性字段值

HBase 的MOB壓縮分區策略介紹

如果壓縮策略從每日改為每週或每月,或從每週改為每月,則下一個MOB壓縮將重新壓縮之前壓縮的MOB文件。如果策略從每月或每週改為每日或每月更新,則對已使用先前策略壓縮的MOB文件將不會與新策略再次執行壓縮。

結束語

HBASE-16981解決了文件數大量增加的問題,並在Apache HBase 2.0.0版本中使用。CDH的CDH5.4.0+及以後的版本開始使用HBase MOB特性,其中從5.11.0開始使用HBASE-16981修復的版本。

由於譯者水平有限,有翻譯不當之處還請大大家多多指出,互相學習。

參考

[1]https://blog.cloudera.com/blog/2015/06/inside-apache-hbases-new-support-for-MOBs/

[2] https://blog.cloudera.com/blog/2009/02/the-small-files-problem/

[3] https://issues.apache.org/jira/browse/HBASE-16981

原文地址:http://blog.cloudera.com/blog/2017/06/introducing-apache-hbase-medium-object-storage-MOB-compaction-partition-policies/#/


分享到:


相關文章: