【问题标题】:Spark transformation on last partitions extremely slow最后一个分区上的 Spark 转换非常慢
【发布时间】:2016-01-17 10:39:28
【问题描述】:

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

我的改造如下:

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

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

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

【问题讨论】:

    标签: scala apache-spark distributed-computing rdd


    【解决方案1】:

    我有一些观察。

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

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

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

    查看这个 SE 问题了解更多详情:Spark : Tackle performance intensive commands like collect(), groupByKey(), reduceByKey()

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2018-01-19
      • 2016-07-21
      • 2016-12-13
      • 2015-10-15
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多