2016-11-21 12 views
3

現在、YARNで実行しているときにSparkのジョブで多数のコンテナがメモリ制限を超えて殺されているようになっています。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殺害コンテナに関するいくつかの投稿を読んだ後に、memoryOverheadをこの値に増やしました(例:How to avoid Spark executor from getting lost and yarn container killing it due to memory limit?)。

私のパラメータとログメッセージが与えられていると、「糸は、メモリ使用量が(executor-memory + executor.memoryOverhead)より大きい場合、エグゼキュータを殺します。

これらのエラーが発生しない値を最終的に見つけることができるように、このオーバーヘッドを引き続き増加させることは現実的ではありません。私たちはいくつかの異なる仕事でこの問題を見ています。私は変更すべきパラメータ、確認すべき事柄、これをデバッグするために探し始めなければならないことなど、何かアドバイスをいただければ幸いです。

+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 

そして、あなたはspark.sql.shuffle.partitionsのために2000の以上のパーティションを使用する違いがあります。

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個を超えるパーティションを使用することをお勧めします。これは、Githubのスパークのコードで確認できます。非常に巨大なデータセットを使用すると、何回か高速になる可能性があります。 thisによれば、あなたの仕事は200ミリ秒として短くなる可能性があります。正しい構成を見つけるのは簡単ではありませんが、作業負荷によっては時間差が生じることがあります。

関連する問題