내용으로 건너뛰기

Amazon EMR의 Spark에서 "ExecutorLostFailure: Slave lost" 오류를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Apache Spark 애플리케이션을 Amazon EMR 클러스터에 제출했는데 애플리케이션이 "ExecutorLostFailure: Slave lost" 오류로 실패했습니다.

해결 방법

노드가 종료되거나 사용할 수 없게 되어 Spark 작업이 실패하면 다음 오류가 표시될 수 있습니다.

"Most recent failure: Lost task 1209.0 in stage 4.0 (TID 31219, ip-###-###-##-###.compute.internal, executor 115): ExecutorLostFailure (executor 115 exited caused by one of the running tasks) Reason: Slave lost"

이 오류가 발생할 수 있는 몇 가지 이유는 다음과 같습니다.

비정상 노드로 인한 높은 디스크 사용률

Apache Hadoop에서 NodeManager는 클러스터의 노드에 연결된 Amazon Elastic Block Store(Amazon EBS) 볼륨을 주기적으로 확인합니다. 볼륨이 하나인 노드의 디스크 사용률이 YARN 속성 yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage보다 크면 NodeManager는 노드를 비정상으로 간주합니다. 그러면 ResourceManager가 해당 노드의 모든 컨테이너를 종료하고 새 컨테이너를 예약하지 않습니다. 자세한 내용은 Apache Hadoop 웹사이트에서 NodeManager를 참조하십시오.

ResourceManager가 비정상 노드 때문에 여러 실행기를 종료한 후 애플리케이션은 ExecutorLostFailure: Slave lost 오류와 함께 실패합니다. 노드가 비정상인지 확인하려면 NodeManager 로그 또는 인스턴스 컨트롤러 로그를 검토하십시오. yarn-env.sh에서 YARN_LOG_DIR 변수는 NodeManager 로그의 위치를 정의합니다. 인스턴스 컨트롤러 로그는 프라이머리 노드의 /emr/instance-controller/log/instance-controller.log에 저장됩니다. 인스턴스 컨트롤러 로그는 클러스터의 모든 노드에 대한 집계 보기를 제공합니다.

비정상 노드는 다음과 비슷한 로그 항목을 표시합니다.

2019-10-04 11:09:37,163 INFO Poller: InstanceJointStatusMap contains 40 entries (R:40):  i-006ba######  1829s R   1817s ig-3B ip-###-##-##-### I:    7s Y:U    11s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers
  i-00979######  1828s R   1817s ig-3B ip-###-##-##-### I:    7s Y:R     9s c: 3 am: 2048 H:R  0.0%
  i-016c4######  1834s R   1817s ig-3B ip-###-##-##-### I:   13s Y:R    14s c: 3 am: 2048 H:R  0.0%
  i-01be3######  1832s R   1817s ig-3B ip-###-##-##-### I:   10s Y:U    12s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers

이 문제를 해결하려면 코어 및 작업 노드에 연결된 EBS 볼륨의 크기를 늘립니다. 또는 Hadoop 분산 파일 시스템(HDFS)에서 사용하지 않는 데이터를 삭제합니다.

스팟 인스턴스

Amazon EMR 클러스터 노드에 Amazon Elastic Compute Cloud(EC2) 스팟 인스턴스를 사용하는 경우 인스턴스 중 하나가 종료되면 ExecutorLostFailure: Slave lost 오류가 발생할 수 있습니다. 스팟 인스턴스는 다음과 같은 이유로 종료될 수 있습니다.

  • 스팟 인스턴스 가격이 최고 가격보다 높습니다.
  • 사용 가능한 EC2 인스턴스가 스팟 인스턴스에 대한 수요를 충족하지 못합니다.

자세한 내용은 스팟 인스턴스 중단을 참조하십시오.

이 문제를 해결하려면 온디맨드 인스턴스를 사용하십시오. 또는 Amazon EMR 릴리스 버전 5.11.0 이하를 사용하는 경우 최신 버전으로 업그레이드하십시오.

Amazon EC2 Auto Scaling 정책

오토 스케일링 이벤트가 자주 발생하는 동안에는 새 노드가 이전 노드에서 사용한 IP 주소를 받을 수 있습니다. Spark 애플리케이션이 스케일 인 이벤트 동안 실행되는 경우 Spark는 폐기된 노드를 거부 목록에 추가하여 실행기가 해당 노드에서 실행되지 않도록 합니다. 다른 스케일 아웃 이벤트가 발생하고 새 노드가 폐기된 노드와 동일한 IP 주소를 얻는 경우에는 YARN이 새 노드를 유효한 것으로 간주합니다. YARN은 새 노드에서 실행기를 예약하려고 시도합니다. 해당 노드가 Spark 거부 목록에 남아 있기 때문에 실행기 실행은 실패합니다. 최대 실패 횟수에 도달하면 Spark 애플리케이션이 ExecutorLostFailure: Slave lost 오류와 함께 실패합니다.

이 문제를 해결하려면 다음 작업을 수행하십시오.

Spark 거부 목록에서 노드를 제거하려면 Spark 및 YARN 제한 시간 속성을 줄입니다. 다음 단계를 완료하십시오.

  1. /etc/spark/conf/spark-defaults.conf 파일에 다음 파라미터를 추가합니다.
    spark.blacklist.decommissioning.timeout 600s
    참고: 이렇게 하면 사용 중단 상태의 노드가 거부 목록에 남아 있는 시간이 줄어듭니다. 기본값은 1시간입니다. 자세한 내용은 노드 사용 중단 동작 구성을 참조하십시오.
  2. /etc/hadoop/conf/yarn-site.xml에서 다음 YARN 속성을 수정합니다.
    yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs 600
    참고: 이 속성은 사용 중단 노드가 폐기된 상태로 전환되기 전에 컨테이너 및 애플리케이션 실행이 완료될 때까지의 대기 시간을 지정합니다. 기본값은 3,600초입니다.

자세한 내용은 Amazon EMR의 탄력성 및 복원력을 위한 Spark 개선 사항을 참조하십시오.

관련 정보

스팟 인스턴스에 대한 Amazon EMR 클러스터 인스턴스 유형 및 모범 사례 구성

Amazon EMR에서 Spark 작업의 스테이지 실패 문제를 해결하려면 어떻게 해야 합니까?

AWS 공식업데이트됨 일 년 전
댓글 없음