HBase中數據落地到磁盤的幾個時刻

HBase的數據都是先寫到memstore中,然後纔會flush到磁盤,那麼什麼時候會觸發memstore的flush?

一、從memstore來看

當一個region的memstore中緩存的數據達到memstore的大小時,會觸發memstore級別的flush操作。memcache的size由參數hbase.hregion.memstore.flush.size指定,默認是128M。一般需要將該值調大,但並非越大越好。

二、從region來看

當region所有的memstore的size之和達到參數hbase.hregion.memstore.block.multipiler * hbase.hregion.memstore.flush.size的值時會觸發flush。參數默認值分別爲4和5242880。當需要調整這兩個參數的時候,一般選擇調整後一個參數,不動第一個。region級別的flush一般很少發生,因爲Column Family的數量一般不會超過三個(經驗值),所以正常情況下,達不到上述兩個參數的乘積。

三、從regionserver來看

  1. 當regionserver所有的memstore緩存的數據的大小之和超過低水位線時,將會觸發flush操作,且先從memstore最大的region開始flush,以此類推,直到下降到低水位線之下。
  2. 如果regionserver所有的memstore緩存的數據大小之和超過高水位線,那麼reginserver將會阻塞讀寫,並強制flush
相關參數
hbase.regionserver.global.memstore.size 默認值 0.40(百分比)
hbase.regionserver.global.memstore.size.lower.limit 0.95 (百分比)

高水位的值爲 :heapsize(堆內存)* hbase.regionserver.global.memstore.size
低水位的值爲 :heapsize(堆內存)* hbase.regionserver.global.memstore.size * hbase.regionserver.global.memstore.size.lower.limit
一般堆內存大小不超過32GB,否則指針壓縮就失效了

四、從WAL看

WAL的大小爲hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs決定,達到這個值之後,就會觸發flush。2.0之後,hbase.regionserver.hlog.blocksize的默認值由一個HDFS 的block大小變爲HDFS block的大小的兩倍了。
一般需要略大於hbase.regionserver.global.memstore.upperLimit * HBASE_HEAPSIZE,避免WAL頻繁的觸發flush。一般調大hbase.regionserver.maxlogs的值,默認是32

五、定期flush

參數hbase.regionserver.optionalcacheflushinterval默認值1h;設置爲0表示禁止自動flush;

六、手動flush

使用 flush 'tablename' 或者 flush 'regionname'對一張表或者一個region進行flush,region的名字可以在web界面看到

發佈了44 篇原創文章 · 獲贊 8 · 訪問量 9193
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章