Hadoop: YARN 애플리케이션 작성하기
Hadoop: YARN 애플리케이션 작성하기 (Writing YARN Applications)
이 문서는 YARN 애플리케이션을 작성하는 방법을 설명합니다. YARN 애플리케이션은 리소스를 요청하고 컨테이너에서 태스크를 실행하는 ApplicationMaster(AM)와 그와 통신하는 클라이언트로 구성됩니다.
출처: 문서
본문
개요 (Overview)
YARN 애플리케이션은 크게 세 부분으로 구성됩니다.
- Client: 사용자를 대신해 애플리케이션을 ResourceManager에 제출하고 실행을 추적합니다.
- ApplicationMaster (AM): ResourceManager로부터 리소스(컨테이너)를 협상/요청하고, 컨테이너에서 태스크를 실행하며 진행을 모니터링합니다.
- NodeManager (NM): 컨테이너를 실행하는 노드 에이전트입니다.
핵심 개념
- 애플리케이션 제출 시
ApplicationSubmissionContext를 만들어 ResourceManager에 보냅니다. 여기에는 AM을 실행할 컨테이너 정보(리소스, 로컬 리소스, 명령 등)가 포함됩니다. - AM은
AMRMClient(또는AMRMClientAsync)를 사용해 ResourceManager의ApplicationMasterProtocol과 통신하며 리소스를 요청합니다. - 리소스가 할당되면 AM은
NMClient(또는NMClientAsync)를 사용해 NodeManager에 컨테이너 시작/중지를 요청합니다. - AM은 진행 상황과 완료 상태를 ResourceManager에 보고합니다.
간단한 애플리케이션 작성 순서
Client가YarnClient를 사용해 ResourceManager에 연결하고 애플리케이션을 제출합니다.ApplicationSubmissionContext를 통해 AM의ContainerLaunchContext(명령, 환경, 로컬 리소스)를 설정합니다.- ResourceManager가 AM을 위한 첫 컨테이너를 할당하고 AM을 시작합니다.
- AM은
AMRMClient로 리소스 요청을 보내고, 할당된 컨테이너에서ContainerLaunchContext를 만들어NMClient로 태스크를 실행합니다. - 모든 태스크가 완료되면 AM은 종료하고 애플리케이션을 FINISHED로 보고합니다.
AMRMClient / NMClient 사용 예시 (요약)
AM은 컨테이너를 요청하기 위해 Resource를 지정하고, 호스트/랙 locality를 설정할 수 있습니다.
// AM에서 리소스 요청 예시
amrmClient.addContainerRequest(
new ContainerRequest(resource, new String[]{"*"}, null, priority));
할당된 컨테이너에서 태스크를 시작합니다.
// 컨테이너 실행 예시
ContainerLaunchContext ctx = Records.newRecord(ContainerLaunchContext.class);
ctx.setCommands(Collections.singletonList("/bin/echo hello"));
nmClient.startContainer(container, ctx);
로컬 리소스
컨테이너가 사용하는 jar/파일은 LocalResource로 지정하여 HDFS 등에서 지역화(localize)합니다. 다운로드 방식(ARCHIVE/FILE), 공개 범위(PUBLIC/PRIVATE/APPLICATION) 등을 설정합니다.
예제
공식 배포판에 포함된 분산 셸(distributed shell, hadoop-yarn-applications-distributedshell) 예제가 참고 자료로 널리 사용됩니다.
yarn org.apache.hadoop.yarn.applications.distributedshell.Client \
-jar <distributedshell.jar> -shell_command <cmd> -num_containers <n>
더 알아보기 (Learn more)
- 원문: 문서