資源描述:
《Spark結(jié)合源碼解決數(shù)據(jù)傾斜造成Too-Large-Frame.docx》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Spark結(jié)合源碼解決數(shù)據(jù)傾斜造成TooLargeFrame本文章來自于阿里云云棲社區(qū)摘要:?新公司遇到的第一個spark的坑,尋找原因的過程其實還挺有意思,最終在源碼和sparkui上的統(tǒng)計數(shù)據(jù)的幫助下找到根源,具體如下。先說下問題由于嚴(yán)重的數(shù)據(jù)傾斜,大量數(shù)據(jù)集中在單個task中,導(dǎo)致shuffle過程中發(fā)生異常完整的exeception是這樣的但奇怪的是,經(jīng)過嘗試減小executor數(shù)量后任務(wù)反而成功,增大反而失敗,經(jīng)過多次測試,問題穩(wěn)定復(fù)現(xiàn)。新公司遇到的第一個spark的坑,尋找原因的過程其實還挺有意思,最終在源碼和spar
2、kui上的統(tǒng)計數(shù)據(jù)的幫助下找到根源,具體如下。先說下問題由于嚴(yán)重的數(shù)據(jù)傾斜,大量數(shù)據(jù)集中在單個task中,導(dǎo)致shuffle過程中發(fā)生異常完整的exeception是這樣的但奇怪的是,經(jīng)過嘗試減小executor數(shù)量后任務(wù)反而成功,增大反而失敗,經(jīng)過多次測試,問題穩(wěn)定復(fù)現(xiàn)。成功的executor數(shù)量是7,失敗的則是15,集群的activenode是7這結(jié)果直接改變了認(rèn)知,也沒爆內(nèi)存,cpu也夠,怎么會這樣,executor數(shù)量應(yīng)該越多越快啊,居然還失敗了。解決過程這個數(shù)在幾個失敗里不一樣,但是都超過了Integer.MaxValu
3、e。在spark源碼中,這條異常發(fā)生在TransportFrameDecoder這個類中檢查發(fā)現(xiàn)是frame的大小超過了MAX_FRAME_SIZE,而MAX_FRAME_SIZE的大小定義如下這個TransportFrameDecoder繼承自ChannelInboundHandlerAdapter,這是Netty里的類,好了,看到這就明白了,原來錯誤發(fā)生在網(wǎng)絡(luò)傳輸過程中,是數(shù)據(jù)量超大了。但是對比了成功與失敗的任務(wù),都是單個task嚴(yán)重傾斜啊。再看下兩個任務(wù)的executor分配。失敗的任務(wù)成功的任務(wù)失敗的任務(wù)里,分配到的節(jié)點上
4、都有多個executor;成功的任務(wù)里則每個節(jié)點只有一個executor。再看下stage,失敗的任務(wù)失敗在stage26,這個stage依賴于stage24??磮D說話兩個任務(wù)的stage24都是成功的,看下24的executor的數(shù)據(jù)量情況可以看到,兩個任務(wù)在這個stage上由于數(shù)據(jù)傾斜,所有數(shù)據(jù)輸入輸出都在一個executor中完成。但在stage26中,區(qū)別來了為了提升性能,在hadoop和spark中都會盡量選擇數(shù)據(jù)本地性,盡量讓數(shù)據(jù)local,不行再選擇rack等其他方案。而24的輸出會作為26的輸入。所以24之后自然會
5、選擇相同節(jié)點上的executor,看下stage26的情況成功的任務(wù)失敗的任務(wù)在成功的任務(wù)里,stage26與24的executor完全是同一個,這樣數(shù)據(jù)是完全本地化的,甚至是同一個進程,因而經(jīng)過優(yōu)化不再需要通過網(wǎng)絡(luò)傳輸而在失敗的任務(wù)里,stage26在執(zhí)行時發(fā)現(xiàn)這個node上有3個executor,為了性能的提升,將數(shù)據(jù)分配給3個executor執(zhí)行計算??梢娖渲幸渤晒α艘话?,32686這個端口的executor是24中執(zhí)行的那個,因而雖然它要處理3.3g的數(shù)據(jù),但是因為不需要網(wǎng)絡(luò)傳輸,也仍然可以成功。可是對于另外兩個,即使是同
6、一個節(jié)點,但是由于是不同進程,仍然需要通過netty的server拉取數(shù)據(jù),而這一次的拉取最大不能超過int最大值,因而失敗了一個,導(dǎo)致整個stage失敗,也就導(dǎo)致了整個job的失敗??偨Y(jié)由此可見在數(shù)據(jù)極度傾斜的情況下,增大executor的數(shù)量未見得是好事,還是要根據(jù)具體情況而來。減小了數(shù)量解決了問題,但是這其實并不是最好的解決方案,因為這種情況下,可見數(shù)據(jù)基本等同于本地執(zhí)行,完全浪費了集群的并發(fā)性,更好的解決方案還需要再繼續(xù)深入理解。