Spark任務(wù)輸出文件過程詳解

https://blog.csdn.net/u013332124/article/details/92001346

一讲仰、Spark任務(wù)輸出文件的總過程

當(dāng)一個(gè)Job開始執(zhí)行后免姿,輸出文件的相關(guān)過程大概如下:

1、Job啟動(dòng)時(shí)創(chuàng)建一個(gè)目錄: ${output.dir}/_temporary/${appAttemptId} 作為本次運(yùn)行的輸出臨時(shí)目錄

2妒蛇、當(dāng)有task開始運(yùn)行后,會(huì)創(chuàng)建 ${output.dir}/_temporary/${appAttemptId}/_temporary/${taskAttemptId}/${fileName} 文件,后面這個(gè)task的所有輸出都會(huì)被寫到這個(gè)文件中

3狂芋、當(dāng)task運(yùn)行完后,需要檢查是否要commit憨栽,如果需要commit帜矾,會(huì)調(diào)用OutputCommitter#commitTask()方法。commit的細(xì)節(jié)后面說

4屑柔、等整個(gè)Job執(zhí)行完就調(diào)用OutputCommitter#commitJob()方法屡萤。具體的過程也在下面介紹commit時(shí)說。

output.dir表示用戶指定的輸出目錄掸宛,appAttemptId表示任務(wù)的attemptId死陆,一般從1開始一直遞增。taskAttemptId表示task的attemptId唧瘾,比如taskId是0措译,第一次運(yùn)行,這個(gè)id就是0.0饰序。
OutputCommitter 只是一個(gè)抽象類领虹,spark運(yùn)行時(shí)會(huì)從配置中獲取指定的實(shí)現(xiàn)類,如果配置中沒指定菌羽,spark默認(rèn)會(huì)使用 org.apache.hadoop.mapred.FileOutputCommitter 的實(shí)現(xiàn)掠械。

二、Commit細(xì)節(jié)分析

1注祖、commitTask 介紹

1.1猾蒂、判斷是否需要commit

當(dāng)task執(zhí)行完后,會(huì)去檢查以下狀態(tài)是晨,如果下面的條件達(dá)成肚菠,就不會(huì)執(zhí)行commit

  • ${output.dir}/_temporary/${appAttemptId}/_temporary/${taskAttempt} 目錄不存在 (說明這個(gè)task的臨時(shí)輸出目錄不存在,明顯是有問題的)
  • 如果開啟了Output commit coordination罩缴,就需要通過rpc詢問Driver是否可以commit (根據(jù)spark.hadoop.outputCommitCoordination.enabled參數(shù)蚊逢,默認(rèn)為true.如果開啟了推測(cè)執(zhí)行,這個(gè)一定要設(shè)置為true)
  • Driver的CommitCoordinator判斷task運(yùn)行失敗 (task運(yùn)行失敗就沒必要commit了)
  • Driver的CommitCoordinator判斷該task的其他attempt已經(jīng)commit過了 (如果commit的taskAttemptId和當(dāng)前一樣箫章,那么可以再次commit烙荷,說明task commit是一個(gè)冪等的操作)

1.2、task的commit細(xì)節(jié)

因?yàn)槲覀兇蟛糠智闆r下用的都是FileOutputCommitter檬寂,所以下面主要介紹一下這個(gè)類的commitTask實(shí)現(xiàn)终抽。

FileOutputCommitter的實(shí)際commitTask細(xì)節(jié)和參數(shù) mapreduce.fileoutputcommitter.algorithm.version 有關(guān)(默認(rèn)值是1)。

當(dāng)mapreduce.fileoutputcommitter.algorithm.version=1時(shí):

commit的操作是將 ${output.dir}/_temporary/${appAttemptId}/_temporary/${taskAttemptId} 重命名為 ${output.dir}/_temporary/${appAttemptId}/${taskId}

當(dāng)mapreduce.fileoutputcommitter.algorithm.version=2時(shí):

commit的操作是將 ${output.dir}/_temporary/${appAttemptId}/_temporary/${taskAttemptId} 下的文件移動(dòng)到 ${output.dir} 目錄下 (也就是最終的輸出目錄)

spark任務(wù)可以通過設(shè)置spark配置 spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2來開啟版本2的commit邏輯
在hadoop 2.7.0之前桶至,F(xiàn)ileOutputCommitter的實(shí)現(xiàn)沒有區(qū)分版本昼伴,統(tǒng)一都是使用version=1的commit邏輯。因此如果spark的hadoop依賴包版本如果低于2.7.0,設(shè)置mapreduce.fileoutputcommitter.algorithm.version=2是沒有用的

2镣屹、commitJob 介紹

Job執(zhí)行完后圃郊,會(huì)調(diào)用commitJob方法,我們還是看一下FileOutputCommitter的實(shí)現(xiàn):

commitJob的細(xì)節(jié)也和mapreduce.fileoutputcommitter.algorithm.version 參數(shù)有關(guān)(默認(rèn)值是1)

當(dāng)mapreduce.fileoutputcommitter.algorithm.version=1時(shí):

