Spark Memory 정리

Q·2023년 11월 23일
0

Spark Memory 관리

  1. 종류
  • Static Memory Manager (Static Memory Management) 정적
  • Unified Memory Manager (Unified memory management) 통합

spark 1.6.0부터 통합 메모리 관리자가 Spark의 기본 메모리 관리자로 설정되었습니다.
정적 메모리 관리자는 유연성 부족으로 인해 더 이상 사용되지 않습니다.
두 메모리 관리자 모두에서 Java 힙의 일부는 Spark 애플리케이션 처리를 위해 위치하며 나머지 메모리는 Java 클래스 참조 및 메타데이터 사용을 위해 예약됩니다.

Static Memory Manager (Static Memory Management) 정적 메모리 관리

메모리 관리를 위한 전통적인 모델이자 간단한 체계

참고: 정적 메모리 할당 방법은 Spark 3.0에서 제거되었습니다.

장점:

  • Static Memory Manager 메커니즘은 구현하기 쉽습니다.

단점:

  • 저장 메모리에 여유 공간이 있어도 사용할 수 없으며 실행기 메모리가 가득 차서 디스크 유출이 있습니다. (반대의 경우도 마찬가지)

Unified Memory Manager (Unified memory management) 통합 메모리 관리

  • 1.6.0 스파크 이상부터, 새로운 메모리 관리자는 스파크를 제공하는 정적 메모리 관리자를 대체 채용 Dynamic 메모리 할당
  • Storage 및 Execution이 공유하는 통합 메모리 컨테이너로 메모리 영역을 할당
  • Execution 메모리를 사용하지 않는 경우 Storage 메모리는 사용 가능한 모든 메모리를 획득할 수 있으며 그 반대의 경우도 마찬가지
  • Storage 또는 Execution 메모리에 더 많은 공간이 필요한 경우, acquireMemory()라는 함수가 메모리 풀 중 하나를 확장하고 다른 메모리 풀을 축소

장점:

  1. Storage 메모리와 Execution 메모리 사이의 경계는 고정되어 있지 않으며 메모리 부족의 경우 경계가 이동 됩니다. 즉, 한 영역이 다른 영역에서 공간을 차용하여 확장
  2. 응용 프로그램에 캐시 및 전파가 없는 경우 불필요한 디스크 오버플로를 방지하기 위해 실행 시 모든 메모리를 사용
  3. 응용 프로그램에 캐시가 있는 경우 데이터 블록이 영향을 받지 않도록 최소 Storage 메모리를 예약
  4. 이 접근 방식은 메모리가 내부적으로 분할되는 방식에 대한 사용자 전문 지식 없이도 다양한 워크로드에 대해 즉시 사용 가능한 합리적인 성능을 제공

JVM의 두 가지 유형의 메모리

  1. On-Heap Memory Managment (In-Memory) : Object는 JVM heap에 할당되고 GC에 의해 바인딩

  2. Off-Heap Memory Managment (External-Memory) : Object는 직렬화에 의해 JVM 외부의 메모리에 할당되고 Application에 의해 관리되며 GC에 바인딩되지 않음
    일반적으로 Object의 읽기 및 쓰기 속도는 ( On-Heap > Off-Heap > DISK) 순

온힙 메모리 (On-Heap Memory)

  • 기본적으로 Spark는 온힙 메모리만 사용합니다. 온힙 메모리의 크기 는 Spark 애플리케이션이 시작될 때 --executor -memory 또는 spark.executor.memory 매개변수에 의해 구성
  • Executor 내에서 실행되는 동시 작업은 JVM의 힙 메모리를 공유
매개변수설명
spark.memory.fraction (기본값 0.75)-spark1.6이상실행 및 저장에 사용되는 힙 공간의 비율입니다. 이 값이 낮을수록 유출 및 캐시된 데이터 제거가 더 자주 발생합니다. 이 구성의 목적은 내부 메타데이터, 사용자 데이터 구조 및 희소하고 비정상적으로 큰 레코드의 경우 부정확한 크기 추정을 위한 메모리를 따로 확보하는 것입니다.
spark.memory.storageFraction (기본값 0.5)spark.memory.fraction 에 의해 따로 설정된 공간 내 저장 영역의 크기입니다 . 캐시된 데이터는 총 스토리지가 이 영역을 초과하는 경우에만 제거될 수 있습니다.

