Memstore Flush
介紹
Memstore Flush深度解析請閱讀:http://hbasefly.com/2016/03/23/hbase-memstore-flush/
觸發條件
memstore級別限制:
當region的任意一個store的memstore的size,達到hbase.hregion.memstore.flush.size(默認128M),會觸發memstore flush操作
region級別限制:
當region所有的memstore的size和,達到hbase.hregion.memstore.block.multiplier *
hbase.hregion.memstore.flush.size= 128*4=512M
會觸發memstore flush,同時會阻塞所有的寫入該store的寫請求!
繼續對該region寫請求,會拋錯 region too busy exception異常。
regionserver級別限制:
1、當rs節點上所有的memstore的size和 ,超過低水位線閾值
hbase.regionserver內存大小
*
hbase.regionserver.global.memstore.size
*
hbase.regionserver.global.memstore.size.lower.limit
=48G*0.45*0.91=19.656G,
rs強制執行flush。先flush memstore最大的region,再第二大的,
直到總的memstore大小下降到低水位線的閾值。2、如果此時寫入非常繁忙,導致總的memstore大小hbase.regionserver內存大小
*
hbase.regionserver.global.memstore.size = 21.6G
rs會阻塞寫 讀的請求,並強制flush,達到低水位閾值(安全閾值)
hbase.regionserver.global.memstore.size.lower.limit
《==》
hbase.regionserver.global.memstore.lowerLimit
Hlog級別限制:
當rs的hlog數量達到hbase.regionserver.max.logs 32 會選擇最早的hlog的對應的一個或多個region進行flush。
定期級別限制:
hbase.regionserver.optionalcacheflushinterval 默認1h 爲避免所有的memstore在同一個時間點進行flush導致的問題,
定期的flush其實會有一定的隨機時間延時。
設置爲0 就是禁用
手動級別限制:
flush 命令 可以封裝腳本
總結:
在生產上,唯獨觸發rs級別的限制導致flush,是屬於災難級別的,會阻塞所有落在該rs節點的讀寫請求,直到總的memstore大小降到低水位線,阻塞時間較長。
其他的級別限制,只會阻塞對應的region的讀寫請求,阻塞時間較短。
Compaction
有minor compaction 小合併和major compaction 大合併
每次flush操作都是將一個memstore數據寫到HFile文件,所以hdfs上有很多的hfile文件。小文件多了對後面的讀操作有影響,所以hbase會定時將hfile文件合併。
minor compaction 小合併: 選取部分小的相鄰的hfile合併爲一個更大的hfile
major compaction 大合併:將一個store的所有的hfile文件合併一個hfile。
這個過程【重之又重】:
清理TTL過期數據
版本號超過設定的數據會被清理(put)
被刪除的數據(delete)
所以 major compaction持續時間較長,整個過程消費大量的系統資源(帶寬 和短時間的IO壓力),對上層業務會有較大的影響!
所以生產上儘可能的避免發生major compaction,一般通過關閉自動觸發大合併,改爲手動觸發,在業務低谷時期,執行。(一般在凌晨調度腳本,去執行)
我們要清楚爲什麼要合併?
隨着hflie文件越來越多,查詢需要更多的IO,讀取延遲較大。所以需要compaction,主要爲了消費帶寬和短時間的IO壓力,來換取以後查詢的低延遲。
合併作用:
合併小文件 減少文件數量 減小穩定度的延遲,消除無效數據 降低存儲空間,提高數據的本地化率
合併的觸發條件:
先判斷是否觸發小合併,再判斷是否大合併
a.memstore flush:合併根源來自flush,當memstore達到閾值或者其他條件就觸發flush,將數據寫到hflie,正是因爲文件多,才需要合併。
每次flush之後,就當前的store文件數進行校驗判斷,一旦store的總文件數超過hbase.hstore.compactionThreshold(默認3),就會觸發合併b.後臺線程定期檢查
後臺線程compactchecker 定期檢查是否需要執行合併。檢查週期爲
hbase.server.thread.wakefrequency*hbase.server.compactchecker.interval.multiplier=10000ms*1000。在不做參數修改情況的下,compactchecker 大概是2hr,46min,40s執行一次當文件小於 hbase.hstore.compaction.min.size會被立即添加到合併的隊列,當storefiles數量超過
hbase.hstore.compaction.min時,就小合併啓動。生產上:
hbase.hregion.majorcompaction 0 大合併關閉
hbase.hstore.compactionThreshold 6(默認3) 小合併
下面是HBASE與zookeeper連接時需要的文件配置優化
<!--ZooKeeper 會話超時。Hbase 把這個值傳遞改 zk 集羣,向它推薦一個會話的最大超時時間 -->
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<!--當 regionserver 遇到 ZooKeeper session expired , regionserver 將選擇 restart 而不是 abort -->
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
</property>