由 Driver 單線程遍歷所有 committedTaskPath女蜈,也就是${output.dir}/_temporary/${appAttemptId} 下的所有文件持舆,然后移動(dòng)到 ${output.dir} 目錄下。然后創(chuàng)建_SUCCESS表示任務(wù)結(jié)束

當(dāng)mapreduce.fileoutputcommitter.algorithm.version=2時(shí):

只需要?jiǎng)?chuàng)建_SUCCESS文件伪窖,因?yàn)檩敵鑫募趖ask執(zhí)行完后就已經(jīng)移動(dòng)到輸出目錄了

在commitJob完后吏廉,spark還會(huì)執(zhí)行cleanupJob將${output.dir}/_temporary 目錄刪除

三、V1和V2 commiter版本比較

mapreduce.fileoutputcommitter.algorithm.version 參數(shù)對(duì)文件輸出有很大的影響惰许,下面總結(jié)一下兩種版本在各方面的優(yōu)缺點(diǎn)席覆。

1、性能方面

v1在task結(jié)束后只是將輸出文件拷到臨時(shí)目錄汹买,然后在job結(jié)束后才由Driver把這些文件再拷到輸出目錄佩伤。如果文件數(shù)量很多,Driver就需要不斷的和NameNode做交互晦毙,而且這個(gè)過程是單線程的生巡,因此勢(shì)必會(huì)增加耗時(shí)。如果我們碰到有spark任務(wù)所有task結(jié)束了但是任務(wù)還沒結(jié)束见妒,很可能就是Driver還在不斷的拷文件孤荣。

v2在task結(jié)束后立馬將輸出文件拷貝到輸出目錄,后面Job結(jié)束后Driver就不用再去拷貝了。

因此盐股,在性能方面钱豁,v2完勝v1。

2疯汁、數(shù)據(jù)一致性方面

v1在Job結(jié)束后才批量拷文件牲尺,其實(shí)就是兩階段提交,它可以保證數(shù)據(jù)要么全部展示給用戶幌蚊,要么都沒展示(當(dāng)然谤碳,在拷貝過程中也無法保證完全的數(shù)據(jù)一致性,但是這個(gè)時(shí)間一般來說不會(huì)太長)溢豆。如果任務(wù)失敗蜒简,也可以直接刪了_temporary目錄,可以較好的保證數(shù)據(jù)一致性漩仙。

v2在task結(jié)束后就拷文件臭蚁,就會(huì)造成spark任務(wù)還未完成就讓用戶看到一部分輸出,這樣就完全沒辦法保證數(shù)據(jù)一致性了讯赏。另外垮兑,如果任務(wù)在輸出過程中失敗,就會(huì)有一部分?jǐn)?shù)據(jù)成功輸出漱挎,一部分沒輸出的情況系枪。

因此在數(shù)據(jù)一致性方面,v1完勝v2

3磕谅、總結(jié)

很明顯私爷,如果我們執(zhí)著于性能,不在乎數(shù)據(jù)輸出時(shí)的一致性膊夹,完全可以將mapreduce.fileoutputcommitter.algorithm.version設(shè)置為2來提高性能衬浑。

但是如果我們對(duì)輸出要求很高的數(shù)據(jù)一致性,那么最好不要為了性能將mapreduce.fileoutputcommitter.algorithm.version設(shè)置為2放刨。

參考資料

https://issues.apache.org/jira/browse/MAPREDUCE-4815

https://zhuanlan.zhihu.com/p/45351972

https://mp.weixin.qq.com/s?__biz=MzU3NTE2NzAxNQ==&mid=2247484099&idx=1&sn=0a0a3a1f407d30a22dcfbd85fab488e6&chksm=fd260d8bca51849d94e8df9f2249462d5a5dfc8079c45b4d9ab489aaea77c0ce14108a948f94&token=2064668791&lang=zh_CN#rd

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末工秩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子进统,更是在濱河造成了極大的恐慌助币,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟碎,死亡現(xiàn)場(chǎng)離奇詭異眉菱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掉分,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門俭缓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來克伊,“玉大人,你說我怎么就攤上這事华坦≡复担” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵季春,是天一觀的道長。 經(jīng)常有香客問我消返,道長载弄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任撵颊,我火速辦了婚禮宇攻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倡勇。我一直安慰自己逞刷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布妻熊。 她就那樣靜靜地躺著夸浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扔役。 梳的紋絲不亂的頭發(fā)上帆喇,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音亿胸,去河邊找鬼坯钦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侈玄,可吹牛的內(nèi)容都是我干的婉刀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼序仙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼突颊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潘悼,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤洋丐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挥等,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體友绝,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肝劲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迁客。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郭宝。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掷漱,靈堂內(nèi)的尸體忽然破棺而出粘室,到底是詐尸還是另有隱情,我是刑警寧澤卜范,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布衔统,位于F島的核電站,受9級(jí)特大地震影響海雪,放射性物質(zhì)發(fā)生泄漏锦爵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一奥裸、第九天 我趴在偏房一處隱蔽的房頂上張望险掀。 院中可真熱鬧,春花似錦湾宙、人聲如沸樟氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埠啃。三九已至,卻和暖如春伟恶,著一層夾襖步出監(jiān)牢的瞬間霸妹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工知押, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叹螟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓台盯,卻偏偏與公主長得像罢绽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子静盅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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