HBase bulkLoad時(shí)間都花在哪?

近期工作中使用hbase bulkload向hbase導(dǎo)入2TB數(shù)據(jù)(10000個(gè)hfiles),我們發(fā)現(xiàn)將hfiles加載到hbase 表的過程用了將近一個(gè)小時(shí)。這和我對(duì)bulk load過程的理解不太相符往扔,在我的理解中,hbase bulkload并不會(huì)產(chǎn)生數(shù)據(jù)copy熊户,數(shù)據(jù)導(dǎo)入通過hdfs的mv操作完成萍膛。那么,

問題1 :是什么操作消耗了一個(gè)小時(shí)呢嚷堡?

另外蝗罗,對(duì)bulkload一直有個(gè)疑問,

問題2 :基于某個(gè)hbase cluster中的表生成的hfiles能否導(dǎo)入到其他hbase cluster中的相同表(表名和列簇都相同)中蝌戒,bulkload會(huì)自動(dòng)處理兩個(gè)集群中表的region分布差異嗎绿饵?

帶著上述兩個(gè)問題閱讀了hbase中LoadIncrementalHFiles類的代碼,本文對(duì)此做個(gè)梳理瓶颠。

run方法

LoadIncrementalHFiles的main函數(shù)調(diào)用run方法:

run方法

run方法做了三件事:

1. 初始化

2. 判斷要導(dǎo)入的表是否存在拟赊,不存在且參數(shù)create.table為yes, 則創(chuàng)建該表;不存在且create.table不為yes則拋出異常TableNotFoundException

3. 調(diào)用doBulkLoad

初始化

LoadIncrementalHFiles的初始化過程比較簡(jiǎn)單粹淋,主要是對(duì)hbase admin等對(duì)象的初始化:

Initialize方法

doBulkLoad

doBulkLoad方法執(zhí)行以下步驟:

1. 創(chuàng)建線程池

創(chuàng)建用于bulkload的線程池, 線程池大小由參數(shù)hbase.loadincremental.threads.max控制吸祟,默認(rèn)為當(dāng)前機(jī)器的core數(shù)量。源碼如下:

初始化用于bulkload的線程池

2. 初始化加載項(xiàng)隊(duì)列

遍歷指定目錄桃移,為每個(gè)hfile生成一個(gè)LoadQueueItem對(duì)象并添加到隊(duì)列中(下文我們稱此隊(duì)列為L(zhǎng)QI隊(duì)列屋匕,稱隊(duì)列中的元素為L(zhǎng)QI)中,該步驟由discoverLoadQueue方法完成借杰。

discoverLoadQueue

單個(gè)hfile的大小不應(yīng)超過HREGION_MAX_FILESIZE, 該值由參數(shù)hbase.hregion.max.filesize控制过吻,默認(rèn)為10GB。

一個(gè)LQI代表一個(gè)加載項(xiàng),LoadQueueItem類的源碼如下 :

LoadQueueItem

需要加載的文件在HDFS上按照column family被分配在不同的子目錄下纤虽,每個(gè)子目錄下的一個(gè)文件就對(duì)應(yīng)一個(gè)LQI乳绕。

discoverLoadQueue方法中調(diào)用了visitBulkHFiles方法遍歷hfile所在的HDFS目錄,visitBulkHFiles方法對(duì)每個(gè)hfile會(huì)做一系列validation :

hfile validation

過濾掉reference逼纸,link, 以'_'開頭的洋措,以及非hfile格式的文件。

3. 檢查column family的有效性

在discoverLoadQueue完成對(duì)所有hfiles的遍歷后杰刽,會(huì)對(duì)queue中所有的items進(jìn)行column family的check菠发,如果存在某個(gè)item的column family不屬于目標(biāo)表,則拋出異常:

verify column family

4. 循環(huán)分組加載

While Loop to group and load hfiles

while循環(huán)的每次迭代主要執(zhí)行g(shù)roupOrSplit和bulkLoad兩個(gè)phase的操作:

