根據前三篇文章,hbase flush主要分三個階段,snapshot,flush,commit,這篇深入hbase memstore,梳理snapshot的流程。
volatile section activesection;
volatile section snapshotsection;
memstore 主要包含這兩個section,寫入的cell儲存在activesection中,volatile關鍵字保證執行緒可見性。接下來是snapshot方法:
@override
public memstoresnapshot snapshot()
else
} memstoresnapshot memstoresnapshot =
newmemstoresnapshot
(this
.snapshotid,
snapshotsection.
getcellscount()
.get()
, snapshotsection.
getheapsize()
.get()
, snapshotsection.
gettimerangetracker()
,new
collectionbackedscanner
(snapshotsection.
getcellskiplistset()
,this
.comparator)
,this
.tagspresent)
;this
.tagspresent =
false
;return memstoresnapshot;
}
snapshot ()方法直接將activesection的引用賦值給snapshotsection,然後重新構造乙個activesection。舊snapshotsection將會在gc的時候被**。
section 是defaultmemstore中的靜態內部類,其構造方法如下:
private
section
(final keyvalue.kvcomparator c,
final configuration conf,
long initheapsize)
,new
object
);}else
}
其使用乙個cellskiplistset存放cell。分配記憶體涉及到乙個類,heapmemstorelab,lab是local allocation buffer的縮寫。lab保證memstore中的cell都存在大塊的chunk中,這樣,在flush之後,記憶體是以大塊chunk為單位進行釋放,減少regionserver中的記憶體碎片。涉及四個超引數:
引數名含義
預設值hbase.hregion.memstore.mslab.enabled
是否使用lab
true
hbase.regionserver.mslab.class
lab具體實現類
heapmemstorelab
hbase.hregion.memstore.mslab.chunksize
乙個chunk的大小
2048 * 1024 b
hbase.hregion.memstore.mslab.max.allocation
lab一次分配記憶體的最大bytes
256 * 1024 b
HBase原始碼之HRegionServer
hregionserver是hbase中提供資料訪問服務的核心部件。1 由如下執行緒提供支撐 1 logroller 日誌切換執行緒,週期性的檢查hlog是否需要切換,需要的話進行切換 2 flusher 資料快取重新整理執行緒,快取到一定程度寫入到磁碟 3 compactsplitthread 資...
HBase限流機制原始碼分析
master啟動的時候會初始化masterquotamanager,並啟動該manager masterquotamanager實現了regionstatelistener介面,可以監聽region的狀態變化,regionstatelistener介面中定義了三個事件,分別是onregionspli...
HBase原始碼閱讀 3 HRegionServer
3.hregionserver 管理regions,並向hmaster報告自己狀態 3.1 regionserver啟動過程 1 讀取一些配置 機器名,埠,客戶端重試次數,與master互動間隔,rpc超時 2 建立worker執行緒處理來自master的請求 3 建立乙個hbaseserver的例...