Spark踩坑vlog——使用外部存儲減輕join時數(shù)據(jù)負(fù)擔(dān)

背景

????????此次需要將10張表[A、B辆它、C誊薄、D、E锰茉、F呢蔫、G、H飒筑、I片吊、J]的數(shù)據(jù)union與表?中的一個字段進(jìn)行join,以達(dá)到篩選數(shù)據(jù)的目的协屡;其中表A的數(shù)據(jù)量約為320億俏脊,其余9個表各自數(shù)據(jù)量約為20億,表?的數(shù)據(jù)量約為900萬肤晓;
????????資源使用情況上升至100 executor-nums * 3 executor-core * 20G executor-memory爷贫,但還是卡在join的stage上认然,重復(fù)失敗多次后,整個job失斅选卷员;

實現(xiàn)方法

方法1

val tableArr = Array("table_a_name", "table_b_name", "table_c_name", "", "table_d_name", "table_e_name", "table_f_name", "table_g_name", "table_h_name", "table_i_name", "table_j_name")
val data_df = tableArr.map(table_name => 
    spark.sql(
        s"""
            |SELECT a, b, c
            |FROM ${table_name}
            |""".stripMarigin)
).reduce(_.union(_))
val filter_table_tmp = spark.sql(
    s"""
        |SELECT a
        |FROM ?
        |""".stripMarigin)
val result = data_df.join(filter_table_tmp, Seq("a"), "inner")

????????采用上面這種代碼,通過查看作業(yè)的DAG圖腾务,發(fā)現(xiàn)程序?qū)⑶笆畟€表的數(shù)據(jù)union到一起后毕骡,再與表?進(jìn)行join;相當(dāng)于將400多億與900萬直接進(jìn)行join窑睁;
????????老辦法挺峡,1.將spark.sql.shuffle.partition的值調(diào)整到程序總executor-core的2~3倍;2.檢查join的字段在兩個表中的類型是否相同担钮;但是最終還是執(zhí)行失敵髟;
????????一直報org.apache.spark.shuffle.FetchFailedException這類錯誤箫津;果然狭姨,還是shuffle的時候,數(shù)據(jù)量太大/task多/一個task執(zhí)行的數(shù)據(jù)太多的問題苏遥;
????????如果饼拍,不想采用本次標(biāo)題的方法解決問題的同學(xué),可以看看我之前的博客:Spark踩坑vlog——join時shuffle的大坑田炭,可能會幫助你解決問題师抄;

方法2[失敗]

????????最終目的還是想將數(shù)據(jù)打散、分開計算教硫,所以叨吮,就想把這幾個表一個一個進(jìn)行join,再將join的結(jié)果union到一起瞬矩,代碼:

val filter_table_tmp = spark.sql(
    s"""
        |SELECT a
        |FROM ?
        |""".stripMarigin).cache()
val table_a_df = spark.sql(
    s"""
        |SELECT a, b, c
        |FROM table_a_name
        |""".stripMarigin)
val table_a_result_df = table_a_df.join(filter_table_tmp, Seq("a"), "inner")
val table_b_df = spark.sql(
    s"""
        |SELECT a, b, c
        |FROM table_b_name
        |""".stripMarigin)
val table_b_result_df = table_b_df.join(filter_table_tmp, Seq("a"), "inner")
......
val result = table_a_result_df.union(table_b_result_df)......

????????本以為采用以上代碼茶鉴,可以把每個表的join分別計算,結(jié)果誰承想景用,通過查看DAG圖發(fā)現(xiàn)涵叮,Spark在執(zhí)行的時候,發(fā)現(xiàn)了我們的join都拿filter_table_tmp進(jìn)行的伞插,結(jié)果跟方法1一樣割粮,先把所有數(shù)據(jù)合并到一起,然后再進(jìn)行join媚污;
????????因為無知穆刻,方法2失敗。杠步。氢伟。榜轿。。朵锣。

方法3

????????那么谬盐,最終如果想達(dá)到每個表分開join的目的,只能每次join用觸發(fā)為一個job诚些,為了方便之后的數(shù)據(jù)校驗飞傀,我選擇直接將中間數(shù)據(jù)寫入外部存儲。不太懂Spark的job诬烹、task啥劃分的同學(xué)砸烦,可以看看我之前的博客Spark的組件們[Application、Job绞吁、Stage幢痘、TaskSet、Task]家破。

val filter_table_tmp = spark.sql(
    s"""
        |SELECT a
        |FROM ?
        |""".stripMarigin).cache()
val table_a_df = spark.sql(
    s"""
        |SELECT a, b, c
        |FROM table_a_name
        |""".stripMarigin)
table_a_df.join(filter_table_tmp, Seq("a"), "inner").createOrReplaceTempView("table_a_result_tmp")
spark.sql(
    s"""
        |INSERT OVERWRITE TABLE temporary_storage_table_name PARTITION(event = "a")
        |SELECT *
        |FROM table_a_result_tmp
        |""".stripMarigin)
......
val result = spark.sql(
    s"""
        |SELECT *
        |FROM temporary_storage_table_name
        |""".stripMarigin)

????????最后颜说,一個表join生成一個job,除了表A執(zhí)行時數(shù)據(jù)大汰聋,耗時比較久一點外门粪,數(shù)據(jù)可算是跑出來了。
????????因為程序按照job順序執(zhí)行烹困,所以在每次對一個表進(jìn)行join時玄妈,程序所有的資源都會用來執(zhí)行一個表的數(shù)據(jù),降低了數(shù)據(jù)量髓梅,完成了"少量多次"的理念拟蜻。缺點就是,job太多女淑,采用了外部存儲,增加了IO寫入讀取時間 & 增加了job調(diào)度時間辜御;但是相比于同資源下數(shù)據(jù)跑不出來鸭你,這些延遲都是可以接受的。
????????此坑完結(jié)擒权,撒花??~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袱巨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碳抄,更是在濱河造成了極大的恐慌愉老,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剖效,死亡現(xiàn)場離奇詭異嫉入,居然都是意外死亡焰盗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門咒林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熬拒,“玉大人,你說我怎么就攤上這事垫竞∨焖冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵欢瞪,是天一觀的道長活烙。 經(jīng)常有香客問我,道長遣鼓,這世上最難降的妖魔是什么啸盏? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮譬正,結(jié)果婚禮上宫补,老公的妹妹穿的比我還像新娘。我一直安慰自己曾我,他們只是感情好粉怕,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抒巢,像睡著了一般贫贝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉谜,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天稚晚,我揣著相機與錄音,去河邊找鬼型诚。 笑死客燕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狰贯。 我是一名探鬼主播也搓,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涵紊!你這毒婦竟也來了傍妒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤摸柄,失蹤者是張志新(化名)和其女友劉穎颤练,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱负,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗦玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年患雇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踏揣。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡庆亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捞稿,到底是詐尸還是另有隱情又谋,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布娱局,位于F島的核電站彰亥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衰齐。R本人自食惡果不足惜任斋,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耻涛。 院中可真熱鬧废酷,春花似錦、人聲如沸抹缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卓研。三九已至趴俘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奏赘,已是汗流浹背寥闪。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磨淌,地道東北人疲憋。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像梁只,于是被迫代替她去往敵國和親缚柳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348