a) groupOrSplitPhase

把queue中的所有文件根據(jù)目標(biāo)表的region metadata進(jìn)行分組贺嫂,把每個(gè)文件劃分到其所屬region滓鸠。

groupOrSplitPhase

如果某個(gè)hfile的[firstkey, lastkey]不在任何region的[starkey, endkey]范圍內(nèi),則將此hfile拆分成兩個(gè)文件(拆分后的文件后綴為.top和.bottom)第喳,拆分的split key就是firstkey所在region的endkey哥力。

groupOrSplit

拆分后得到的兩個(gè)hfile會(huì)被封裝成LQI再添加回LQI隊(duì)列,這就是為什么需要一個(gè)while循環(huán)判斷LQI隊(duì)列是否為空墩弯。需注意,拆分后寞射,第一個(gè)LQI肯定會(huì)在某個(gè)region范圍內(nèi)(除非在下次迭代加載該LQI之前目標(biāo)region又發(fā)生了split)渔工,第二個(gè)LQI有可能仍需拆分。另外桥温,還要注意引矩,做完split之后,老的文件并不會(huì)刪除侵浸,所以bulkload過程結(jié)束后hfile的目錄下可能會(huì)有一些殘留文件旺韭,就是那些做了split之后留下的原始文件。

split files added back to LQI queue

groupOrSplitPhase完成之后掏觉,所有可加載的LQI都會(huì)被放到regionGroups中区端。regionGroups是一個(gè)Multimap,key為region的startkey澳腹,value為對(duì)應(yīng)的LQI织盼,一個(gè)region可對(duì)應(yīng)多個(gè)LQI。

b) bulkLoadPhase :?

對(duì)于regionGroups中的每個(gè)key(即region的startkey)酱塔,調(diào)用方法tryAtomicRegionLoad將其對(duì)應(yīng)的所有LQI加載到目標(biāo)table中沥邻。如果加載失敗,則將failed LQI再加入到LQI隊(duì)列中羊娃,供下一循環(huán)檢測(cè)和加載唐全。tryAtomicRegionLoad方法會(huì)連接hbase region server,發(fā)送SecureBulkLoadHFilesRequest請(qǐng)求蕊玷。

groupOrSplit和bulkLoad的操作都是通過上面創(chuàng)建的線程池對(duì)所有hfile并發(fā)執(zhí)行的邮利。除了這兩個(gè)phase的操作外弥雹,while循環(huán)中還會(huì)檢測(cè)一些異常情況:

a) 對(duì)于doBulkLoad中while(!queue.isEmpty)循環(huán),如果經(jīng)過maxRetries次嘗試后近弟,LQI隊(duì)列仍不為空缅糟,則拋出異常。maxRetries由參數(shù)hbase.bulkload.retries.number控制祷愉,默認(rèn)為10 :

Fail after maxRetries times

b) 經(jīng)過groupOrSplitPhase后窗宦,如果regionGroups中單個(gè)region單個(gè)column family對(duì)應(yīng)的hfile個(gè)數(shù)超過了maxFilesPerRegionPerFamily,則拋出異常:


Fail in case too many files per region per column family to load

maxFilesPerRegionPerFamily由參數(shù)hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily控制二鳄,默認(rèn)為32赴涵。

問題1解答

通過上面的分析,我們知道bulkload過程對(duì)hfile目錄進(jìn)行遍歷订讼,每個(gè)hfile都會(huì)進(jìn)行一系列validation髓窜,生成LQI,最終調(diào)用tryAtomicRegionLoad進(jìn)行加載欺殿。我們通過打印每個(gè)步驟的耗時(shí)寄纵,發(fā)現(xiàn)檢測(cè)hfile文件格式,即visitBulkHFiles中調(diào)用的isHFileFormat方法是主要的耗時(shí)步驟, 這是因?yàn)関isitBulkHFiles方法是在主線程串行執(zhí)行的脖苏,我們有10000個(gè)文件程拭,并且每次isHFileFormat都會(huì)讀取hfile的file trailer,所以累計(jì)時(shí)間很長(zhǎng)棍潘。

