当我使用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(使用前将#替换为@)