애플리케이션이 컨테이너 초기화 단계에서 실패하고 진단 메시지에 다음이 남는다.
Application application_... failed 2 times due to AM Container for ... exited with exitCode: -1000
Requested user hdfs is not whitelisted and has id 995, which is below the minimum allowed 1000
또는
Requested user hdfs is banned
exitCode=-1000 은 컨테이너 실행 전 로컬라이제이션 단계에서 실패했다는 뜻이다. Cloudera 환경에서 HDFS 복제(HdfsReplication) 같은 관리 작업을 hdfs 계정으로 돌릴 때 자주 나온다.
LinuxContainerExecutor 는 컨테이너를 제출자 계정으로 실행하기 때문에, 시스템 계정으로 임의 코드가 실행되는 것을 막는 안전장치를 갖고 있다. container-executor.cfg 의 두 항목이 그것이다.
| 항목 | 뜻 |
|---|---|
banned.users |
이 목록의 계정은 컨테이너를 실행할 수 없다. 기본값에 hdfs · yarn · mapred · bin 이 들어 있다 |
min.user.id |
이 값보다 작은 UID 는 거부한다. 기본값 1000 |
allowed.system.users |
위 두 규칙의 예외로 허용할 계정 |
배포판 패키지가 만드는 hdfs 계정은 UID 가 1000 미만인 시스템 계정이고 동시에 banned.users 에도 들어 있으므로 두 규칙에 모두 걸린다.
우선은 다른 계정으로 제출한다. 이 제한은 의도된 것이다. hdfs 는 HDFS 상의 모든 데이터에 접근할 수 있는 계정이라, 그 계정으로 임의의 컨테이너가 돌게 하는 것은 안전하지 않다. 작업에 필요한 권한만 가진 전용 계정을 만들어 제출하고, 그 계정에 대상 경로의 권한을 준다.
Cloudera Manager 의 복제 작업이라면 실행 계정을 설정에서 바꿀 수 있다. 어느 계정으로 돌릴지 정해 두고 그 계정에 소스·대상 경로 권한을 주는 것이 정석이다.
꼭 허용해야 한다면 예외 목록에 넣는다. 관리 작업 특성상 hdfs 여야만 하는 경우가 있다. 이때는 container-executor.cfg 의 allowed.system.users 에 추가한다. Cloudera Manager 에서는 YARN 서비스 설정의 "Allowed System Users"(allowed.system.users) 항목이다. 변경 후 NodeManager 를 재시작해야 한다.
# container-executor.cfg
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=yarn,mapred,bin
min.user.id=1000
allowed.system.users=hdfs
banned.users 에서 계정을 빼는 것과 allowed.system.users 에 넣는 것 중에서는 후자가 낫다. 명시적으로 예외임을 남기는 쪽이 나중에 읽기 쉽다. min.user.id 를 0 으로 낮추는 것은 root 실행까지 열리므로 하지 않는다.
제한과 별개로 다른 원인이 겹쳐 있을 수 있으므로, 실패한 애플리케이션의 진단 메시지와 NodeManager 로그를 같이 본다.
yarn application -status <application_id>
yarn logs -applicationId <application_id>
exitCode=-1000 은 계정 문제 외에도 로컬 디렉터리 권한·용량 부족에서도 난다. 메시지에 banned 나 min.user.id 가 없다면 YARN NodeManager 의 local-dirs 와 filecache 를 본다.
YARN 애플리케이션 CLI 와 컨테이너 종료 코드 · YARN