spark

spark memory 관리

코드모헨 2024. 2. 27. 18:03
spark 1.6+ 부터 spark는 StatciMemoryManager에서  UnifiedMemoryManager로 메모리 관리 모델을 바꾸었다

 

 

On - heap memory

- jvm에서 관리되는 메모리 영역으로 우리가 spark.executor.memory로 정하는 메모리 크기가 할당된다.

- GC가 작동되며 GC에 의해 메모리관리가 이루어진다.

Spark executor의 메모리 구조

보통 스파크의 executor의 메모리는 spark.executor.memory 옵션을 통해 정한다.

spark.executor.memory옵션은 executor의 java heap memory의 양을 결정한다. 

 

그럼 이 memory는 어떻게 관리 될까?

 

spark의 oom 그리고 spill data를 막기 위해서 memory에 대한 이해는 중요하다.

 

 

1. spark executor의 메모리는 크게 3가지 부분으로 나뉘어 진다.

 

 

스파크 메모리 구조  출처:https://spidyweb.tistory.com/514

 

  1. spark memory
  2. user memory
  3. Reseved Memory

이 중 1,2 두 영역을 spark에서 사용가능한 메모리 영역으로 구분한다.

reserved memory의 경우 시스템에 할당된 메모리이자, 스파크내부 객체를 유지하기 위해 사용하는 메모리 영역이다

default 값으로 300MB를 사용하며 이 영역은 왠만큼 중대한 사항이 아닌이상 건들면 안된다.

Spark Memory

spark memory는 spark 에서 유지 관리가 가능한 영역이다.

spark memory는 2개로 나뉘어 진다 

 

1. storage memory
2. execution memory

 

storage memory는 cache된 데이터, 및 브로드캐스트 변수등을 저장한다.

 

execution memory는 suffle, join, sort affregation등의 작업에서 사용되는 메모리다.

 

이 두 메모리는 서로 다이나믹하게 공간을 같이 사용한다.

즉 storage memory가 부족하면 execution에서 땡겨와 사용한다. 이때 당연히 execution memory가 비어있는 공간만 사용가능하다.

 

단, 데이터를 cache할 때 주로 cache()와 persist()가 있다. 
(persist의 기본 옵션은 저장 level은 persist(StorageLevel.MEMORY_AND_DISK) 메모리가 충분하면 on-heap에 저장 부족하면 spill하여 disk에 저장을 뜻한다.)

 

User memory

유저 메모리는 유저가 만든 UDF 혹은 RDD변환에 필요한 데이터를 저장한다. 이 메모리는 spark에서 담당하지 않는다. 즉 스파크앱으로 유지관리 하는 부분이 아니다.

 

메타데이터( RDD변환에 필요한 데이터 )란?

더보기

1. 데이터를 분산하고 파티셔닝 하는데에 필요한 정보

2. 스키마 정보

3. 로직 그리고 물리적 계획정보

 

이러한 정보들이 메타데이터에 해당한다

off - heap memory

※ off-heap 이란 jvm 에서 관리하지 않고 os에서 관리하는 영역의 memory를 뜻한다.

 

- jvm에서 관리하지 않는 메모리 영역이다. 

- GC 외부 영역으로 GC의 영향을 받지 않는다.

 

spark.memory.offHeap.enabled (default false)를 true로 했을 때 사용할수 있다.

단 spark.memory.offHeap.size를 무조건 설정해주어야 한다.

 

이후 저장 level을 StorageLevel.OFF_HEAP로 설정한뒤 cache /persist명령어를 통해 이부분에 dataframe/dataset을 저장할 수 있다.

 

off heap은 spark.executor.memory와 전혀 상관없으며 spark.executor.memory로 할당된 메모리 영역을 사용하지 않는다.

왜 off- heap memory를 사용할까?

  • GC overhead를 줄이기 위해 사용된다.
    •  상당히 큰 dataset/ dataframe은 상당히 큰 GC 오버헤드를 일으킨다. 그리고 이 영향으로 app이 중단될 수 있다.
    • 한편 off heap은 GC에 영향을 받지 않으니 마음껏 큰 df를 써도 된다. 
  •  큰 메모리공간을 사용할 수 있다.
    • JVM heap space는 한정적이다. 그리고 gc의 능력 범주내에서만 써야한다는 부담도 있다.
  • 성능 최적화를 위해 사용한다
    • serialization cost를 줄여준다. off heap memory는 serialized data 를 저장하는데 on-heap보다 더 뛰어나다.
    • 스파크의 텅스턴 엔진(binary형식이다 즉, serialized된 data)은 off-heap을 효과적으로 사용한다. 
    • executor가 죽어도 off-heap은 살아있을수 있다. jvm이 아니므로
    • 단, on-heap 보다 접근속도는 느리다.

 

off heap memory는 serialized data 를 저장하는데 on-heap보다 더 뛰어나다. 하지만 off-heap은 jvm 오버헤드 string interning(string을 메모리 공간에 저장하고 계속 재활용하는 방식) 분야에도 사용되기 때문에 까다로운 메모리 관리가 요구된다.

 

 

출처 https://medium.com/walmartglobaltech/decoding-memory-in-spark-parameters-that-are-often-confused-c11be7488a24

 

'spark' 카테고리의 다른 글

spark 와 db연동 하기  (0) 2025.01.22
Repartiotion 방법  (0) 2024.02.16
Spark partition 이해하기  (1) 2024.02.16
자주사용되는 spark config  (0) 2024.02.13
Spark 설치하기 in Linux - ubuntu  (0) 2023.12.22