簡體   English   中英

Spark SQL Shuffle 分區的區別

[英]Difference in Spark SQL Shuffle partitions

我試圖了解 Spark Sql Shuffle Partitions 默認設置為 200。 數據如下所示,后面是為這兩種情況創建的分區數。

scala> flightData2015.show(3)
+-----------------+-------------------+-----+
|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count|
+-----------------+-------------------+-----+
|    United States|            Romania|   15|
|    United States|            Croatia|    1|
|    United States|            Ireland|  344|
+-----------------+-------------------+-----+

scala> println(flightData2015.sort("DEST_COUNTRY_NAME").rdd.getNumPartitions)
104

scala> println(flightData2015.groupBy("DEST_COUNTRY_NAME").count().rdd.getNumPartitions)
200

這兩種情況都會導致一個 Shuffle 階段,這應該會產生 200 個分區(默認值)。 有人可以解釋為什么有區別嗎?

根據 Spark 文檔,有兩種重新分區數據的方法。 一種是通過此配置spark.sql.shuffle.partitions作為默認值 200,並且始終在運行任何連接或聚合時應用,如您在此處看到的。

當我們談論sort()時,這並不是那么簡單,Spark 使用一個規划器來確定數據集中數據的傾斜程度。 如果它不是太傾斜,而不是使用sort-merge join ,如您預期的那樣會導致 200 個分區,它更喜歡跨分區broadcast數據,避免完全洗牌。 這可以節省排序期間的時間,以減少網絡流量的更多詳細信息

這兩種情況的區別在於sortgroupBy在底層使用了不同的分區器。

  1. groupBy - 使用hashPartitioning這意味着它計算密鑰的 hash 然后它計算pmod 200(或任何設置為隨機分區的數量)所以它總是會創建 200 個分區(即使其中一些可能是空的)
  2. sort / orderBy - 正在使用rangePartitioning ,這意味着它運行一個單獨的作業來對數據進行采樣,並在此基礎上為分區創建邊界(試圖使它們成為 200)。 現在根據采樣數據分布和實際行數,它可能會創建小於 200 的邊界,這就是您只有 104 的原因。

暫無
暫無

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

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