2016-11-21 33 views
3

我們目前遇到的問題是,Spark作業在YARN上運行時看到因超出內存限制而導致許多容器被殺死。SPARK:YARN殺死超過內存限制的容器

16/11/18 17:58:52 WARN TaskSetManager: Lost task 53.0 in stage 49.0 (TID 32715, XXXXXXXXXX): 
    ExecutorLostFailure (executor 23 exited caused by one of the running tasks) 
    Reason: Container killed by YARN for exceeding memory limits. 12.4 GB of 12 GB physical memory used. 
    Consider boosting spark.yarn.executor.memoryOverhead. 

以下參數正在通過傳遞火花提交:

--executor-memory=6G 
--driver-memory=4G 
--conf "spark.yarn.executor.memoryOverhead=6G"` 

我使用星火2.0.1。

在閱讀了關於YARN殺死容器的幾篇文章(例如How to avoid Spark executor from getting lost and yarn container killing it due to memory limit?)之後,我們增加了memoryOverhead到這個值。

鑑於我的參數和日誌消息,它似乎確實「當內存使用量大於(executor-memory + executor.memoryOverhead)」時,Yarn會殺死執行程序。

繼續增加這個開銷是不現實的,希望最終我們找到一個不會發生這些錯誤的值。我們在幾個不同的工作中看到了這個問題。我會很感激任何建議,我應該改變的參數,我應該檢查的東西,我應該開始尋找調試這個等等。我能夠提供進一步的配置選項等。

+0

你使用Spark SQL嗎? –

+0

是的,廣泛 – user2682459

+0

當您使用巨大的數據集時,您可以嘗試將'spark-defaults.conf'中的'spark.default.parallelism'和'spark.sql.shuffle.partitions'增加到更高的值。這會減少內存使用量。 –

回答

6

您可以通過以下配置減少內存使用量在spark-defaults.conf

spark.default.parallelism 
spark.sql.shuffle.partitions 

而且是有區別的,當你使用超過2000個分區爲spark.sql.shuffle.partitions。你可以在Github的火花代碼中看到它:

private[spark] object MapStatus { 

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

我推薦嘗試使用超過2000個分區進行測試。當你使用非常龐大的數據集時,它可能會更快一些。根據this,您的任務可以縮短爲200毫秒。正確的配置不容易找到,但取決於您的工作量,它可能會導致小時差。