hive小文件合并問題

背景

Hivequery將運(yùn)算好的數(shù)據(jù)寫回hdfs(比如insert into語句)踩蔚,有時(shí)候會(huì)產(chǎn)生大量的小文件檬输,如果不采用CombineHiveInputFormat就對這些小文件進(jìn)行操作的話會(huì)產(chǎn)生大量的map task,耗費(fèi)大量集群資源涩拙,而且小文件過多會(huì)對namenode造成很大壓力际长。所以Hive在正常job執(zhí)行完之后,會(huì)起一個(gè)conditional task兴泥,來判斷是否需要合并小文件工育,如果滿足要求就會(huì)另外啟動(dòng)一個(gè)map-only job 或者mapred job來完成合并

參數(shù)解釋

hive.mergejob.maponly (默認(rèn)為true)

如果Hadoop版本支持CombineFileInputFormat,則啟動(dòng)Map-only job for merge搓彻,否則啟動(dòng) ?MapReduce merge job如绸,map端combine file是比較高效的做法

hive.merge.mapfiles(默認(rèn)為true)

正常的map-only job后,是否啟動(dòng)merge job來合并map端輸出的結(jié)果

hive.merge.mapredfiles(默認(rèn)為false)

正常的map-reduce job后旭贬,是否啟動(dòng)merge job來合并reduce端輸出的結(jié)果怔接,建議開啟

hive.merge.smallfiles.avgsize(默認(rèn)為16MB)

如果不是partitioned table的話,輸出table文件的平均大小小于這個(gè)值稀轨,啟動(dòng)merge job扼脐,如果是partitioned table,則分別計(jì)算每個(gè)partition下文件平均大小奋刽,只merge平均大小小于這個(gè)值的partition瓦侮。這個(gè)值只有當(dāng)hive.merge.mapfiles或hive.merge.mapredfiles設(shè)定為true時(shí)艰赞,才有效

hive.exec.reducers.bytes.per.reducer(默認(rèn)為1G)

如果用戶不主動(dòng)設(shè)置mapred.reduce.tasks數(shù),則會(huì)根據(jù)input directory計(jì)算出所有讀入文件的input summary size肚吏,然后除以這個(gè)值算出reduce number

reducers = (int) ((totalInputFileSize + bytesPerReducer - 1) / bytesPerReducer);

reducers = Math.max(1, reducers);

reducers = Math.min(maxReducers, reducers);

hive.merge.size.per.task(默認(rèn)是256MB)

merge job后每個(gè)文件的目標(biāo)大蟹窖(targetSize),用之前job輸出文件的total size除以這個(gè)值罚攀,就可以決定merge job的reduce數(shù)目党觅。merge job的map端相當(dāng)于identity map,然后shuffle到reduce坞生,每個(gè)reduce dump一個(gè)文件仔役,通過這種方式控制文件的數(shù)量和大小

MapredWork work = (MapredWork) mrTask.getWork();

if (work.getNumReduceTasks() > 0) {

int maxReducers = conf.getIntVar(HiveConf.ConfVars.MAXREDUCERS);

int reducers = (int) ((totalSize +targetSize - 1) / targetSize);

reducers = Math.max(1, reducers);

reducers = Math.min(maxReducers, reducers);

work.setNumReduceTasks(reducers);

}

mapred.max.split.size(默認(rèn)256MB)

mapred.min.split.size.per.node(默認(rèn)1 byte)

mapred.min.split.size.per.rack(默認(rèn)1 byte)

