EMR spark job 실행도중 SPOT 인스턴스로 구성된 TASK 노드를 뺏겨서 job이 fail 되는 현상 해결하기

2021-08-12

.

Data_Engineering_TIL(20210812)

[학습내용]

  • 문제현상

EMR 6.2.0 버전으로 master 1대(온디멘드), core 3대(온디멘드), task 12대(스팟)로 구성

spot instance를 사용하는 task node로 구성된 EMR에서 정상적인 spark job 실행중에 갑작스럽게 job이 fail 되는 현상

  • 원인

결론적으로 spark application의 application master가 task node에서 구동되었는데, 해당 Task node가 spot capacity 부족으로 terminate 되면서 어플리케이션이 강제종료됨

application_xxxxxxxxxxxx의 application master는 task 인스턴스 그룹에서 구동되었는데 아래 로그를 보면 6시 12분까지는 정상실행중이었으나 갑자기 “TERMINATED_BY_SPOT_DUE_TO_NO_CAPACITY”를 이유로 terminate 요청이 자동으로 접수되어 이로 인해 해당 인스턴스에서 실행중이던 application master process가 종료되었고, 이로인해 spark application이 예기치 못하게 종료된 것으로 확인하였음

2021-07-27 06:12:05,000 INFO Poller: InstanceJointStatusMap conatins 850 entries(DD:778 S:54 R:9 L:9)

...


application_xxxxxxxxxxxx RUNNING SPARK 100.00% ... ip-999-99-999-99.ap-northeast-2.compute.internal:8042

application_xxxxxxxxxxxx RUNNING SPARK 100.00% ... ip-999-99-999-99.ap-northeast-2.compute.internal:8042

...


2021-07-27 06:12:39,368 INFO Poller: Instance with termination notice i-xxxxxxxxxxxxxxxxxx termSec:106

2021-07-27 06:12:39,368 INFO Poller: resolved instancesToDrop:i-xxxxxxxxxxxxxxxxxx:20 instanceToKeep: ...

...

2021-07-27 06:13:16,572 INFO Poller: SlaveRecord i-xxxxxxxxxxxxxxx changed state from RUNNING to IDLE

2021-07-27 06:13:16,572 INFO Poller: Update SlaveRecordDbRow for instanceId : i-xxxxxxxxxxxxxxx, privateDnsName: ip-999-99-999-99.ap-northeast-2.compute.internal, privateip:999.99.999.99

  • 해결방안

EMR 6.0 이전 버전에서는 application master를 ‘CORE’ 노드에서만 실행하도록 기본적으로 설정되어 있다. TASK 노드의 경우 빈번하게 resizing이 발생할 수 있고 스팟 인스턴스를 사용하는 경우가 많아서 강제로 종료될수 있다는 점을 고려한 것이다. 하지만 EMR 6.0 이상부터는 이러한 기능을 해제하여 CORE 노드와 TASK 노드 어느곳에서도 application master가 실행될 수 있다. 이로 인해 클러스터 i-xxxxxxxxxxxxxx의 어플리케이션 처럼 application master가 task 노드에서 실행되고, task가 spot capacity 부족으로 종료되며 전체 어플리케이션이 종료되는 현상이 발생할 수 있다.

EMR 6.0 이전 버전에서처럼 CORE node에서만 application master를 실행하고자 한다면 EMR 클러스터 모든노드의 /etc/hadoop/conf/yarn-site.xml에 아래 파라미터를 추가하면 된다.

"yarn.node-labels.enabled":"true"

"yarn.node-labels.am.default-node-label-expression":"CORE"

현재 구동중인 EMR에서 위의 컨피그 값을 추가하는 방법

step 1) EMR 콘솔 –> 클러스터 선택 –> 클러스터 상세화면에서 ‘Configurations’ 탭 선택 –> Filter에서 Instance Group 중 하나 선택 –> ‘Reconfigure’ 선택 –> Edit in Json 선택

step 2) 아래 내용 입력 –> “Apply this configuration to all active instance groups” 선택 –> “Save changes” 클릭

[
 {
  "Classification":"yarn-site",
  "Properties":{
     "yarn.node-labels.enabled":"true",
     "yarn.node-labels.am.default-node-label-expression":"CORE"
   }
 }
]

다만 위와 같이 core node에서만 application master를 실행하는 경우, 모든 application master는 core node에서 실행하려고 하기 때문에 core node를 충분하게 프로비저닝 해줘야 한다. 그렇지 않는 경우 Task node가 충분히 남아 있음에도 불구하고 CORE node 부족으로 인해 application master가 실행되지 못하면서 어플리케이션이 시작하지 못하고 대기할 수 있다.

참고할만한 레퍼런스 : https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html#emr-plan-task