一个作业在Spark-SQL(1.3.1)

时间:2015-06-12 16:31:58

标签: apache-spark apache-spark-sql pyspark

UPD:这个问题不再有效,因为事实证明,100个表中有两个表的行数比其余表多几个数量级(有500个)。当"坏"表被删除,连接公平分配并在可预测的时间内完成。

我有大约100个Spark DataFrames,< =每行500行,但大小大致相同(计划稍后会有数万行)。所有列的条目的id是第一(引用)表的id的子集。

我想通过id将所有表连接到第一个表。我这样做(在pyspark):

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

此连接操作可生成200个作业,但所有这些作业都会在几秒钟内完成。然而,最后一项工作需要很长时间(一小时左右),并且(显然)仅在一个处理器上运行。火花网页UI显示这项工作已经获得了太多的随机记录。

为什么会发生这种情况?如何调整Spark以避免这种情况?

enter image description here

查询"解释select * from ... left outer join ... ... ..."看起来如下:

== 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

1 个答案:

答案 0 :(得分:1)

加入后使用重新分区可能有所帮助。

我经历过类似的情况。 加入两个带有200个分区的dfs,然后再次加入,它永远不会结束。

我尝试将重新分区(50)添加到将加入的DF中,然后它就可以了。