[英]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.