개념정리

개념설명
각 호스트의 구성

각 호스트는 VCore와 Memory 자원을 사용할 수 있음

컨테이너

가용 자원을 바탕으로 컨테이너를 실행시킬 수 있으며 컨테이너는 VCore와 Memory를 할당받아 소비함.

각 호스트에는 다양한 자원을 소비하는 컨테이너를 구동시킬 수 있음.

데이터의 크기와 작업의 워크로드에 따라서 리소스를 배정할 수 있음.

YARN Resource Manager는 Memory와 VCore를 잘 사용할수 있도록 배정하고 관리함

애플리케이션

애플리케이션이라고 함은 컨테이너에서 동작하는 프로그램을 의미하며

Spark 프로그램일 수도 있고 MapReduce Java 프로그램일 수도이 있음.

YARN은 VCore와 Memory를 효율적으로 사용할수 있도록 컨테이너에 자원을 배정하고 애플리케이션을 실행함.

YARN 아키텍처
  • Resource Manager : 클러스터 리소스를 관리
  • Node Manager : 노드의 리소스를 관리
  • Application Master : 

Hadoop 1 아키텍처

Hadoop 2 아키텍처



YARN VCore 및 Memory 설정

YARN VCore 및 Memory 설정의미
yarn.scheduler.minimum-allocation-mb
컨테이너에 할당할 수 있는 Memory의 최소 크기
yarn.scheduler.maximum-allocation-mb
컨테이너에 할당할 수 있는 Memory의 최대 크기
yarn.scheduler.minimum-allocation-vcores
각 Node Manager가 컨테이너에 할당할 수 있는 최소 VCore 개수
yarn.scheduler.maximum-allocation-vcores
각 Node Manager가 컨테이너에 할당할 수 있는 최대 VCore 개수
yarn.nodemanager.resource.cpuvcores 
컨테이너의 VCore 개수
yarn.nodemanager.resource.memorymb 
컨테이너의 메모리
yarn.app.mapreduce.am.resource.cpuvcores 
Application Master의 VCore 개수
yarn.app.mapreduce.am.resource.mb 
Application Master의 Memory
mapreduce.map.cpu.vcores 
Map Task의 CPU VCore 개수
mapreduce.map.memory.mb 
Map Task의 Memory
mapreduce.reduce.cpu.vcores 
Reduce Task의 CPU VCore 개수
mapreduce.reduce.memory.mb 
Reduce Task의 Memory
mapreduce.task.io.sort.mb 
I/O Sort Memory

YARN Scheduler

Spark의 실행 모드

실행 모드개요
Cluster Mode

Spark Driver의 실행 위치가 Client Application이 아닌 YARN의 Container

Spark Job의 무수히 많이 실행되는 상황이라면 Client 모드로 Spark Driver를 사용하는 경우 Client를 실행하는 서버는 엄청난 메모리를 소비하게 됨

Client Mode

Spark Driver가 Client Application 쪽에서 실행되는 구조

Scalable 하지 않지만 관리하기가 편리함

많은 Job이 실행되는 상황이라면 Client 모드는 지양해야 함

Spark의 아키텍처 기반 튜닝 포인트

  • Spark Job의 Spark Driver가 어디에서 실행되는가?
  • Executor의 개수는 적절한가
  • Executor의 GC가 과도하지 않은가? → 총 실행시간 대비 GC의 시간은?
  • 셔플링을 얼마나 수행하는가?
  • Executor당 VCore와 Memory가 적당한가? → 실행 옵션

Spark cluster components

Spark의 캐쉬 지우기

메소드의미
DataFrame.unpersist()
각 노드의 캐쉬 사용을 모니터링하고 오래된 데이터를 LRU에 따라서 제거
RDD.unpersist()
각 노드의 캐쉬 사용을 모니터링하고 오래된 데이터를 LRU에 따라서 제거
SqlContext.clearCache()
모든 캐쉬 테이블 제거

참고