簡體   English   中英

spark.sql.shuffle.partitions 的最佳值應該是多少,或者在使用 Spark SQL 時我們如何增加分區?

[英]What should be the optimal value for spark.sql.shuffle.partitions or how do we increase partitions when using Spark SQL?

我正在使用 Spark SQL 實際上hiveContext.sql()它使用 group by 查詢,我hiveContext.sql()了 OOM 問題。 因此,考慮將spark.sql.shuffle.partitions值從默認值 200 增加到 1000,但這spark.sql.shuffle.partitions

我相信這個分區將共享數據 shuffle 負載,所以更多的分區可以容納更少的數據。 我是 Spark 的新手。 我正在使用 Spark 1.4.0 並且我有大約 1TB 的未壓縮數據可以使用hiveContext.sql() group by查詢進行處理。

如果您的 shuffle 內存spark.sql.shuffle.partitions ,請嘗試將spark.sql.shuffle.partitions設置為 2001。

當分區數大於 2000 時,Spark 使用不同的數據結構進行 shuffle 記賬:

private[spark] object MapStatus {

  def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
    if (uncompressedSizes.length > 2000) {
      HighlyCompressedMapStatus(loc, uncompressedSizes)
    } else {
      new CompressedMapStatus(loc, uncompressedSizes)
    }
  }
...

我真的希望他們能讓你獨立配置它。

順便說一下,我在 Cloudera 幻燈片中找到了這些信息

好的,所以我認為您的問題更普遍。 它不是 Spark SQL 特有的,它是 Spark 的一個普遍問題,它會忽略您在文件很少時告訴它的分區數。 Spark 的分區數似乎與 HDFS 上的文件數相同,除非您調用repartition 所以調用repartition應該可以工作,但需要注意的是會引起一些不必要的洗牌。

不久前我提出了這個問題,但仍然沒有得到很好的答案:(

Spark:增加分區數量而不會造成洗牌?

這實際上取決於您的數據和查詢,如果 Spark 必須加載 1Tb,那么您的設計就有問題。

使用超級 Web UI 查看 DAG,這意味着 Spark 如何將您的 SQL 查詢轉換為作業/階段和任務。

有用的指標是“輸入”和“隨機播放”。

  • 對數據進行分區(Hive / 目錄布局,如 /year=X/month=X)
  • 使用 spark CLUSTER BY功能,按數據分區工作
  • 使用 ORC / Parquet 文件格式,因為它們提供“下推過濾器”,無用數據不會加載到 Spark
  • 分析 Spark History 以查看 Spark 如何讀取數據

另外,OOM 可能會發生在您的驅動程序上嗎?

-> 這是另一個問題,驅動程序會在最后收集您想要的數據。 如果您詢問太多數據,驅動程序將 OOM,嘗試限制您的查詢,或編寫另一個表(Spark 語法CREATE TABLE ...AS )。

我從 Cloudera 看到這篇關於 Hive 分區的帖子 查看“指針”部分,討論分區數和每個分區中的文件數導致名稱節點過載,這可能導致 OOM。

暫無
暫無

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

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