Flink 프로세스 메모리 설정

Apache Flink는 다양한 컴포넌트의 메모리 사용을 엄격히 제어하여 JVM 위에서 효율적인 워크로드를 제공합니다. 커뮤니티는 모든 구성에 합리적인 기본값을 제공하려 노력하지만, 사용자가 Flink에 배포하는 애플리케이션의 폭이 넓기 때문에 항상 가능하지는 않습니다. 사용자에게 최대의 프로덕션 가치를 제공하기 위해 Flink는 클러스터 내 메모리 할당의 상위 수준 및 세밀한 튜닝을 모두 허용합니다. 메모리 요구 사항을 최적화하려면 네트워크 메모리 튜닝 가이드를 확인하세요.

출처: 문서

본문

여기서 설명하는 메모리 구성은 TaskManager의 경우 1.10, JobManager 프로세스의 경우 1.11 릴리스부터 적용됩니다. 이전 버전에서 Flink를 업그레이드한다면 마이그레이션 가이드를 확인하세요. 1.10과 1.11 릴리스에서 많은 변경 사항이 도입되었기 때문입니다.

총 메모리 구성 (Configure Total Memory)

Flink JVM 프로세스의 총 프로세스 메모리는 Flink 애플리케이션이 소비하는 메모리(총 Flink 메모리)와 JVM이 프로세스를 실행하는 데 필요한 메모리로 구성됩니다. 총 Flink 메모리 소비에는 JVM 힙(Heap)과 비힙(Off-heap, Direct 또는 Native) 메모리 사용이 포함됩니다.

Flink에서 메모리를 설정하는 가장 간단한 방법은 다음 두 옵션 중 하나를 구성하는 것입니다:

컴포넌트 TaskManager 옵션 JobManager 옵션
총 Flink 메모리 taskmanager.memory.flink.size jobmanager.memory.flink.size
총 프로세스 메모리 taskmanager.memory.process.size jobmanager.memory.process.size

로컬 실행에 대해서는 TaskManager 및 JobManager 프로세스에 대한 자세한 정보를 참고하세요.

나머지 메모리 컴포넌트는 기본값 또는 추가 구성 옵션에 따라 자동으로 조정됩니다. TaskManager 및 JobManager 메모리의 다른 컴포넌트를 설정하는 방법도 참고하세요.

총 Flink 메모리를 구성하는 것은 Flink 자체에 얼마나 많은 메모리를 줄지 선언하려는 독립(standalone) 배포에 더 적합합니다. 총 Flink 메모리는 JVM 힙과 비힙 메모리로 나뉩니다. 독립 배포의 메모리 구성 방법도 참고하세요.

총 프로세스 메모리를 구성하면 Flink JVM 프로세스에 전체적으로 얼마나 많은 메모리를 할당해야 하는지 선언하는 것입니다. 컨테이너화된 배포에서는 요청된 컨테이너의 크기에 해당합니다(Kubernetes 또는 Yarn용 컨테이너 메모리 구성 참고).

메모리를 설정하는 또 다른 방법은 구체적인 Flink 프로세스 특유의 총 Flink 메모리 내부 컴포넌트를 구성하는 것입니다. TaskManager와 JobManager에 대해 구성하는 방법을 확인하세요.

로컬 실행을 제외하고 Flink의 메모리를 구성하려면 언급된 세 가지 방법 중 하나를 사용해야 합니다. 그렇지 않으면 Flink 시작이 실패합니다. 즉, 기본값이 없는 다음 옵션 하위 집합 중 하나를 명시적으로 구성해야 합니다:

TaskManager용 JobManager용
taskmanager.memory.flink.size jobmanager.memory.flink.size
taskmanager.memory.process.size jobmanager.memory.process.size
taskmanager.memory.task.heap.sizetaskmanager.memory.managed.size jobmanager.memory.heap.size

총 프로세스 메모리와 총 Flink 메모리 둘 다를 명시적으로 구성하는 것은 권장하지 않습니다. 잠재적인 메모리 구성 충돌로 인해 배포 실패로 이어질 수 있습니다. 다른 메모리 컴포넌트를 구성하는 것도 추가 구성 충돌을 만들 수 있으므로 주의가 필요합니다.

JVM 파라미터 (JVM Parameters)

Flink는 시작 시 구성되거나 도출된 메모리 컴포넌트 크기에 따라 다음과 같은 메모리 관련 JVM 인자를 명시적으로 추가합니다:

