簡體   English   中英

Spark Shuffle 內存開銷問題

[英]Spark Shuffle Memory Overhead Issues

我在設計 Spark 作業(使用 Spark 2.3.x)時經常遇到一些問題。

簡而言之:

  • job 本質上是一些昂貴的 shuffle 操作(對具有細粒度的大型數據幀的.groupby.join操作)。 然后將結果寫入磁盤(鑲木地板)
  • 大多數任務都很快成功
  • 很少有難以解決的任務,需要很長時間,有時會失敗
  • 即使作業成功,少數長任務也占運行時間的大部分
  • Yarn 偶爾會殺死一些執行程序,因為它們超出了內存限制yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.由於超出內存限制yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead. yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
  • 在這些任務多次失敗后,紗線偶爾會org.apache.spark.SparkException: Job aborted due to stage failure: Task 175 in stage 92.0 failed 4 times

我想知道單個任務怎么會有這么高的內存消耗。 根據我對 Spark 工作原理的理解,應該可以使任務足夠小,以便它們適合內存。 此外,很少有任務占據了大部分運行時間,這也是次優並行化的標志。 分組單元內的數據(組 -> 所有與 groupBy 或 join 的鍵匹配的)不是很大。 (單個組鍵的聚合不能單獨導致內存問題)

我已經嘗試過的事情:

  • 增加執行器內存和內存開銷 -> 降低失敗率,增加運行時間,但也沒有解決問題,我遇到了下一個限制。 也有硬件限制
  • 更改了我的 DataFrame 的分區 -> 沒有可見效果
  • 增加了 shuffle 服務分區spark.sql.shuffle.partitions -> 降低了失敗率,但也增加了運行時間

任何提高性能和穩定性的想法?

編輯:

一些進一步的調查顯示,我們確實有非常傾斜的數據集。 似乎一些非常大的行的映射操作對於火花執行器處理來說非常大。

我增加了隨機分區數。 我大量增加了執行程序內存。 我更改了 spark 錯誤日志中推薦的配置設置。 現在作業運行時沒有警告/錯誤,但運行時間嚴重增加。

--executor-memory 32g
--driver-memory 16g
--conf spark.executor.memoryOverhead=8g
--conf spark.driver.maxResultSize=4g
--conf spark.sql.shuffle.partitions=3000

暫無
暫無

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

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