2012-05-15 102 views
4

我是HBase的新手,但是我已經設置了一些關於HBase和Hadoop的知識。HBase MemStore和垃圾回收

當我正在研究HBase MemStore時,我所瞭解的MemStore是「MemStore是HBase放置必須寫入或讀取的數據的內存中的位置」。 所以,這就是爲什麼當我們想要閱讀關於memstore的時間和地點時,我們也看到關於垃圾收集的討論。

現在我的問題是,memstore的唯一目的是在內存中保存可讀寫數據?我們可以調整內存的大小以便從hbase快速回復嗎?垃圾收集配置(收集器配置)會影響memstore?我認爲這應該是肯定的。 :)

回答

5

你是對的Hbase Memstore。一般情況下,當HBase寫入內容時,首先將它寫入內存存儲(memstore),一旦這個memstore達到一定的大小*,它就會被刷新到磁盤中,存儲到一個存儲文件中(所有內容也會立即寫入日誌文件的耐用性)。

*從全局角度來看,HBase默認爲所有表的所有列族的所有區域的所有內存使用40%的堆(請參閱屬性hbase.regionserver.global.memstore.upperLimit)。如果達到此限制,它將開始刷新一些memstores,直到memstores使用的內存低於堆的至少35%(lowerLimit屬性)。這是可調的,但你需要有完美的計算來做這個改變。

是GC確實會影響到memstore,並且實際上可以通過使用Memstore本地分配緩衝區來修改此行爲。我建議你閱讀「避免完全的GC在HBase的用那種MEMSTORE本地的分配緩衝區」 3個部分的文章如下: http://www.cloudera.com/blog/2011/02/avoiding-full-gcs-in-hbase-with-memstore-local-allocation-buffers-part-1/

0

的問題是,Java作爲一種技術必須處理它創建服務器問題,刪除大量對象,同時應及時響應所有請求。根本原因是垃圾收集器,它有時候應該叫做「停止世界」並清理內存。在大堆中可能導致延遲幾秒鐘。
現在讓我們來看看爲什麼它發生在HBase以及爲什麼它必須及時做出迴應。
Memstore是區域數據的緩存。如果數據非常敏感,則會創建/刪除大量對象。因此有很多GC(垃圾收集器)壓力機。 HBase,因爲任何使用大數據集的實時系統都傾向於儘可能緩存,而且它的MemStore很大。
HBase Region Servers必須及時與ZooKeeper進行通信,讓他們知道他們還活着並避免遷移。長期的GC會阻止它。
cloudera做了什麼 - 爲MemStore實施專門的內存管理機制以避免GC暫停。 他書中的粗略描述瞭如何調整GC以使其與Region Server更好地協作。
http://books.google.co.il/books?id=Ytbs4fLHDakC&pg=PA419&lpg=PA419&dq=MemStore+garbage+collector+HBASE&source=bl&ots=b-Sk-HV22E&sig=tFddqrJtlE_nIUI3VDMEyHdgx6o&hl=iw&sa=X&ei=79CyT82BIM_48QO_26ykCQ&ved=0CHUQ6AEwCQ#v=onepage&q=MemStore%20garbage%20collector%20HBASE&f=false