中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HBase WAL源碼分析

發布時間:2021-12-09 14:04:36 來源:億速云 閱讀:153 作者:iii 欄目:大數據

這篇文章主要講解了“HBase WAL源碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“HBase WAL源碼分析”吧!

WAL(Write-Ahead Logging)是數據庫系統中保障原子性和持久性的技術,通過使用WAL可以將數據的隨機寫入變為順序寫入,可以提高數據寫入的性能。在hbase中寫入數據時,會將數據寫入內存同時寫wal日志,為防止日志丟失,日志是寫在hdfs上的。 
默認是每個RegionServer有1個WAL,在HBase1.0開始支持多個WALHBASE-5699,這樣可以提高寫入的吞吐量。配置參數為hbase.wal.provider=multiwal,支持的值還有defaultProvider和filesystem(這2個是同樣的實現)。 
WAL的持久化的級別有如下幾種:

  1. SKIP_WAL:不寫wal日志,這種可以較大提高寫入的性能,但是會存在數據丟失的危險,只有在大批量寫入的時候才使用(出錯了可以重新運行),其他情況不建議使用。

  2. ASYNC_WAL:異步寫入

  3. SYNC_WAL:同步寫入wal日志文件,保證數據寫入了DataNode節點。

  4. FSYNC_WAL: 目前不支持了,表現是與SYNC_WAL是一致的

  5. USE_DEFAULT: 如果沒有指定持久化級別,則默認為USE_DEFAULT, 這個為使用HBase全局默認級別(SYNC_WAL)

wal寫入

