關於HBase的一些零碎事

原地址:http://www.ningoo.net/html/2011/some_tips_about_hbase.html

        目前穩定版本的HBase0.90.2只能基於Hadoop0.20.x系列版本,暫不支持最新的0.21.x。而且官方版本的Hadoop0.20.2(或者0.203.0)缺少一個重要的特性,HDFS不支持sync模式的持久,這樣HBase就有較大的丟失數據的風險。要在生產環境使用HBase,有兩個選擇,一是使用Cloudera的CDH3版本,Cloudera就類似MySQL的Percona,對官方版本的Hadoop做了很多改進工作,而且經典的《Hadoop:The Definitive Guide》一書的作者Tom White就是Cloudera的一員,這也和《High performance MySQL》一書的作者主要來是Percona一樣。另外一種選擇,就是自行編譯Hadoop branch-0.20-append源碼分支,這裏有詳細的說明

        對於HBase這種類似BigTable的系統,其優化之一是消除了磁盤的隨機寫。付出的代價是將最新的數據保存在內存表中,對內存有較大的需求。如果內存表的數量較多,則每個內存表就會在較小的時候刷到磁盤,導致磁盤文件多而且小。範圍讀取數據的時候就會跨多個數據文件甚至多個節點。爲提升讀性能,系統都會設計有compaction操作。另外爲了防止某些情況下數據文件過大(hbase.hregion.max.filesize,默認256M,太大的數據文件在compaction等操作是對內存的消耗更大),HBase也設計了split操作。Compaction和Split操作,對於在線應用的響應時間都容易造成波動,他們的策略需要根據應用的特性進行調整。建議在業務低峯期手工調整。

        HBase的regionserver宕機超過一定時間後,HMaster會將其所管理的region重新分佈到其他存活的regionserver,由於數據和日誌都持久在HDFS中,因此該操作不會導致數據丟失。但是重新分配的region需要根據日誌恢復原regionserver中的內存表,這會導致宕機的region在這段時間內無法對外提供服務。而一旦重分佈,宕機的節點起來後就相當於一個新的regionserver加入集羣,爲了平衡,需要再次將某些region分佈到該server。 因此這個超時建議根據情況進行調整,一般情況下,宕機重啓後即可恢復,如果重啓需要10分鐘,region重分佈加恢復的時間要超過5分鐘,那麼還不如等節點重啓。Region Server的內存表memstore如何在節點間做到更高的可用,是HBase的一個較大的挑戰。Oceanbase也是採用內存表保持最新的更新數據,和HBase不同的是,Oceanbase使用的是集中的UpdateServer,只需要全力做好UpdateServer的容災切換即可對業務連續性做到最小影響。分佈還是集中,哪些功能分佈,哪些功能集中,各自取不同平衡,是目前大部分分佈式數據庫或者存儲的一個主要區別。當然,像Cassandra這種全分佈的,架構上看起來很完美,實際應用起來反而問題更多。

        對於java應用,線上運維最大的挑戰之一就是heap內存管理。GC的不同方式,以及使用內存表和cache對內存的消耗,可能導致局部阻塞應用或者stop the world全局阻塞或者OOM。因此HBase的很多參數設置都是針對這兩種情況。HBase使用了較新的CMS GC(-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode)。

默認觸發GC的時機是當年老代內存達到90%的時候,這個百分比由 -XX:CMSInitiatingOccupancyFraction=N 這個參數來設置。concurrent mode failed發生在這樣一個場景:
當年老代內存達到90%的時候,CMS開始進行併發垃圾收集,於此同時,新生代還在迅速不斷地晉升對象到年老代。當年老代CMS還未完成併發標記時,年老代滿了,悲劇就發生了。CMS因爲沒內存可用不得不暫停mark,並觸發一次全jvm的stop the world(掛起所有線程),然後採用單線程拷貝方式清理所有垃圾對象。這個過程會非常漫長。爲了避免出現concurrent mode failed,我們應該讓GC在未到90%時,就觸發。

通過設置 -XX:CMSInitiatingOccupancyFraction=N

這個百分比, 可以簡單的這麼計算。如果你的 hfile.block.cache.size 和 hbase.regionserver.global.memstore.upperLimit 加起來有60%(默認),那麼你可以設置 70-80,一般高10%左右差不多。

(以上CMS GC的說明引自HBase性能調優

目前關於HBase的書不多,《Hadoop: The Definitive Guide》第二版有一章,另外最權威的要算官方的這本電子書了。

這篇是最近看HBase過程中的一些零碎的東西,記錄於此備忘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章