S.K*_*ang 5 partitioning apache-spark rdd
当我使用reduceByKey或者aggregateByKey,我遇到了分区问题.
EX)reduceBykey(_+_).map(code)
特别是,如果输入数据偏斜,则在使用上述方法时分区问题变得更糟.
所以,作为解决方案,我使用repartition方法.
例如,http://dev.sortable.com/spark-repartition/与此类似.
这对于分区分发很有用,但repartition也很昂贵.
有没有办法明智地解决分区问题?
你是对的,
重新分区的运行成本确实很高。由于洗牌和其他小步骤。创建一个示例,如您的示例所示:
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速度要快得多。因为你可以少洗牌一次。
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |