最后一个分区上的Spark转换速度极慢

时间:2016-01-17 10:39:28

标签: scala apache-spark distributed-computing rdd

我正在运行迭代算法,其中在每次迭代期间,每个值的列表被分配一组键(1到N)。随着时间的推移,文件在键上的分布变得歪曲。我注意到经过几次迭代,合并阶段后,事情似乎开始在我的RDD的最后几个分区上运行得非常慢。

我的转变如下:

dataRDD_of_20000_partitions.aggregateByKey(zeroOp)(seqOp, mergeOp)
    .mapValues(...)
    .coalesce(1000, true)
    .collect()

这里,aggregatebykey聚合我之前指定的键(1到N)。我可以合并分区,因为我知道我需要的分区数量,并将coalesce shuffle设置为true以平衡分区。

有人能指出这些转换可能导致RDD的最后几个分区处理缓慢的原因吗?我想知道这部分是否与数据偏差有关。

1 个答案:

答案 0 :(得分:2)

我有一些观察。

  1. 您应该拥有正确数量的分区以避免数据偏斜。我怀疑你的分区数少于所需的分区数。看看这个blog

  2. collect()调用,将整个RDD提取到单个驱动程序节点。它可能会导致OutOfMemory一些。

  3. aggregateByKey()这样的变形金刚可能会因洗牌而导致性能问题。

  4. 查看此SE问题以获取更多详细信息:Spark : Tackle performance intensive commands like collect(), groupByKey(), reduceByKey()