2016-01-17 30 views
1

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

我的变换如下:

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

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

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

回答

2

我有一些意见。

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

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

  3. 变形金刚如aggregateByKey()可能会由于洗牌而导致性能问题。

看一看有关详细信息,这个问题SE:Spark : Tackle performance intensive commands like collect(), groupByKey(), reduceByKey()