[AWS] EMR Trouble Shooting-Bootstrap Failure-Port conflicts
Daily Batch Job 수행을 위해서, 매일 새벽 EMR Cluster가 떠서 Spark Job들을 수행하고 있다.
이렇게 EMR Spark Cluster를 운영하다보면 OOME나, 로직 상의 오류로 문제가 생기는 경우도 있지만 , 정말 가끔은 1년 내내 잘 뜨고 잘 돌던 EMR이 생성에 실패하고 뻗어버리는 경우가 있다. 그날은 당연히 해결을 위해 진땀 좀 빼게 되는 날인데..
아.. 오늘이 그 날인가..?
이번엔 다행히 Terminate 이후, 재시도만 했을 뿐인데 정상적으로 수행되어서 한숨은 돌렸다.
그래도 원인이 무엇인지, 재발방지를 위해 알아보고 넘어가야지.
boostrap failure가 termination의 원인으로 나와서 직접적으로 bootstrap-actions/master.log.gz와 stderr log에서는 failure 관련 원인을 찾을 수 없었다. 이 때문에 원인 파악에 시간이 좀 더 걸렸고, AWS Support center의 별다섯개짜리 도움을 받았다.
직접적인 원인은, hive-webhcat-server가 뜨는데 실패했기 때문에 Cluster Creation에 실패한 것이었다.
- Log : master node의 provision-node/apps-phase/*/*/puppet.log.gz
Puppet (debug): Executing '/sbin/status hive-webhcat-server'
Puppet (debug): Executing '/sbin/start hive-webhcat-server'
Puppet (err): Could not start Service[hive-webhcat-server]: Execution of '/sbin/start hive-webhcat-server' returned 1: start: Job failed to start Wrapped exception: Execution of '/sbin/start hive-webhcat-server' returned 1: start: Job failed to start
/Stage[main]/Hcatalog::Webhcat::Server/Service[hive-webhcat-server]/ensure (err): change from stopped to running failed: Could not start Service[hive-webhcat-server]: Execution of '/sbin/start hive-webhcat-server' returned 1: start: Job failed to start
그럼 hive-webhcat-server는 왜 뜨는데 실패했을까.
Address already in use
특정 클라이언트가 외부 커뮤니케이션에 해당 포트를 랜덤하게 점유할 때 hive-webhcat-server가 사용할 ‘50111’ 포트를 사용해버렸기 때문이다.
만개도 넘는 포트중에 하필 그걸…. 0. 몇 % 확률이지…?
관련 로그는 아래.
- Log : master node의 applications/hive-hcatalog/webhcat.log.gz
WARN | | org.eclipse.jetty.util.component.AbstractLifeCycle | FAILED org.eclipse.jetty.server.Server@x502xxxxx : java.net.BindException: Address already in use java.net.BindException: Address already in use
재발 방지를 위해서, Bootstrap code에 아래와 같이 reserved port를 구성해줄 수 있도록 추가하였다.
[참고] 포트 대역별 정보
1. Well-known ports: Range from 0–1,023
2.Registered ports: Range from 1,024–49,151
3.Dynamic/Private ports: Range from 49,152–65,535