Scala 最后一个分区上的Spark转换非常慢

Scala 最后一个分区上的Spark转换非常慢,scala,apache-spark,distributed-computing,rdd,Scala,Apache Spark,Distributed Computing,Rdd,我正在运行一个迭代算法,在每次迭代过程中,一组值被分配给一组键(1到N)。随着时间的推移,文件在密钥上的分布会变得扭曲。我注意到,经过几次迭代,在合并阶段,RDD的最后几个分区的运行速度似乎开始非常慢 我的转变如下: dataRDD_of_20000_partitions.aggregateByKey(zeroOp)(seqOp, mergeOp) .mapValues(...) .coalesce(1000, true) .collect() 这里,aggregate

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

我的转变如下:

dataRDD_of_20000_partitions.aggregateByKey(zeroOp)(seqOp, mergeOp)
    .mapValues(...)
    .coalesce(1000, true)
    .collect()
这里,aggregatebykey根据我之前分配的键(1到N)进行聚合。我可以合并分区,因为我知道我需要的分区数量,并将coalesce shuffle设置为true以平衡分区


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

我有一些观察结果

  • 您应该有适当数量的分区,以避免数据倾斜。我怀疑您的分区数少于所需的分区数。看看这个

  • collect()
    调用,将整个
    RDD
    提取到单个驱动程序节点中。有时可能会导致内存不足

  • aggregateByKey()
    这样的转换器可能会由于洗牌而导致性能问题

  • 查看此问题以了解更多详细信息: