Amazon EMR에서 Spark의 "Container killed on request. Exit code is 137" 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 1월 8일

Amazon EMR의 Apache Spark 작업이 "Container killed on request" 단계 오류와 함께 실패합니다.

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이 자동으로 컨테이너를 종료합니다. 이는 "Container killed on request. Exit code is 137" 오류를 유발합니다. 이러한 오류는 좁은 변환과 넓은 변환 모두에서 서로 다른 작업 단계에 발생할 수 있습니다.

해결 방법

다음 방법 중 하나 이상을 사용하여 "Exit status: 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 작업에서 처리하는 데이터 양이 줄어들어 단일 실행기에서 사용하는 전체 메모리가 줄어듭니다. 다음 Scala 코드를 사용하여 Spark 파티션을 더 추가합니다.

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 ...