簡體   English   中英

Spark:增加分區數量而不會導致shuffle?

[英]Spark: increase number of partitions without causing a shuffle?

當減少分區的數量時,可以使用coalesce ,這很好,因為它不會導致混亂並且似乎立即工作(不需要額外的工作階段)。

我有時會反其道而行之,但repartition導致洗牌。 我想幾個月前我實際上通過使用帶有balanceSlack = 1.0 CoalescedRDD來實現這一點 - 所以會發生什么呢?它會分割一個分區,以便生成的分區位置在同一個節點上(所以小的網絡IO)。

這種功能在Hadoop中是自動的,只需調整分割大小即可。 除非減少分區數量,否則它似乎不會在Spark中以這種方式工作。 我認為解決方案可能是編寫自定義分區器以及我們定義getPreferredLocations的自定義RDD ......但我認為這樣做是如此簡單和常見,確實必須有一種直接的方法來做到這一點?

事情嘗試:

我的SparkConf上的.set("spark.default.parallelism", partitions) ,當在閱讀鑲木地板的上下文中我嘗試過sqlContext.sql("set spark.sql.shuffle.partitions= ... ,在1.0上.0會導致錯誤並且不是我想要的,我希望分區號可以在所有類型的作業中更改,而不僅僅是隨機播放。

關注此空間

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

這種非常簡單明顯的功能最終將被實現 - 我猜他們完成了Dataset集中所有不必要的功能之后。

我不完全明白你的意思。 你的意思是你現在有5個分區,但是在下一個操作之后你想要將數據分配到10個? 因為有10個,但仍然使用5沒有多大意義......將數據發送到新分區的過程必須在某個時候發生。

在進行coalesce ,你可以擺脫未使用的分區,例如:如果你最初有100個,但是在reduceByKey之后你有10個(因為那里只有10個鍵),你可以設置coalesce

如果您希望該過程采用其他方式,您可以強制進行某種分區:

[RDD].partitionBy(new HashPartitioner(100))

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

如你所知,pyspark使用某種“懶惰”的跑步方式。 它只會在有一些動作時進行計算(例如“df.count()”或“df.show()”。所以你可以做的是定義這些動作之間的一個shuffle分區。

你可以寫 :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM