![](/img/trans.png)
[英]The value of “spark.yarn.executor.memoryOverhead” setting?
[英]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中將內存划分為各個區域。
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
。
默認情況下, spark.memory.fraction = 0.6
,這意味着作為統一區域執行和存儲占剩余內存的60%,即998 MB
。 除非您啟用spark.memory.useLegacyMode
否則不會為每個區域分配嚴格的邊界。 否則,它們共享移動邊界。
分配執行和存儲內存后仍保留的內存池,完全取決於您以自己喜歡的方式使用它。 您可以在那里存儲自己的數據結構,以用於RDD轉換。 例如,您可以通過使用mapPartitions轉換來維護此哈希表的哈希表來重寫Spark聚合。 這包括MemoryOverhead之后剩余的40%內存。 您的情況是~660 MB
。
如果您的工作沒有滿足上述任何分配條件,那么很有可能最終導致OOM問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.