深入淺出系列Hbase之memstore flush、compaction

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>

 

 

 

 

 

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