我們通過添加一個(gè)hbase配置項(xiàng)hbase.client.bulk.load.validate.hfile.format來控制是否進(jìn)行hfile格式檢測(cè)恃鞋,當(dāng)將其設(shè)置為false時(shí),加載2TB數(shù)據(jù)(10000個(gè)hfile)從之前的1個(gè)小時(shí)縮短為10分鐘亦歉。繞過文件格式檢查的前提是我們確定hfile的format都是正確的恤浪。我們還可以通過減少hfile的個(gè)數(shù)來減少bulkload在客戶端運(yùn)行的時(shí)間。還有一個(gè)可能的解決方案是將visitBulkHFiles方法修改成多線程執(zhí)行肴楷,以后有時(shí)間可以嘗試一下水由。

問題2解答

答案是肯定的。如上文所述赛蔫,bulkload會(huì)將hfile的[firstkey, lastkey]和目標(biāo)表region的[startkey, endkey]進(jìn)行匹配绷杜,如果匹配失敗則會(huì)進(jìn)行文件拆分,所以不用擔(dān)心不同集群表中region的差異濒募。

總結(jié)

本文對(duì)hbase bulkload的客戶端過程進(jìn)行了分析鞭盟,詳述了hfile的遍歷,檢測(cè)瑰剃,分組齿诉,拆分,加載等步驟,并對(duì)文中開頭提出的兩個(gè)問題進(jìn)行了解答粤剧。

水平有限歇竟,若有誤解,望讀者指正抵恋。

說明

hbase源碼版本:1.1.2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焕议,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弧关,更是在濱河造成了極大的恐慌盅安,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世囊,死亡現(xiàn)場(chǎng)離奇詭異别瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)株憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝙寨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗤瞎,你說我怎么就攤上這事墙歪。” “怎么了贝奇?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵虹菲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我弃秆,道長(zhǎng),這世上最難降的妖魔是什么髓帽? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任菠赚,我火速辦了婚禮,結(jié)果婚禮上郑藏,老公的妹妹穿的比我還像新娘衡查。我一直安慰自己,他們只是感情好必盖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布拌牲。 她就那樣靜靜地躺著,像睡著了一般歌粥。 火紅的嫁衣襯著肌膚如雪塌忽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天失驶,我揣著相機(jī)與錄音土居,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擦耀,可吹牛的內(nèi)容都是我干的棉圈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眷蜓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼分瘾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吁系,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤德召,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后垮抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氏捞,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年冒版,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了液茎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辞嗡,死狀恐怖捆等,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续室,我是刑警寧澤栋烤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挺狰,受9級(jí)特大地震影響明郭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丰泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一薯定、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳购,春花似錦话侄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏浇,卻和暖如春变丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绢掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工锄贷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留译蒂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓谊却,卻偏偏與公主長(zhǎng)得像柔昼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炎辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • “大勇大智大氣大茘人捕透,同心同德同鑄同州魂”這是大茘賓館門前的楹聯(lián)。當(dāng)我在燈光下看到精致的石刻大字時(shí)碴萧,我就知...
    悅閱空間閱讀 488評(píng)論 0 1
  • 優(yōu)化大腦就是優(yōu)化生命破喻。歡迎閱讀《如何在喧囂的世界中獲得安寧》虎谢。今天聊聊精神訓(xùn)練法之科學(xué)冥想。 01 在諸多精神訓(xùn)練...
    Anyi安逸閱讀 906評(píng)論 7 6
  • 本學(xué)期回歸正常曹质,回到代碼模式婴噩。
    WarrenWJQ閱讀 197評(píng)論 0 1
  • 一、理解Linux的單用戶多任務(wù)羽德,多用戶多任務(wù)概念 Linux 是一個(gè)多用戶几莽、多任務(wù)的操作系統(tǒng);我們應(yīng)該了解單用戶...
    永興呵呵噠閱讀 2,949評(píng)論 0 0