在Spark中使用reduceByKey时是否有有效的分区方法?

S.K*_*ang 5 partitioning apache-spark rdd

当我使用reduceByKey或者aggregateByKey,我遇到了分区问题.

EX)reduceBykey(_+_).map(code)

特别是,如果输入数据偏斜,则在使用上述方法时分区问题变得更糟.

所以,作为解决方案,我使用repartition方法.

例如,http://dev.sortable.com/spark-repartition/与此类似.

这对于分区分发很有用,但repartition也很昂贵.

有没有办法明智地解决分区问题?

Thi*_*dim 4

你是对的,

重新分区的运行成本确实很高。由于洗牌和其他小步骤。创建一个示例,如您的示例所示:

rdd.map(x => (x, x * x)).repartition(8).reduceByKey(_+_)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的 DAG:

在此输入图像描述

此步骤将在 DAG 上创建一个映射、一个重新分区和一个缩减。

但是,如果您在内部使用重新分区,则reduceByKey可以“免费”进行重新分区。

Repratition的主要部分是Shuffle,reduceByKey的主要部分也是shuffle。你可以看到在Scala lib中,reduceByKey有一个numPartition参数

所以你可以为此更改你的代码:

rdd.map(x => (x, x * x)).reduceByKey(_+_, 8)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以看到使用相同的代码进行重新分区,reduceByKey速度要快得多。因为你可以少洗牌一次。

在此输入图像描述