簡體   English   中英

spark如何計算hash shuffle中reducer的數量?

[英]How does spark calculate the number of reducers in a hash shuffle?

我想了解 Spark 中的哈希隨機播放。 我正在閱讀這篇文章

Hash Shuffle:每個 mapper 任務為每個單獨的 reducer 創建單獨的文件,導致集群上的文件總數為 M * R,其中 M 是“映射器”的數量,R 是“reducer”的數量。 對於大量的映射器和縮減器,這會導致很大的問題,包括輸出緩沖區大小、文件系統上打開的文件數量、創建和刪除所有這些文件的速度。 這個洗牌器的邏輯非常愚蠢:它將“reducer”的數量計算為“reduce”端的分區數量

你能幫我理解有底氣的部分嗎? 它如何知道減少側的分區數量,或者“減少側的分區數量”甚至是什么意思? 它等於spark.sql.shuffle.partitions嗎? 如果真的等於那個,那還算什么? 一個非常小的例子會很有幫助。

spark.sql.shuffle.partitions只是在未明確設置隨機播放的分區數時使用的默認值。 因此,“計算”至少會涉及檢查是否請求了特定數量的分區,或者 Spark 是否應該使用默認分區。

快速示例:

scala> df.repartition(400,col("key")).groupBy("key").avg("value").explain()
== Physical Plan ==
*(2) HashAggregate(keys=[key#178], functions=[avg(value#164)])
+- *(2) HashAggregate(keys=[key#178], functions=[partial_avg(value#164)])
   +- Exchange hashpartitioning(key#178, 400)  <<<<< shuffle across increased number of partitions
      +- *(1) Project [key#178, value#164]
         +- *(1) FileScan parquet adb.atable[value#164,key#178,othercolumns...] Batched: true, Format: Parquet, Location: PrunedInMemoryFileIndex[hdfs://ns1/hive/adb/atable/key=123..., PartitionCount: 3393, PartitionFilters: [isnotnull(key#178), (cast(key#178 as string) > 100)], PushedFilters: [], ReadSchema: struct<value:double,othercolumns...>

scala> 

在 Spark 3 及更高版本中, 自適應查詢引擎還可以插入和修改該數字,以嘗試通過合並、保留(例如ENSURE_REQUIREMENTS )或增加分區來優化執行。

編輯:旁注——你的文章很舊(2015 年是很久以前的事了:))並且談論了 SparkSQL 之前/數據幀之前的時間。 我會嘗試找到更相關的東西。

編輯 2:......但即使在那里,在評論部分,作者也理所當然地說:事實上,這里的問題更籠統。 對於 Spark 中的大多數轉換,您可以手動指定所需的輸出分區數量,這就是您的“reducer”數量......

暫無
暫無

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

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