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來看
- 當regionserver所有的memstore緩存的數據的大小之和超過低水位線時,將會觸發flush操作,且先從memstore最大的region開始flush,以此類推,直到下降到低水位線之下。
- 如果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界面看到