JVM 인자 TaskManager 값 JobManager 값
-Xmx 및 -Xms Framework + Task 힙 메모리 JVM 힙 메모리 (*)
-XX:MaxDirectMemorySize (항상 TaskManager에만 추가됨, JobManager 주석 참고) Framework + Task 비힙 (**) + 네트워크 메모리 비힙 메모리 (),(*)
-XX:MaxMetaspaceSize JVM Metaspace JVM Metaspace

(*) 사용하는 GC 알고리즘에 따라 힙 메모리 전체를 사용하지 못할 수 있습니다. 일부 GC 알고리즘은 스스로 일정량의 힙 메모리를 할당합니다. 이로 인해 Heap 메트릭이 반환하는 최댓값이 달라질 수 있습니다.

(**) 사용자 코드의 네이티브 비-direct 메모리 사용도 비힙 메모리의 일부로 간주될 수 있음에 유의하세요.

(***) JVM Direct 메모리 제한은 해당 옵션 jobmanager.memory.enable-jvm-direct-memory-limit이 설정된 경우에만 JobManager 프로세스에 추가됩니다.

관련 컴포넌트 구성 방법을 이해하려면 TaskManager와 JobManager의 상세 메모리 모델도 확인하세요.

상한이 있는 비율 컴포넌트 (Capped Fractionated Components)

이 섹션은 최소-최대 범위에 제약을 받으면서 다른 메모리 크기의 분수(fraction)가 될 수 있는 옵션의 구성 상세를 설명합니다:

  • JVM Overhead는 총 프로세스 메모리의 분수가 될 수 있습니다.
  • 네트워크 메모리는 총 Flink 메모리의 분수가 될 수 있습니다(TaskManager에만 해당).

관련 컴포넌트 구성 방법을 이해하려면 TaskManager와 JobManager의 상세 메모리 모델도 확인하세요.

이러한 컴포넌트의 크기는 항상 최댓값과 최솟값 사이여야 합니다. 그렇지 않으면 Flink 시작이 실패합니다. 최댓값과 최솟값은 기본값이 있거나 해당 구성 옵션으로 명시적으로 설정할 수 있습니다.

예를 들어 다음 메모리 옵션만 설정한다면:

  • 총 프로세스 메모리 = 1000MB
  • JVM Overhead min = 64MB
  • JVM Overhead max = 128MB
  • JVM Overhead fraction = 0.1

JVM Overhead는 1000MB x 0.1 = 100MB가 되며 64-128MB 범위 안에 있습니다.

최댓값과 최솟값이 같게 구성하면 그 값으로 크기가 사실상 고정됩니다.

컴포넌트 메모리를 명시적으로 구성하지 않으면 Flink는 총 메모리 기준으로 분수를 사용해 메모리 크기를 계산합니다. 계산된 값은 해당 min/max 옵션에 의해 상한이 정해집니다. 예를 들어 다음 메모리 옵션만 설정한다면:

  • 총 프로세스 메모리 = 1000MB
  • JVM Overhead min = 128MB
  • JVM Overhead max = 256MB
  • JVM Overhead fraction = 0.1

JVM Overhead는 128MB가 됩니다. 분수로 도출된 크기가 100MB로 최솟값보다 작기 때문입니다.

또한 총 메모리와 그 다른 컴포넌트의 크기가 정의되면 분수가 무시될 수도 있습니다. 이 경우 JVM Overhead는 총 메모리의 나머지입니다. 도출된 값은 여전히 min/max 범위 안에 있어야 하며, 그렇지 않으면 구성이 실패합니다. 예를 들어 다음 메모리 옵션만 설정한다고 가정합니다:

  • 총 프로세스 메모리 = 1000MB
  • task 힙 = 100MB (JobManager의 JVM Heap에 대해서도 비슷한 예가 가능)
  • JVM Overhead min = 64MB
  • JVM Overhead max = 256MB
  • JVM Overhead fraction = 0.1

총 프로세스 메모리의 다른 모든 컴포넌트는 기본 Managed Memory fraction(또는 JobManager의 비힙 메모리)을 포함해 기본값을 갖습니다. 그러면 JVM Overhead는 분수(1000MB x 0.1 = 100MB)가 아니라 총 프로세스 메모리의 나머지가 되며, 이는 64-256MB 범위 안에 있거나 실패합니다.

더 알아보기 (Learn more)