HBase2.0新特性之In-Memory Compaction


In-Memory Compaction是HBase2.0中的重要特性之一,通過在內存中引入LSM結構,減少多余數據,實現降低flush頻率和減小寫放大的效果。本文根據HBase2.0中相關代碼以及社區的討論博客,介紹In-Memory Compaction的使用和實現原理。

原理

概念和數據結構

In-Memory Compaction中引入了MemStore的一個新的實現類 CompactingMemStore 。顧名思義,這個類和默認memstore的區別在於實現了在內存中compaction。

CompactingMemStore中,數據以 segment 作為單位進行組織,一個memStore中包含多個segment。數據寫入時首先進入一個被稱為 active 的segment,這個segment是可修改的。當active滿之后,會被移動到 pipeline 中,這個過程稱為 in-memory flush 。pipeline中包含多個segment,其中的數據不可修改。CompactingMemStore會在后台將pipeline中的多個segment合並為一個更大、更緊湊的segment,這就是compaction的過程。
如果RegionServer需要把memstore的數據flush到磁盤,會首先選擇其他類型的memstore,然后再選擇CompactingMemStore。這是因為CompactingMemStore對內存的管理更有效率,所以延長CompactingMemStore的生命周期可以減少總的I/O。當CompactingMemStore被flush到磁盤時,pipeline中的所有segment會被移到一個snapshot中進行合並然后寫入HFile。
image

在默認的MemStore中,對cell的索引使用ConcurrentSkipListMap,這種結構支持動態修改,但是其中存在大量小對象,內存浪費比較嚴重。而在CompactingMemStore中,由於pipeline里面的數據是只讀的,就可以使用更緊湊的數據結構來存儲索引,減少內存使用。代碼中使用CellArrayMap結構來存儲cell索引,其內部實現是一個數組。
image

compaction策略

當一個active segment被flush到pipeline中之后,后台會觸發一個任務對pipeline中的數據進行合並。合並任務會對pipeline中所有segment進行scan,將他們的索引合並為一個。有三種合並策略可供選擇:Basic,Eager,Adaptive。
Basic compaction策略和Eager compaction策略的區別在於如何處理cell數據。Basic compaction不會清理多余的數據版本,這樣就不需要對cell的內存進行拷貝。而Eager compaction會過濾重復的數據,並清理多余的版本,這意味着會有額外的開銷:例如如果使用了MSLAB存儲cell數據,就需要把經過清理之后的cell從舊的MSLAB拷貝到新的MSLAB。basic適用於所有寫入模式,eager則主要針對數據大量淘汰的場景:例如消息隊列、購物車等。
Adaptive策略則是根據數據的重復情況來決定是否使用Eager策略。在Adaptive策略中,首先會對待合並的segment進行評估,方法是在已經統計過不重復key個數的segment中,找出cell個數最多的一個,然后用這個segment的numUniqueKeys / getCellsCount得到一個比例,如果比例小於設定的閾值,則使用Eager策略,否則使用Basic策略。

使用

配置

2.0中,默認的In-Memory Compaction策略為basic。可以通過修改hbase-site.xml修改:

<property> <name>hbase.hregion.compacting.memstore.type</name> <value><none|basic|eager|adaptive></value> </property>

也可以單獨設置某個列族的級別:

create ‘<tablename>’, {NAME => ‘<cfname>’, IN_MEMORY_COMPACTION => ‘<NONE|BASIC|EAGER|ADAPTIVE>’}

性能提升

社區的博客中給出了兩個不同場景的測試結果。使用YCSB測試工具,100-200 GB數據集。分別在key熱度符合Zipf分布和平均分布兩種情況下,測試了只有寫操作情況下寫放大、吞吐、GC相比默認memstore的變化,以及讀寫各占50%情況下尾部讀延時的變化。
測試結果如下表:

 

key熱度分布 寫放大 吞吐 GC 尾部讀延時
Zipf 30%↓ 20% ↑ 22% ↓ 12% ↓
平均分布 25%↓ 50% ↑ 36% ↓ 無變化

轉自:https://yq.aliyun.com/articles/573702

 


交流

如果大家對HBase有興趣,致力於使用HBase解決實際的問題,歡迎加入Hbase技術社區群交流:

微信HBase技術社區群,假如微信群加不了,可以加秘書微信: SH_425 ,然后邀請您。

 

 

​  釘釘HBase技術社區群


免責聲明!

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



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