Spark:增加分区数量而不会导致shuffle?

时间:2014-11-20 12:09:10

标签: scala apache-spark

当减少分区数时,可以使用coalesce,这很好,因为它不会导致混乱并且似乎立即起作用(不需要额外的工作阶段)。 / p>

我有时会反其道而行,但是repartition引发了一场洗牌。我想几个月前我实际上通过CoalescedRDD使用balanceSlack = 1.0来实现这一点 - 所以会发生什么呢?它会分割一个分区,以便生成的分区位置在同一个节点上(所以很小)净IO)。

这种功能在Hadoop中是自动的,只需调整分割大小即可。除非减少分区数量,否则它似乎不会在Spark中以这种方式工作。我认为解决方案可能是编写一个自定义分区器以及我们定义getPreferredLocations的自定义RDD ......但我认为这是一个非常简单和常见的事情,确实必须有一个直接的做法它?

尝试过的事情:

.set("spark.default.parallelism", partitions)在我的SparkConf上,当我在阅读镶木地板的情况下,我已尝试sqlContext.sql("set spark.sql.shuffle.partitions= ...,这在1.0.0上导致错误并且不是我想要的,我想要在所有类型的工作中改变分区号,而不仅仅是随机播放。

3 个答案:

答案 0 :(得分:6)

留意这个空间

https://issues.apache.org/jira/browse/SPARK-5997

最终将实现这种非常简单明显的功能 - 我想它们在完成Dataset s中所有不必要的功能之后就会实现。

答案 1 :(得分:0)

我并不完全明白你的意思。你的意思是你现在有5个分区,但是在下一个操作之后你想要将数据分配到10个?因为有10个,但仍然使用5没有多大意义......将数据发送到新分区的过程必须在某个时候发生。

在执行coalesce时,您可以删除未分配的分区,例如:如果您最初有100个,但是在reduceByKey之后有10个(因为只有10个键),您可以设置{{1 }}

如果您希望该过程采用其他方式,您可以强行进行某种分区:

coalesce

我不确定这是你在找什么,但希望如此。

答案 2 :(得分:-1)

您知道pyspark使用某种“惰性”运行方式。它仅在需要执行某些操作时(例如“ df.count()”或“ df.show()”)进行计算。因此,您可以在这些操作之间定义一个随机分配分区。 / p>

您可以写:

sparkSession.sqlContext().sql("set spark.sql.shuffle.partitions=100")
# you spark code here with some transformation and at least one action
df = df.withColumn("sum", sum(df.A).over(your_window_function))
df.count() # your action

df = df.filter(df.B <10)
df = df.count()   

sparkSession.sqlContext().sql("set spark.sql.shuffle.partitions=10")
# you reduce the number of partition because you know you will have a lot 
# less data
df = df.withColumn("max", max(df.A).over(your_other_window_function))
df.count() # your action