先看看wal寫入中的幾個主要的類 
1. WALKey:wal日志的key,包括regionName:日志所屬的region 
tablename:日志所屬的表,writeTime:日志寫入時間,clusterIds:cluster的id,在數據復制的時候會用到。 
2.WALEdit:在hbase的事務日志中記錄一系列的修改的一條事務日志。另外WALEdit實現了Writable接口,可用于序列化處理。 
3. FSHLog: WAL的實現類,負責將數據寫入文件系統 
在每個wal的寫入這里使用的是多生產者單消費者的模式,這里使用到了disruptor框架,將WALKey和WALEdit信息封裝為FSWALEntry,然后通過RingBufferTruck放入RingBuffer中。接下來看hlog的寫入流程,分為以下3步:

  1. 日志寫入緩存:由rpcHandler將日志信息寫入緩存ringBuffer.

  2. 緩存數據寫入文件系統:每個FSHLog有一個線程負責將數據寫入文件系統(HDFS)

  3. 數據同步:如果操作的持久化級別為(SYNC_WAL或者USE_DEFAULT 則需進行數據同步處理

下面來詳細說明一下各類線程是如何配合來實現這幾步操作的,

  1. rpcHandler線程負責將日志信息(FSWALEntry)寫入緩存RingBbuffer,在操作日志寫完后,rpcHandler會調用wal的sync方法,進行數據同步,其實際處理為寫入一個SyncFuture到RingBuffer,然后blocking一直到syncFuture處理完成。

  2. wal線程從緩存RingBuffer中取數據,如果為日志(FSWALEntry)就調用Writer將數據寫入文件系統,如果為SyncFuture,則由專門的同步線程來進行同步處理。 
    整體處理流程圖如下: 
    HBase WAL源碼分析

HLog的寫入

wal寫入文件系統是通過Writer來寫入的,其實際類為ProtobufLogWriter,使用的是Protobuf的格式持久化處理。使用Protobuf格式有如下優勢:

  1. 性能較高

  2. 結構更加緊湊,節省空間

  3. 方便擴展以及支持其他語言,通過其他語言來解析日志。

    寫入的日志中是按WALKey和WALEdit來依次存儲的(具體內容見前面WALKey和WALEdit類的說明),另外還將WALKey和WALEdit分別進行了壓縮處理。

wal同步過程

每個wal中有一個RingBufferEventHandler對象,其中用數組管理著多個SyncRunner線程(由參數hbase.regionserver.hlog.syncer.count配置,默認5)來進行同步處理,每個SyncRunner對象里面有一個LinkedBlockingQueue(syncFutures,大小為參數{hbase.regionserver.handler.count默認值200}*3 
另外這里的SyncFuture是每個rpcHandler線程擁有一個,由wal中的private final Map

class RingBufferEventHandler implements EventHandler<RingBufferTruck>, LifecycleAware { private final SyncRunner [] syncRunners; private final SyncFuture [] syncFutures;
    ...
} private class SyncRunner extends HasThread { private volatile long sequence; // Keep around last exception thrown. Clear on successful sync. private final BlockingQueue<SyncFuture> syncFutures;
    ...
}

這里在處理ringBuffer中的syncFuture時,不是每有一個就提交到syncRunner處理,而是按批來處理的,這里的批分2種情況:

  1. 從ringBuffer中取到的一批數據(為提高效率,在disruptor框架中是按批從ringBuffer中取數據的,具體的請看disruptor的相關文檔),如果這批數據中的syncFuture個數<{hbase.regionserver.handler.count默認值200},則按一批處理

  2. 如果這一批數據中的syncFuture個數>={hbase.regionserver.handler.count默認值200}個數,則按{hbase.regionserver.handler.count默認值200}分批處理。

如果達到了批大小,就從syncRunner數組中順序選擇下一個SyncRunner,將這批數據插入該SyncRunner的BlockingQueue中。最后由SyncRunner線程進行hdfs文件同步處理。為保證數據的不丟失,rpc請求需要保證wal日志寫入成功后才能返回,這里HBase做了一系列的優化處理的操作。

wal滾動

通過wal日志切換,這樣可以避免產生單獨的過大的wal日志文件,這樣可以方便后續的日志清理(可以將過期日志文件直接刪除)另外如果需要使用日志進行恢復時,也可以同時解析多個小的日志文件,縮短恢復所需時間。 
wal觸發切換的場景有如下幾種:

  1. SyncRunner線程在處理日志同步后,如果有異常發生,就會調用requestLogRoll發起日志滾動請求

  2. SyncRunner線程在處理日志同步后, 檢查當前在寫的wal的日志大小是否超過配置{hbase.regionserver.hlog.blocksize默認為hdfs目錄塊大小}*{hbase.regionserver.logroll.multiplier默認0.95},超過后同樣調用requestLogRoll發起日志滾動請求

  3. 每個RegionServer有一個LogRoller線程會定期滾動日志,滾動周期由參數{hbase.regionserver.logroll.period默認值1個小時}控制

這里前面2種場景調用requestLogRoll發起日志滾動請求,最終也是通過LogRoller來執行日志滾動的操作。

wal失效

當memstore中的數據刷新到hdfs后,那對應的wal日志就不需要了,FSHLog中有記錄當前memstore中各region對應的最老的sequenceId,如果一個日志中的各個region的操作的最新的sequenceId均小于wal中記錄的各個需刷新的region的最老sequenceId,說明該日志文件就不需要了,于是就會將該日志文件從./WALs目錄移動到./oldWALs目錄。這塊是在前面日志滾動完成后調用cleanOldLogs來處理的。

wal刪除

由于wal日志還會用于跨集群的同步處理,所以wal日志失效后并不會立即刪除,而是移動到oldWALs目錄。由HMaster中的LogCleaner這個Chore線程來負責wal日志的刪除,在LogCleaner內部通過參數{hbase.master.logcleaner.plugins}以插件的方式來篩選出可以刪除的日志文件。目前配置的插件有ReplicationLogCleaner、SnapshotLogCleaner和TimeToLiveLogCleaner

  1. TimeToLiveLogCleaner: 日志文件最后修改時間在配置參數{hbase.master.logcleaner.ttl默認600秒}之前的可以刪除

  2. ReplicationLogCleaner:如果有跨集群數據同步的需求,通過該Cleaner來保證那些在同步中的日志不被刪除

  3. SnapshotLogCleaner: 被表的snapshot使用到了的wal不被刪除

感謝各位的閱讀,以上就是“HBase WAL源碼分析”的內容了,經過本文的學習后,相信大家對HBase WAL源碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

改则县| 克拉玛依市| 金塔县| 宜丰县| 武安市| 民县| 黄冈市| 罗山县| 伊春市| 封丘县| 汾西县| 柳州市| 抚宁县| 平果县| 大厂| 铁力市| 高密市| 福州市| 营山县| 平凉市| 桐乡市| 安陆市| 洪湖市| 康马县| 道真| 望都县| 呼和浩特市| 阳春市| 揭西县| 宜阳县| 大石桥市| 休宁县| 岳西县| 门源| 石台县| 乡宁县| 定日县| 齐河县| 滦平县| 沐川县| 西乌|