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)
シャッフルパーティションの数を増やす
ワイド変換中 (join や groupByなど) にエラーが発生した場合、シャッフルパーティションを追加します。デフォルト値は 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 ...