아파치 YARN: 하둡의 클러스터 자원 관리 시스템 (맵리듀스 + 분산 컴퓨팅 도구 지원)
4.1YARN 애플리케이션 수행 해부해보기
YARN: 리소스 매니저 + 노드 매니저 ➡️ 핵심 서비스 제공
- 리소스 매니저: 클러스터 유일, 클러스터 전체 자원 사용량 관리
- 노드 매니저: 모든 머신에서 실행, 컨테이너 구동 + 모니터링
클라이언트: 리소스 매니저 접속 ➡️ 애플리케이션 마스터 프로세스 구동 요청 ➡️ 리소스 매니저: 컨테이너에서 애플리케이션 마스터를 시작할 수 있는 노드 매니저 찾음 (➡️ 애플리케이션 마스터: 더 많은 컨테이너 요청 ➡️ 분산 처리 수행)
YARN 자체: 애플리케이션(클라이언트, 마스터, 프로세스) 상호 통신 기능 제공 ❌ ➡️ 주요 YARN 애플리케이션: 원격 호출 방식 사용
4.1.1 자원 요청
YARN: 유연한 자원 요청 모델
각 컨테이너에 필요한 컴퓨터 자원 용량 + 해당 요청에 대한 컨테이너 지역성 제약(e.g., 특정 노드/랙/외부 랙에서 컨테이너 요청) 표현 ➡️ 대역폭 효율적 활용
if 지역성 제약 불가능 ➡️ 할당 실패 / 선택적으로 제약 느슨하게 적용
4.1.2 애플리케이션의 수명
- 하나의 애플리케이션 / 사용자의 잡
e.g., 맵리듀스 잡
- 하나의 애플리케이션 / 사용자의 잡 세션 ➡️ 동일한 컨테이너 재사용, 잡 사이에 공유 데이터 캐싱
e.g., 스파크
- 장기 실행 애플리케이션(서로 다른 사용자 공유): 코디네이션 역할 수행
4.1.3 YARN 애플리케이션 만들기
아파치 슬라이더: 기존의 분산 애플리케이션 YARN 위에서 실행 가능
아파치 트윌: 간단한 프로그래밍 모델 추가 제공(e.g., 로깅, 명령 메시지)
4.2 YARN과 맵리듀스 1의 차이점
맵리듀스1: 잡트래커 + 태스크트래커 ➡️ 잡 스케줄링, 태스크 진행 모니터링
- 잡트래커: 여러 태스크트래커에서 실행되는 태스크 스케줄링 ➡️ 시스템에서 실행되는 모든 잡 조율
- 태스크트래커: 태스크 실행, 진행 상황 잡트래커 전송 ➡️ 각 잡의 전체적인 진행 상황 파악
if 태스크 실패 ➡️ 잡트래커: 다른 태스크트래커에 다시 스케줄링
맵리듀스2: YARN 사용
YARN: 리소스 매니저 + 애플리케이션 마스터 ➡️ 잡 스케줄링, 태스크 진행 모니터링
태스크트래커 = YARN 노드 매니저
MapReduce1 | YARN |
잡트래커 | 리소스 매니저, 애플리케이션 마스터, 타임라인 서버 |
태스크트래커 | 노드 매니저 |
슬록 | 컨테이너 |
YARN의 이점
- 확장성: 1,000노드, 100,000 태스크까지 확장 가능(맵리듀스1: 4,000노드, 40,000 태스크까지)
- 가용성: 상태 정보 항상 복사 ➡️ 서비스 데몬 문제 발생 시 다른 데몬이 작업 이어받음
- 효율성: 정해진 개수의 슬롯 ❌, 리소스 풀 관리 + 자원 잘게 쪼갬 ➡️ 필요한 만큼만 자원 요청
- 멀티테넌시(다중 사용자): 다양한 분산 애플리케이션 수용
4.3 YARN 스케줄링
4.3.1 스케줄러 옵션
YARN: FIFO, 캐퍼시티(가용량), 페어(균등) 스케줄러 제공
- FIFO 스케줄러: 순차적 선입선출 방식
- 캐퍼시티(가용량) 스케줄러: 작은 잡 ➡️ 분리된 (예약된) 전용 큐에서 처리
- 페어(균등) 스케줄러: 모든 잡의 자원 동적 분배
FIFO | 캐퍼시티(가용량) | 페어(균등) | |
장점 | 이해 쉬움, 설정 필요 ❌ | 자원 가용량 예약 필요 ❌ 클러스터 효율성 ⬆️, 작은 잡 빨리 처리 |
|
단점 | 대형 애플리케이션 수행 시 자원 점유 |
전용 큐: 잡을 위한 자원 미리 예약 ➡️ 전체 클러스터의 효율성 ⬇️ 대형 잡은 FIFO보다 늦게 처리 |
4.3.2 캐퍼시티 스케줄러 설정
큐 탄력성: 큐 內 다수의 잡 존재, 가용 가능 자원 有 ➡️ 캐퍼시티 스케줄러: 해당 큐의 잡에 여분의 자원 할당 ➡️ 큐의 가용량 초과
root
- prod (40%) ➡️ 클러스터 25% 즉시 사용 가능,클러스터 100% 사용 가능
- dev (60%): 최대 가용량 75% 제한 ➡️ 클러스터 100% 사용 불가
- eng
- science
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.schedular.capacity.root.queues</name>
<value>prod,dev</value>
</property>
<property>
<name>yarn.schedular.capacity.root.dev.queues</name>
<value>eng, science</value>
</property>
<property>
<name>yarn.schedular.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.schedular.capacity.root.dev.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.schedular.capacity.root.dev.maximun-capacity</name>
<value>75</value>
</property>
<property>
<name>yarn.schedular.capacity.root.dev.eng.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.schedular.capacity.root.dev.science.capacity</name>
<value>50</value>
</property>
</configuration>
4.3.3 페어 스케줄러 설정
페어 스케줄러: 실행 중인 모든 애플리케이션에 동일하게 자원 할당(큐 사이에만 실제로 적용)
사용자 A 잡 시작(100% 점유) ➡️ 사용자 B 잡 시작(A - 50%, B - 50%) ➡️ 사용자 B 두 번째 잡 시작(A - 50%, B1 - 25%, B2 - 25%)
∴ 자원은 사용자 사이에만 균등하게 적용