這三個(gè)參數(shù)CombineFileInputFormat中會(huì)使用,Hive默認(rèn)的InputFormat是CombineHiveInputFormat是己,里面所有的調(diào)用(包括最重要的getSplits和getRecordReader)都會(huì)轉(zhuǎn)換成CombineFileInputFormat的調(diào)用又兵,所以可以看成是它的一個(gè)包裝。CombineFileInputFormat 可以將許多小文件合并成一個(gè)map的輸入卒废,如果文件很大沛厨,也可以對大文件進(jìn)行切分,分成多個(gè)map的輸入摔认。一個(gè)CombineFileSplit對應(yīng)一個(gè)map的輸入逆皮,包含一組path(hdfs路徑list),startoffset, lengths, locations(文件所在hostname list)mapred.max.split.size是一個(gè)split 最大的大小参袱,mapred.min.split.size.per.node是一個(gè)節(jié)點(diǎn)上(datanode)split至少的大小电谣,mapred.min.split.size.per.rack是同一個(gè)交換機(jī)(rack locality)下split至少的大小通過這三個(gè)數(shù)的調(diào)節(jié),組成了一串CombineFileSplit用戶可以通過增大mapred.max.split.size的值來減少M(fèi)ap Task數(shù)量

結(jié)論

hive 通過上述幾個(gè)值來控制是否啟動(dòng)merge file job抹蚀,通常是建議大家都開啟剿牺,如果是一堆順序執(zhí)行的作業(yè)鏈,只有最后一張表需要固化落地环壤,中間表用好就刪除的話晒来,可以在最后一個(gè)insert into table之前再開啟,防止之前的作業(yè)也會(huì)launch merge job使得作業(yè)變慢郑现。

上周還發(fā)現(xiàn)目前啟動(dòng)的針對RCFile的Block Merger在某種少見情況下湃崩,會(huì)生成duplicated files,Hive代碼中本身已經(jīng)考慮到這點(diǎn)接箫,所以會(huì)在Merger Task RCFileMergeMapper的JobClose函數(shù)中調(diào)用Utilities.removeTempOrDuplicateFiles(fs, intermediatePath, dpCtx), ?不過不知道為什么沒有生效攒读,還會(huì)存在重復(fù)文件,需要再研究下

Hive是否起merge job是由conditional task在運(yùn)行時(shí)決定的辛友,如果hadoop job或者h(yuǎn)ive未如預(yù)期般執(zhí)行合并作業(yè)整陌,則可以利用github上的file crush工具完成合并,它的原理也是啟動(dòng)一個(gè)mapreduce job完成合并,不過目前只支持textfile 和 sequencefile

鏈接地址:https://github.com/edwardcapriolo/filecrush

轉(zhuǎn)自:https://blog.csdn.net/apple001100/article/details/62420724

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泌辫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子九默,更是在濱河造成了極大的恐慌震放,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼修,死亡現(xiàn)場離奇詭異殿遂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乙各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門墨礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耳峦,你說我怎么就攤上這事恩静。” “怎么了蹲坷?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵驶乾,是天一觀的道長。 經(jīng)常有香客問我循签,道長级乐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任县匠,我火速辦了婚禮风科,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乞旦。我一直安慰自己贼穆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布杆查。 她就那樣靜靜地躺著扮惦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亲桦。 梳的紋絲不亂的頭發(fā)上崖蜜,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音客峭,去河邊找鬼豫领。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舔琅,可吹牛的內(nèi)容都是我干的等恐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼课蔬!你這毒婦竟也來了囱稽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤二跋,失蹤者是張志新(化名)和其女友劉穎战惊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扎即,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吞获,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谚鄙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片各拷。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闷营,靈堂內(nèi)的尸體忽然破棺而出烤黍,到底是詐尸還是另有隱情,我是刑警寧澤粮坞,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布蚊荣,位于F島的核電站,受9級特大地震影響莫杈,放射性物質(zhì)發(fā)生泄漏互例。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一筝闹、第九天 我趴在偏房一處隱蔽的房頂上張望媳叨。 院中可真熱鬧,春花似錦关顷、人聲如沸糊秆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痘番。三九已至,卻和暖如春平痰,著一層夾襖步出監(jiān)牢的瞬間汞舱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工宗雇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昂芜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓赔蒲,卻偏偏與公主長得像泌神,于是被迫代替她去往敵國和親良漱。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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