当减少分区数时,可以使用coalesce
,这是很棒的,因为它不会引起混洗并且可以立即工作(不需要额外的工作阶段)。
有时候我想做相反的事情,但是repartition
引起了洗牌。我想几个月前,我实际上是通过将CoalescedRDD
与balanceSlack = 1.0
一起使用来完成此工作的-所以会发生的事情是将一个分区分割成一个分区,以使最终的分区位置位于同一节点上(如此小的网络IO)。
Hadoop中这种功能是自动的,只需调整拆分大小即可。除非减少分区数量,否则它似乎无法在Spark中以这种方式工作。我认为解决方案可能是编写一个自定义分区程序以及一个自定义RDD,在其中定义getPreferredLocations
...。但是我认为这是一件简单而又常见的事情,可以肯定肯定有一种简单的方法吗?
尝试过的事情:
我的.set("spark.default.parallelism", partitions)
上的SparkConf
,并且在阅读 Parquet 的情况下尝试了sqlContext.sql("set spark.sql.shuffle.partitions= ...
,它在1.0.0上导致错误并且并不真正想要我,我希望分区号在所有类型的作业中都发生变化,而不仅仅是随机播放。
最佳答案
关注此空间
https://issues.apache.org/jira/browse/SPARK-5997
这种真正简单的显而易见的功能最终将被实现-我猜想在它们完成Dataset
中所有不必要的功能之后。
关于scala - Spark:增加分区数量而不引起随机播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039246/