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에 보고합니다.

간단한 애플리케이션 작성 순서

  1. Client가 YarnClient를 사용해 ResourceManager에 연결하고 애플리케이션을 제출합니다.
  2. ApplicationSubmissionContext를 통해 AM의 ContainerLaunchContext(명령, 환경, 로컬 리소스)를 설정합니다.
  3. ResourceManager가 AM을 위한 첫 컨테이너를 할당하고 AM을 시작합니다.
  4. AM은 AMRMClient로 리소스 요청을 보내고, 할당된 컨테이너에서 ContainerLaunchContext를 만들어 NMClient로 태스크를 실행합니다.
  5. 모든 태스크가 완료되면 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)