1. 程式人生 > >Hbaseflush處理流程

Hbaseflush處理流程

std 默認 過程 shc int all 觸發 處理流 sna

Hbaseflush處理流程

flush的處理是個生產者消費者模式,通過MemStoreFlusher.requestFlush或者requestDelayedFlush來收集請求,通過多個FlushHandler(個數由參數hbase.hstore.flusher.count配置默認值2)來進行flush處理。使用的消息隊列是用的DelayQueue
flush前會對region的狀態做一些判斷,如果為關閉或者正在flushing的不能做flush處理。
整個flush的過程可以分為如下3個階段:

    prepare階段
    方法:internalPrepareFlushCache,這裏會將region下所有的memstore都生成對應的snapshot,為防止其他的線程同時更新memstore,這裏會加上一個排它鎖。prepare的操作只是將cellSet賦值給snapshot,然後在new一個CellSkipListSet,所以這個鎖的時間會很短。
    flush階段
    將prepare後生成的所有snapshot持久化到hdfs上為一個hfile,存放在region目錄下的.tmp目錄中。
    commit階段
    將flush階段生成的臨時文件移動到對應的columnfamily目錄下,然後將這些storefile建立StoreFile對象,添加到StoreFileManager對象中,清空snapshot,註意這裏會對MemStoreLAB snapshotAllocator 做close處理,如果開啟了ChuckPool,會把這些chuck添加到chuckPool中。memstoreSize減去flush的大小,更新maxFlushedSeqId。

在flush完成成後如果需要split處理會做split處理,如果需要compact會做compact處理。
split和compact的觸發條件和處理流程後續再說。

Hbaseflush處理流程