Reserved Memory

  1. 예약된 메모리는 시스템용으로 예약된 메모리이며 Spark의 내부 개체를 저장하는 데 사용됩니다.

  2. Spark v1.6.0+부터 값은 300MB입니다. 즉, 300MB의 RAM이 Spark 메모리 영역 크기 계산에 참여하지 않습니다

  3. executor memory < reserved memory *1.5 인경우 에러

User Memory

  1. 사용자 메모리는 사용자 정의 데이터 구조, Spark 내부 메타데이터, 사용자가 생성한 모든 UDF, RDD 종속성 정보에 대한 정보 등 RDD 변환 작업에 필요한 데이터를 저장하는 데 사용되는 메모리

Spark Memory

  1. Apache Spark에서 관리하는 메모리 풀입니다. Spark 메모리는 조인과 같은 작업 실행을 수행하거나 브로드캐스트 변수를 저장하는 동안 중간 상태를 저장하는 역할

  2. 모든 캐시/지속 데이터는 이 세그먼트, 특히 이 세그먼트의 스토리지 메모리에 저장

  3. (Java Heap — Reserved Memory) * spark.memory.fraction

  4. Spark 작업은 두 가지 기본 메모리 영역에서 작동

    • Execution – 셔플, 조인, 정렬 및 집계에 사용
    • Storage – 데이터 파티션을 캐시하는 데 사용

이들 사이의 경계는 spark.memory.storageFraction 매개변수에 의해 설정되며 기본값은 0.5 또는 50%

Storage Memory

  • Storage 메모리는 모든 캐시된 데이터, 브로드캐스트 변수 및 언롤 데이터 등을 저장하는 데 사용됩니다. "unroll"은 본질적으로 직렬화된 데이터를 역직렬화하는 프로세스입니다.
  • MEMORY를 포함하는 모든 지속 옵션에 대해 Spark는 해당 데이터를 이 세그먼트에 저장합니다.
  • Spark는 LRU(Least Recent Used) 메커니즘을 기반으로 오래된 캐시된 개체를 제거하여 새 캐시 요청을 위한 공간을 지웁니다.
  • 캐시된 데이터가 Storage에서 나오면 디스크에 기록되거나 구성에 따라 다시 계산됩니다. 브로드캐스트 변수는 MEMORY_AND_DISK 영구 수준으로 캐시에 저장됩니다. 여기에 캐시된 데이터와 수명이 긴 데이터가 저장됩니다.
  • (Java Heap — Reserved Memory) spark.memory.fraction spark.memory.storageFraction

Execution Memory

  • Execution 메모리는 Spark 작업을 실행하는 동안 필요한 개체를 저장하는 데 사용됩니다.
  • 예를 들어, 메모리의 Map 측에 셔플 중간 버퍼를 저장하는 데 사용됩니다. 또한 해시 집계 단계를 위한 해시 테이블을 저장하는 데 사용됩니다.
  • 이 풀은 또한 사용 가능한 메모리가 충분하지 않은 경우 디스크 유출을 지원하지만 이 풀의 블록은 다른 스레드(작업)에 의해 강제로 제거될 수 없습니다.
  • Execution 메모리는 Storage보다 수명이 짧은 경향이 있습니다. 각 작업 후 즉시 제거되어 다음 작업을 위한 공간을 만듭니다.
  • (Java Heap — Reserved Memory) spark.memory.fraction (1.0 - spark.memory.storageFraction)

Execution 및 Storage 풀 차용 규칙:

  1. Storage 메모리는 블록이 실행 메모리에서 사용되지 않는 경우에만 Execution 메모리에서 공간을 빌릴 수 있습니다.
  2. Execution 메모리는 블록이 스토리지 메모리에서 사용되지 않는 경우 Storage 메모리에서 공간을 빌릴 수도 있습니다.
  3. Execution 메모리의 블록이 Storage 메모리에서 사용되고 실행에 더 많은 메모리가 필요한 경우 Storage 메모리가 차지하는 초과 블록을 강제로 축출할 수 있습니다.
  4. Storage 메모리의 블록이 Execution 메모리에서 사용되고 스토리지가 더 많은 메모리를 필요로 하는 경우 Execution 메모리가 차지하는 초과 블록을 강제로 축출할 수 없습니다. 그것은 더 적은 메모리 영역을 갖게 될 것입니다. Spark가 Execution 메모리에 저장된 초과 블록을 해제할 때까지 기다렸다가 이를 차지합니다.

참고

profile
Data Engineer

0개의 댓글