簡體   English   中英

了解spark.yarn.executor.memoryOverhead

[英]Understanding spark.yarn.executor.memoryOverhead

當我在yarn上運行spark應用程序時,驅動程序和執行程序的內存設置為--driver-memory 4G --executor-memory 2G

然后,當我運行該應用程序時,拋出異常,抱怨說Container killed by YARN for exceeding memory limits. 2.5 GB of 2.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead. Container killed by YARN for exceeding memory limits. 2.5 GB of 2.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

這2.5 GB在這里意味着什么? (開銷內存,執行程序內存還是開銷+執行程序內存?)之所以這么問是因為當我將內存設置更改為:

--driver-memory 4G --executor-memory 4G --conf --driver-memory 4G --conf spark.yarn.executor.memoryOverhead=2048 ,然后異常消失。

我會問,盡管我將開銷內存提高到了2G,但仍低於2.5G,為什么現在可以使用?

讓我們了解一下如何在Spark中將內存划分為各個區域。

  1. 執行程序MemoryOverhead:

spark.yarn.executor.memoryOverhead = max(384 MB, .07 * spark.executor.memory) 在您的第一種情況下, memoryOverhead = max(384 MB, 0.07 * 2 GB) = max(384 MB, 143.36 MB)因此,假設您為每個執行者分配了一個單核,則在每個執行者中都保留memoryOverhead = 384 MB

  1. 執行和存儲內存:

默認情況下, spark.memory.fraction = 0.6 ,這意味着作為統一區域執行和存儲占剩余內存的60%,即998 MB 除非您啟用spark.memory.useLegacyMode否則不會為每個區域分配嚴格的邊界。 否則,它們共享移動邊界。

  1. 用戶內存:

分配執行和存儲內存后仍保留的內存池,完全取決於您以自己喜歡的方式使用它。 您可以在那里存儲自己的數據結構,以用於RDD轉換。 例如,您可以通過使用mapPartitions轉換來維護此哈希表的哈希表來重寫Spark聚合。 這包括MemoryOverhead之后剩余的40%內存。 您的情況是~660 MB

如果您的工作沒有滿足上述任何分配條件,那么很有可能最終導致OOM問題。

暫無
暫無

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

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