Spark中使用reduceByKey时有没有有效的分区方法?

2024-03-05

当我使用reduceByKey or aggregateByKey,我遇到了分区问题。

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

特别是,如果输入数据存在偏差,则使用上述方法时分区问题会变得更加严重。

因此,作为解决方案,我使用repartition method.

例如,http://dev.sortable.com/spark-repartition/ http://dev.sortable.com/spark-repartition/很相似。

这对于分区分布来说是有好处的,但是repartition也很贵。

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


你是对的,

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

rdd.map(x => (x, x * x)).repartition(8).reduceByKey(_+_)

请参阅此处的 DAG:

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

但是如果你使用里面的重新分区reduceByKey您可以“免费”重新分区。

Repratition的主要部分是Shuffle,reduceByKey的主要部分也是shuffle。你可以看到在 Scala lib 中,reduceByKey有一个 numPartition范围 https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions@reduceByKey(func:(V,V)=%3EV,numPartitions:Int):org.apache.spark.rdd.RDD%5B(K,V)%5D.

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

rdd.map(x => (x, x * x)).reduceByKey(_+_, 8)

您可以在以下位置看到与重新分区相同的代码reduceByKey它要快得多。因为你可以少洗牌一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark中使用reduceByKey时有没有有效的分区方法? 的相关文章

随机推荐