개요
- spark-submit을 돌리던 중 옵션에서 driver-memory, executor-memory 는 on-heap memory를 설정하며
- spark.executor.memoryOverhead는 Spark 익스큐터 프로세스에 대해 off-heap memory를 설정한다는 것을 알게 되었다.
On-heap Store
On-Heap 메모리는 Java의 가비지 컬렉션 관리 하에 있는 메모리 영역이다. 여기에는 객체, 클래스 메타데이터, 그리고 JVM이 실행에 필요로 하는 구조들이 저장되며 Java 애플리케이션에서 대부분의 데이터는 기본적으로 on-heap 메모리에 저장된다.
Off-heap Store
Off-Heap 메모리는 JVM의 가비지 컬렉션 관리 범위 밖에 있는 메모리 영역다. 이 영역은 JVM 외부에 위치하며, Java NIO 라이브러리와 같은 메커니즘을 통해 직접 관리된다. Off-heap 메모리는 대규모 데이터 처리, 고성능 컴퓨팅, 네이티브 라이브러리와의 상호 작용에 주로 사용된다. Off-heap을 사용하면 가비지 컬렉션의 영향을 받지 않아 메모리 관리가 더 효율적일 수 있지만, 직접 관리해야 하는 복잡성이 증가한다.
예를 들어, Apache Spark는 대규모 데이터 처리에서 성능을 최적화하기 위해 off-heap 메모리를 사용할 수 있다. Spark는 off-heap 메모리를 사용하여 가비지 컬렉션 오버헤드를 줄이고, 메모리 사용을 보다 효율적으로 관리할 수 있다.
Spark, HBase, Hadoop 객체 메모리 관리
Spark:
-
On-Heap:
- 자바 객체: 사용자가 정의한 클래스들과 new 연산자를 통해 생성된 인스턴스들은 모두 JVM의 heap 메모리에 저장다.
- 직렬화된 객체: Spark는 데이터를 네트워크를 통해 전송하거나 디스크에 저장하기 전에 직렬화한다. 이 직렬화된 데이터도 기본적으로 heap에 저장된다.
-
Off-Heap:
- Tungsten 데이터 관리: Spark의 Tungsten 엔진은 바이너리 데이터 형식으로 off-heap 메모리를 사용하여 데이터 프레임과 RDD 데이터를 관리하는데 이는 가비지 컬렉션 오버헤드를 최소화하는 데 도움이 된다.
- 직렬화된 객체: Off-heap 메모리에 저장될 수도 있는데, 이는 spark.memory.offHeap.enabled 설정을 사용하여 구성할 수 있다.
Hadoop:
-
On-Heap:
- 자바 객체: Hadoop의 Mapper와 Reducer와 같은 사용자 정의 코드에서 생성되는 일반적인 객체들은 on-heap 메모리에 저장된다.
- 직렬화된 객체: 데이터가 shuffle 단계를 거치면서 직렬화되고 이 직렬화된 객체들은 기본적으로 on-heap 메모리에 저장된다.
-
Off-Heap:
- DirectByteBuffer: Hadoop은 네트워크 I/O를 최적화하기 위해 off-heap 메모리에 DirectByteBuffer를 사용하여 데이터를 읽고 쓴다.
HBase:
-
On-Heap:
- 자바 객체: HBase의 RegionServer와 Client에서 사용하는 일반적인 객체들은 on-heap 메모리에 저장된다.
- MemStore: MemStore는 HBase의 쓰기 성능을 최적화하는 데 사용되는 on-heap 메모리 구조이다.
-
Off-Heap:
- BucketCache: BucketCache는 읽기 작업을 최적화하는 데 사용되며, off-heap 메모리에 저장된다. 이는 대용량 테이블을 처리하는 경우 특히 유용하다.