簡體   English   中英

一個作業在Spark-SQL(1.3.1)中的多個左聯接上花費的時間非常長

[英]one job takes extremely long on multiple left join in Spark-SQL (1.3.1)

UPD:這個問題不再有效,因為事實證明100個表中有兩個表的行比其余表(有500個)多幾個數量級。 當消除“壞”表時,聯接將公平分配並在可預測的時間內完成。


我有大約100個Spark DataFrame,每個<= 500行,但是大小大致相同(計划以后有成千上萬的行)。 所有列的條目的id是第一個(參考)表的id的子集。

我想通過id將所有表外部連接到第一個表。 我這樣做(在pyspark中):

df1.join(df2, df2.id == df1.id, 'left_outer')
   .join(df3, df3.id == df1.id, 'left_outer')
   ...

此加入操作將產生200個作業,所有這些作業僅在幾秒鍾內完成。 但是,最后一項工作耗時極長(一個小時左右),並且僅在一個處理器上運行(顯然)。 Spark Web UI揭示此工作已獲取太多隨機記錄。

為什么會發生這種情況,如何更好地調整Spark以避免發生這種情況?


在此處輸入圖片說明


查詢“解釋select * from ...左外部聯接... ...”看起來如下:

== Physical Plan ==
Project [id#0, ... rest of the columns (~205) ...]
 HashOuterJoin [id#0], [id#370], LeftOuter, None
  HashOuterJoin [id#0], [id#367], LeftOuter, None
   HashOuterJoin [id#0], [id#364], LeftOuter, None
    ...
   Exchange (HashPartitioning [id#364], 200)
    Project [...cols...]
     PhysicalRDD [...cols...], MapPartitionsRDD[183] at map at newParquet.scala:542
  Exchange (HashPartitioning [id#367], 200)
   Project [...cols...]
    PhysicalRDD [..cols...], MapPartitionsRDD[185] at map at newParquet.scala:542
 Exchange (HashPartitioning [id#370], 200)
  Project [...cols...]
   PhysicalRDD [...cols...], MapPartitionsRDD[187] at map at newParquet.scala:542

加入后使用重新分區可能會有所幫助。

我遇到過類似的情況。 加入兩個具有200個分區的df,然后再次加入,它永遠不會結束。

我試圖將repartition(50)添加到將要加入的DF中,然后它起作用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM