繁体   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