Spark Memory Allocation & Memory Management
- Spark는 JVM(Java Virtual Machine) 위에서 동작
- Spark의 메모리 관리 구조는 주로 Spark Memory, Memory inside of JVM 및 Memory outside JVM 으로 나눌 수 있음
Memory inside of JVM
- JVM 내부 메모리는 Spark application에서 대부분의 연산이 이루어지는 공간
Reserved memory
- Spark의 JVM process가 시작될 때, 일정한 메모리 영역은 시스템을 위해 예약, Spark에서 사용 불가
- JVM 자체 오버헤드(EX:메타데이터 관리,힙 오브젝트, 코드 실행)에 사용
- default Value = 300MB, spark.memory.offHeap.size 로 조정 불가능
- spark.memory.reserved로 예약 메모리 크기 설장 할 수 있음
Spark Memory
- JVM 내부에서 Spark가 사용하는 memory
- 주로 두 가지 용도로 사용
- 1.Execution Memory
- 2.Storage Memory
- Spark는 Unified Memory Management라는 메모리 관리 모델을 사용, 두 영역을 동적으로 메모리 공유 할 수 있음.
Execution memory(operations)
- 연산잔업 ( EX: shuffle, sort, join 등) 을 처리할 때 사용하는 memory
- Spark 내부 연산에서 일시적으로 필요한 memory로 작업이 완료되면 메모리 해제
- Spark의 중간 데이터 처리에 필요하며, 주로 RDD, DataFrame을 처리할 때 사용
- Spark에서 큰 연산 작업이 이루어질 때, Execution Memory가 충분하지 않으면 disk에 데이터를 기록하고 연산 성능이 저하될 수 있음
Storage memory(caching)
- caching 및 데이터 저장을 위해 사용. RDD, DataFrame을 메모리에 캐시할 때 이 영역을 사용
- caching 된 데이터는 나중에 다시 사용할 수 있도록 메모리에 저장, 필요한 경우 디스크에 저장할 수 있음
- spark.storage.memoryFraction 으로 설정되는 비율에 따라, Storage Memory가 Execution Memory와 메모리를 공유할 수 있음
- 캐시된 데이터는 주로 중복 계산을 피하기 위해 사용, 저장할 공간이 부족할 경우 오래된 캐시된 데이터가 지워질 수 있음 (LRU 방식)
Unified Memory Model(통합 메모리 모델)
- Execution Memory와 Storage Memory가 동적으로 메모리를 공유할 수 있도록 허용
- Storage 메모리가 부족할 때 Execution 메모리에서 사용하지 않는 메모리를 빌려올 수 있고, 그 반대도 가능
User memory
- Spark가 아닌 사용자 정의 애플리케이션 코드에서 사용하는 memory
- 사용자가 사용자 정의 함수(UDF)를 작성하거나, 사용자 정의 데이터 구조를 관리 할 때 필요한 memory
- Spark는 JVM Heap에서 일정 비율을 사용자 메모리로 예약해 두며, 나머지는 시스템 메모리로 할당
Memory outside of JVM (overheadMemory)
- Saprk는 JVM 외부에서도 메모리 사용 가능
- JVM Heap Memory 만으로 모든 데이터를 처리하기에는 한계가 있을 수 있기 때문에 외부 메모리에서 추가적으로 작업을 처리하거나 오버헤드를 관리
overhead memory
- Spark가 실제 작업을 처리하는 데 필요한 추가 메모리. 주로 셔플, 데이터 직렬화 및 네트워크 통신 같은 부가적인 작업에서 사용
- Spark 작업을 관리하는 Driver와 Executor에서 필요한 자원이 포함 됨
- 이 메모리는 JVM 외부에서 사용 될 수 있으며 , 특히 자원 관리(YARN, Kubernetes)와 연계된 환경에서는 중요
OffHeap memory
- JVM 힙 외부에서 관리되는 메모리, 주로 대규모 데이터를 효율적으로 처리하기 위해 사용
- Spark에서 Off-Heap 메모리를 사용하려면 spark.memory.offHeap.enabled 설정을 활성화해야하며, spark.memory.offHeap.size로 크기를 설정 가능
- OffHeap 메모리는 주로 메모리 관리 효율성을 높이고, 가비지 컬렉션의 영향을 줄이기 위해 사용
External process memory
- Spark는 외부 프로세스를 실행하여 작업을 수행하는 경우도 있음, 이때 JVM 외부의 외부 프로세스에서 사용하는 메모리도 포함
- EX : Hadoop의 HDFS 작업이나 다른 분산 파일 시스템과 통신할 때 외부 프로세스에서 메모리를 사용