대규모 클러스터 환경에서 리소스를 효율적으로 활용하기 위해 Flink를 YARN 위에 배포하는 경우가 많습니다. 이 글에서는 Flink를 YARN에 구축하고 작업을 제출하는 전체 과정을 살펴봅니다.
사전 준비사항
HDFS와 YARN 서비스가 정상적으로 기동된 상태여야 합니다. 또한 Flink가 YARN과 상호작용하려면 Hadoop 설정 경로를 시스템에 알려주어야 합니다.
메모리 검사 비활성화
Flink 프로세스는 동적으로 메모리를 확장하는 특성이 있어 YARN의 기본 가상 메모리 모니터링에 의해 강제 종료될 수 있습니다. 이를 방지하려면 yarn-site.xml을 다음과 같이 수정합니다.
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
환경 변수 설정
/etc/profile 또는 사용자 쉘 설정 파일에 Hadoop 설정 디렉터리를 지정합니다.
export HADOOP_CONF_DIR=/opt/cdh/hadoop/etc/hadoop
YARN_CONF_DIR 또는 HADOOP_CONF_DIR 중 하나는 반드시 설정되어 있어야 Flink가 YARN과 HDFS 설정을 읽어올 수 있습니다.
배포 방식 선택
Flink를 YARN에 배포하는 방식은 두 가지가 있습니다.
| 방식 | 특징 | 적합한 경우 |
|---|---|---|
| 세션 모드 | 장기 실행 클러스터, 여러 작업 공유 | 반복적인 작업 제출, 다수 사용자 |
| 단일 작업 모드 | 작업별 독립 클스터, 제출 후 종료 | 일회성 대규모 배치, CI/CD 파이프라인 |
세션 모드로 클러스터 구축
세션 모드는 지속적인 Flink 클러스터를 YARN 위에 구축합니다. Hadoop 2.2 이상, HDFS 설치가 필수입니다. (세션 시작 시 jar 파일과 설정을 HDFS에 업로드하기 때문입니다.)
yarn-session.sh 주요 옵션
필수
-n,--container <arg> 할당할 YARN 컨테이너 수 (TaskManager 개수)
선택
-d,--detached 백그라운드 분리 실행
-id,--applicationId 기존 실행 중인 YARN 세션에 연결
-jm,--jobManagerMemory JobManager 메모리 (MB)
-nm,--name YARN 애플리케이션 표시 이름
-qu,--queue YARN 큐 지정
-s,--slots TaskManager당 슬롯 수
-tm,--taskManagerMemory TaskManager 메모리 (MB)
-t,--ship 추가 전송할 파일 디렉터리
-z,--zookeeperNamespace HA Zookeeper 경로
세션 기동 예시
./bin/yarn-session.sh -n 2 -tm 800 -s 2
위 명령의 의미는 다음과 같습니다.
-n 2: TaskManager용 컨테이너 2개 할당-tm 800: 각 TaskManager에 800MB 메모리 부여-s 2: TaskManager당 2개의 task slot 구성
실제로는 총 3개의 컨테이너가 생성됩니다. 추가로 ApplicationMaster(JobManager 역할)용 컨테이너가 하나 더 필요하기 때문입니다. 세션이 준비되면 터미널에 JobManager 접속 정보가 출력됩니다.
작업 제출
활성화된 세션에 프로그램을 제출합니다.
./bin/flink run examples/batch/WordCount.jar
세션 종료 방법
- 실행 중인 터미널에서 Ctrl+C
echo "stop" | ./bin/yarn-session.sh -id <applicationId>yarn application -kill <applicationId>
분리 모드(detached) 세션
클라이언트를 계속 유지하지 않으려면 -d 옵션으로 분리 실행합니다. 이 경우 Flink 클라이언트는 제출 후 즉시 종료되며, 세션 종료는 반드시 YARN 명령으로 해야 합니다.
./bin/yarn-session.sh -n 2 -s 6 -jm 1024 -tm 700 -nm test -d
# 종료 시
yarn application -kill application_1527077715040_0007
단일 작업 모드로 직접 실행
별도의 세션 없이 개별 작업마다 독립적인 클러스터를 즉시 생성합니다. flink run 명령에 -m yarn-cluster를 추가하면 됩니다.
./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar
여기서 -yn은 TaskManager 개수를 의미합니다. 작업 완료 후 클러스터는 자동으로 해제됩니다. 강제 종료가 필요한 경우 YARN UI(8088)나 CLI에서 애플리케이션 ID로 종료합니다.
동적 설정 오버라이드
기존 conf/flink-conf.yaml을 수정하지 않고도 실행 시점에 파라미터를 덮어쓸 수 있습니다. -D 옵션 뒤에 key=value 형식으로 전달합니다.
./bin/flink run \
-m yarn-cluster \
-yn 3 \
-Dfs.overwrite-files=true \
-Dtaskmanager.network.numberOfBuffers=16368 \
./my-job.jar
이 방식은 테스트 환경에서 다양한 설정을 빠르게 검증하거나, 운영 환경에서 작업별 최적값을 적용할 때 유용합니다.
모니터링 및 문제 해결
YARN ResourceManager UI(기본 8088 포트)에서 실행 중인 Flink 애플리케이션 상태를 확인할 수 있습니다. 메모리 부족으로 인한 컨테이너 종료가 반복된다면 -tm, -jm 값을 적절히 상향 조정하거나, YARN 큐의 리소스 한도를 검토하세요.