溫馨提示×

溫馨提示×

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

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

如何理解HBase中的HFile合并過程

發(fā)布時間:2021-11-23 19:00:03 來源:億速云 閱讀:348 作者:柒染 欄目:大數(shù)據(jù)

如何理解HBase中的HFile合并過程,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

HBase 根據(jù)合并規(guī)模將 Compaction 分為了兩類:MinorCompaction 和 MajorCompaction

Minor Compaction 是指選取一些小的、相鄰的StoreFile將他們合并成一個更大的StoreFile,在這個過程中不會處理已經(jīng)Deleted或Expired的Cell。一次Minor Compaction的結(jié)果是更少并且更大的StoreFile。

Major Compaction 是指將所有的StoreFile合并成一個StoreFile,這個過程還會清理三類無意義數(shù)據(jù):被刪除的數(shù)據(jù)、TTL過期數(shù)據(jù)、版本號超過設(shè)定版本號的數(shù)據(jù)。另外,一般情況下,Major Compaction時間會持續(xù)比較長,整個過程會消耗大量系統(tǒng)資源,對上層業(yè)務(wù)有比較大的影響。因此線上業(yè)務(wù)都會將關(guān)閉自動觸發(fā)Major Compaction功能,改為手動在業(yè)務(wù)低峰期觸發(fā)。

 

合并storefile的原因

數(shù)據(jù)加載到memstore,數(shù)據(jù)越來越多直到memstore占滿,再寫入硬盤storefile中,每次寫入形成一個單獨storefile,當storefile達到一定的數(shù)量后,就會開始把小storefile合并成大storefile,因為Hadoop不擅長處理小文件,文件越大性能越好。

 

什么時候合并

觸發(fā)compaction的方式有三種:Memstore刷盤、后臺線程周期性檢查、手動觸發(fā)。

1.Memstore Flush:

應該說compaction操作的源頭就來自flush操作,memstore flush會產(chǎn)生HFile文件,文件越來越多就需要compact。因此在每次執(zhí)行完Flush操作之后,都會對當前Store中的文件數(shù)進行判斷,一旦文件數(shù)大于配置,就會觸發(fā)compaction。需要說明的是,compaction都是以Store為單位進行的,而在Flush觸發(fā)條件下,整個Region的所有Store都會執(zhí)行compact,所以會在短時間內(nèi)執(zhí)行多次compaction。

2.后臺線程周期性檢查:

后臺線程定期觸發(fā)檢查是否需要執(zhí)行compaction,檢查周期可配置。線程先檢查文件數(shù)是否大于配置,一旦大于就會觸發(fā)compaction。如果不滿足,它會接著檢查是否滿足major compaction條件,簡單來說,如果當前store中hfile的最早更新時間早于某個值mcTime,就會觸發(fā)major compaction(默認7天觸發(fā)一次,可配置手動觸發(fā)),HBase預想通過這種機制定期刪除過期數(shù)據(jù)。

3.手動觸發(fā):

一般來講,手動觸發(fā)compaction通常是為了執(zhí)行major compaction,一般有這些情況需要手動觸發(fā)合并

  • 是因為很多業(yè)務(wù)擔心自動major compaction影響讀寫性能,因此會選擇低峰期手動觸發(fā);

  • 也有可能是用戶在執(zhí)行完alter操作之后希望立刻生效,執(zhí)行手動觸發(fā)major compaction;

  • 是HBase管理員發(fā)現(xiàn)硬盤容量不夠的情況下手動觸發(fā)major compaction刪除大量過期數(shù)據(jù);

 

如何排序?

由于內(nèi)存里memstore是在數(shù)據(jù)插入的過程中就排序的,就是數(shù)據(jù)插入的時候按照順序插入,所以memstore里的數(shù)據(jù)是有序的。當memstore的數(shù)據(jù)刷寫到磁盤時,生成的storefile里的數(shù)據(jù)也是有序的,這樣的話各個storefile里的數(shù)據(jù)就分別有序了。合并的時候需要將各個有序的storefile合并成一個大的有序的storefile。

首先將各個需要合并的storefile封裝成StoreFileScanner最后形成一個List加載到內(nèi)存,然后再封裝成StoreScanner對象,這個對象初始化的時候會對各個StoreFileScanner進行排序放到內(nèi)部的隊列里,排序是按照各個StoreFileScanner最小的rowkey進行排序的。然后通過StoreScanner的next()方法可以拿到各個StoreFileScanner最小rowkey中的最小rowkey對應的KV對。然后就把取出的KV對追加寫入合并后的storefile。因為每次取出的都是各個storefile里最小的數(shù)據(jù),所以追加寫入合并后的storefile里的數(shù)據(jù)就是按從小到大排序的有序數(shù)據(jù)。


在合并的過程中會做什么操作?

在合并的過程中會拋棄刪除標識的行和版本過舊的行
(1)可以預先定義版本的個數(shù),超過這個值就拋棄
(2)還可以預先定義版本的時間長短,超過這個時間就拋棄,合并完后形成更大的storefile,當達到數(shù)量再次合并,直到storefile容量超過一定閥值后會把當前的Region進行分裂為2個并由Hmaster(hbase數(shù)據(jù)庫主控節(jié)點)分配到不同的HRegionServer服務(wù)器處理實現(xiàn)負載均衡

如果在合并過程中恰好有涉及到有關(guān)storefile的查詢發(fā)生的話,我們先是把小storefile加載到內(nèi)存中進行合并此時如有用戶訪問可以在內(nèi)存中檢索相關(guān)數(shù)據(jù)返回給用戶,我們可以想象在內(nèi)存中做一個獨立鏡像備份專門提供被查詢需求,另一個主體在另一塊內(nèi)存空間里進行合并,當合并完成后釋放備份的內(nèi)存空間,返回到原來的狀態(tài)。

關(guān)于如何理解HBase中的HFile合并過程問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

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

AI