Amazon EMR の Spark で「リクエストによりコンテナが強制終了しました。終了コード 137」というエラーを解決するには、どうすれば良いですか?

最終更新日: 2020 年 1 月 8 日

Amazon EMR の Apache Spark ジョブが、「リクエストによりコンテナが強制終了しました。」というステージ障害で失敗します。

Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 3.0 failed 4 times, most recent failure: Lost task 2.3 in stage 3.0 (TID 23, ip-xxx-xxx-xx-xxx.compute.internal, executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container marked as failed: container_1516900607498_6585_01_000008 on host: ip-xxx-xxx-xx-xxx.compute.internal. Exit status: 137. Diagnostics: Container killed on request. Exit code is 137

簡単な説明

コンテナ (Spark エグゼキュター) のメモリが不足すると、YARN が自動的にコンテナを強制終了します。これにより「リクエストによりコンテナが強制終了しました。終了コード 137」というエラーが起こります。このエラーは、さまざまなジョブステージで、ナロー変換とワイド変換どちらでも発生する可能性があります。

解決方法

次のいずれかの方法で「終了ステータス: 137」のステージ障害を解決します。

ドライバーやエグゼキューターのメモリを増やす

spark.executor.memory または spark.driver.memory パラメータを調整して、コンテナメモリを増やします (エラーの原因となったコンテナによって異なります)。

実行中のクラスターでは:

マスターノードで spark-defaults.conf を変更します。例:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.executor.memory 10g
spark.driver.memory 10g

単一のジョブでは:

spark-submit を実行するときにメモリを増やすには、--executor-memory または --driver-memory オプションを使用します。例:

spark-submit --executor-memory 10g --driver-memory 10g ...

Spark パーティションを追加する

コンテナメモリを増やすことができない場合 (たとえば、ノードで maximizeResourceAllocation を使用している場合)、Spark パーティションの数を増やします。これで、単一の Spark タスクで処理されるデータの量が減り、単一のエグゼキュターが使用するメモリ全体が少なくなります。Spark パーティションを追加するには、次の Scala コードを使用します。

val numPartitions = 500
val newDF = df.repartition(numPartitions)

シャッフルパーティションの数を増やす

ワイド変換中 (joingroupByなど) にエラーが発生した場合、シャッフルパーティションを追加します。デフォルト値は 200 です。

実行中のクラスターでは:

マスターノードで spark-defaults.conf を変更します。例:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.sql.shuffle.partitions 500

単一のジョブでは:

spark-submit の実行時にシャッフルパーティションを追加するには、--conf spark.sql.shuffle.partitions オプションを使用します。例:

spark-submit --conf spark.sql.shuffle.partitions=500 ...

エグゼキュターコアの数を減らす

これにより、エグゼキュターが同時に処理するタスクの最大数が減り、コンテナが使用するメモリ量が減ります。

実行中のクラスターでは:

マスターノードで spark-defaults.conf を変更します。例:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.executor.cores  1

単一のジョブでは:

spark-submit を実行するときにエグゼキューターコアの数を減らすには、--executor-cores オプションを使用します。例:

spark-submit --executor-cores 1 ...