Hbase的flush機制


Hbase Flush機制
最小Flush單元為HRegion,盡量減少CF數量以減少HStrore數量從而減少MemStore的數量,最終減少每次Flush的開銷。
1.Region級別觸發條件:
    a)    hbase.hregion.memstore.flush.size
        Region中任意MemStore大小達到上限(默認128MB),觸發Memstore,flush該region。
    b)    hbase.hstore.blockingStoreFiles 默認值:7
        當前region的Storefile總數超過閾值,則該Region會block所有寫請求進行compaction,以減少storefile數量直到完成一次存儲文件的合並,或者阻塞到hbase.hstore.blockingWaitTime 超時才解除block。
        當該region的一個store的storefile大小之和,即一個store的大小超過hbase.hregion.max.filesize時,這個region會被拆分。slit的入口在memstore flush操作之后,HRegion寫入新的Hfile或者HStore剛剛進行完compact操作后,
        HBase就會調用CompactSplitThread.requestSplit判斷是否需要split操作。這個判斷如下:
判斷整個HRegionServer所有的HRegion數量是否超過hbase.regionserver.regionSplitLimit(默認Integer.MAX_VALUE,即沒有限制)。
當前HRegion所有HStore中包含的HFile最小數是否>=1
嘗試獲取SplitKey:hbase:meta表(記錄HRegion信息的HBase表,只有單個HRegion)、或是正在恢復狀態的HRegion返回null。
然后利用設置的策略判斷是否需要split操作。一般使用兩種策略:ConstantSizeRegionSplitPolicy以及IncreasingToUpperBoundRegionSplitPolicy(默認)。
ConstantSizeRegionSplitPolicy:如果某個不包含Reference文件的HStore(Reference文件是split后產生的臨時引用文件,見后述),總大小(包含HFile的總大小)超過hbase.hregion.max.filesize(默認10G),則返回true。
IncreasingToUpperBoundRegionSplitPolicy:對於HRegionServer內所有屬於同一個表的HRegion的數n,如果某個不包含Reference文件的HStore,總大小超過[n*n*n*2*MemStoreFlushSize和hbase.hregion.max.filesize(10G)之間最小值],則返回true。
例如,對於如果n=3,則split大小為3^3*2*128M=6912M。可見如果Region數比較少的時候的可以盡早采取split。
返回SplitPoint。返回HRegion里總大小最大HStore的最大HFile的中間rowKey值。
    c)    hbase.hregion.memstore.block.multiplier默認值:2
2.RegionServer全局性的觸發刷寫:
    a)    hbase.regionserver.global.memstore.upperLimit
    b)    hbase.regionserver.global.memstore.lowerLimit
    c)    HLog引起的regionserver全局性的觸發刷寫
    d)    HBase定期刷新Memstore
Memstore Flush流程
?    prepare階段:
遍歷當前Region中的所有Memstore,將Memstore中當前數據集kvset做一個快照snapshot,然后再新建一個新的kvset。
后期的所有寫入操作都會寫入新的kvset中,而整個flush階段讀操作會首先分別遍歷kvset和snapshot,如果查找不到再會到HFile中查找。prepare階段需要加一把updateLock對寫請求阻塞,結束之后會釋放該鎖。因為此階段沒有任何費時操作,因此持鎖時間很短。
?    flush階段:
遍歷所有Memstore,將prepare階段生成的snapshot持久化為臨時文件,臨時文件會統一放到目錄.tmp下。這個過程因為涉及到磁盤IO操作,因此相對比較耗時。
?    commit階段:
遍歷所有的Memstore,將flush階段生成的臨時文件移到指定的ColumnFamily目錄下,針對HFile生成對應的storefile和Reader,把storefile添加到HStore的storefiles列表中,最后再清空prepare階段生成的snapshot。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM