터칭 데이터

Driver Executor Memory 본문

SparkML

Driver Executor Memory

터칭 데이터 2024. 2. 5. 14:06

 

Spark 고급과 Spark ML


Shuffling시 Skew 처리방식과 Spark ML에 대해 배워보자

 

 

 

 

 

 

 

 

Contents


1. 기타 기능/개념 살펴보기
2. Driver와 Executor 해부
3. 메모리 이슈 정리
4. JVM과 Python 간의 통신
5. Caching과 Persist
6. Dynamic Partition Pruning

 

 

 

 

 

 

Driver와 Executor 해부

 

Driver와 Executor의 리소스 사용에 대해 알아보자

 

 

 

 

 

 

Driver의 역할

Spark Application = (1 Driver) + (1+ Executor)

Driver는 다음 역할을 수행

● main 함수 실행하고 SparkSession/SparkContext를 생성
● 코드를 태스크로 변환하여 DAG 생성
● 이를 execution/logical/physical plan으로 변환
● 리소스 매니저의 도움을 받아 태스크들을 실행하고 관리
    ▪ task의 수가 너무 많아지면 driver 메모리 에러 발생
● 위의 정보들을 Web UI로 노출시킴 (4040 포트)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Driver 메모리 구성

 

spark.driver.memory = 4GB
spark.driver.cores = 4


spark.driver.memoryOverhead = 0.1
● max(spark.driver.memory의 10%, 384MB)

 

 

 

 

 

 

 

 

 

 

 

Executor 메모리 구성

 

 

 

 

 

 

 

 

 

 

 

 

 

 

메모리 구성 - Heap 메모리(8GB)만 보자

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

메모리 구성 - User Memory를 보자

 

 

 

 

 

 

 

 

 

 

 

 

메모리 구성 - Spark Memory를 보자

 

 

 

 

 

 

 

 

 

 

 

Executor CPU

 

 

 

 

 

 

 

 

 

 

 

 

 

Executor Resource

 

 

 

 

 

 

 

 

 

 

 

 

 

Executor Memory Pool Management

 

Static Memory Management

● Spark 1.6전에는 슬롯들끼리 공평하게 나눠 가짐

 

지금은 Unified Memory Manager를 사용함

● 동작중인 태스크 대상으로 Fair Allocation이 기본 동작
    ▪ 즉 실행중인 태스크가 모든 메모리를 가져가는 구조임

 

 

 

 

 

 

 

 

 

Unified Memory Management

 

Executor 메모리가 부족해지기 시작하면 어떤 일이 생길까?

● 메모리가 부족해지면 Storage Memory Pool에 남는 메모리를 사용
● spark.memory.storageFraction로 지정된 비율은 시작 비율
    ▪ 하지만 양쪽의 메모리가 차기 시작하면 이 경계선은 지켜지면서 eviction 발생

 

반대로 Storage 메모리가 부족하기 시작한다면?

● DataFrame 캐싱을 하기위한 메모리가 부족해지면 Executor Memory Pool에 남는 메모리 사용
● 하지만 결국 spark.memory.storageFraction 이상은 넘어가지지 않음

 

더 이상 쓸 메모리가 없다면?

● 데이터를 메모리에서 디스크로 옮김 (disk spill)
● 디스크로 spill을 할 수 없다면 OOM (Out of Memory) 발생

 

 

 

 

 

 

 

 

 

 

 

 

Spark Executor Memory Configuration (1)

 

 

 

 

 

 

 

 

 

 

 

 

 

Spark Executor Memory Configuration (2)

 

결국 하나의 Executor에 할당되는 메모리는 아래와 같음:
spark.executor.memoryOverhead + spark.executor.memory + spark.memory.offHeap.size + 
spark.executor.pyspark.memory (+ spark.python.worker.memory)

 

 

 

 

 

 

 

 

 

 

What is Off Heap Memory?

Spark은 On Heap 메모리에서 가장 잘 동작함

● 하지만 JVM Heap은 Garbage collection의 대상이 됨
● JVM Heap의 크기가 클수록 Garbe collection으로 인한 비용 증가
● 이 때 같이 사용할 수 있는 것이 JVM 밖에 있는 메모리

    ▪ Overhead 메모리
    ▪ Off Heap 메모리
        • spark.memory.offHeap.enabled를 true로 설정
        • spark.memory.offHeap.size에 원하는 크기 지정

 

 

 

 

 

 

 

Spark 3.x의 Off heap memory 정리

 

Spark 3.x는 Off Heap memory 작업에 최적화

● JVM 없이 직접 메모리 관리 가능 (프로젝트 텅스턴)

 

Spark 3.x는 Off Heap 메모리를 DataFrame용으로 사용

● GC의 발생을 줄일 수 있음

 

즉 Off Heap 메모리의 크기는

● spark.executor.memoryOverhead + spark.offHeap.size
● spark.offHeap.size를 사용해서 executor memory의 증가없이 off heap 메모리 증가가 가능

 

 

 

 

 

 

'SparkML' 카테고리의 다른 글

Cache & Persist  (0) 2024.02.05
Driver Executor OOM  (0) 2024.02.05
Spark Scheduler  (0) 2024.02.05
Resource Dynamic Allocation  (0) 2024.02.05
Speculative Execution  (0) 2024.02.05