HBase 原始碼學習 Flush(4)

2021-10-19 11:19:19 字數 1789 閱讀 3339

根據前三篇文章,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的例...