메모리 마이그레이션 가이드
메모리 마이그레이션 가이드 (Memory Migration Guide)
메모리 설정은 1.10 릴리스의 TaskManagers와 1.11 릴리스의 JobManagers에서 크게 바뀌었습니다. 많은 구성 옵션이 제거되거나 의미가 변경되었습니다. 이 가이드는 TaskManager 메모리 구성을 Flink <= 1.9에서 >= 1.10으로, JobManager 메모리 구성을 Flink <= 1.10에서 >= 1.11로 마이그레이션하는 것을 돕습니다.
출처: 문서
본문
메모리 설정은 1.10 릴리스의 TaskManagers와 1.11 릴리스의 JobManagers에서 크게 바뀌었습니다. 많은 구성 옵션이 제거되거나 의미가 변경되었습니다. 이 가이드는 TaskManager 메모리 구성을 Flink <= 1.9에서 >= 1.10으로, JobManager 메모리 구성을 Flink <= 1.10에서 >= 1.11로 마이그레이션하는 데 도움을 줍니다.
경고: 레거시 및 새 메모리 구성은 메모리 구성 요소의 크기가 달라질 수 있으므로 이 가이드를 반드시 검토해야 합니다. TaskManagers의 경우 1.10 이전, JobManagers의 경우 1.11 이전의 Flink 구성을 재사용하려 하면 애플리케이션의 동작, 성능 또는 구성 실패가 변경될 수 있습니다.
참고: TaskManagers의 경우 버전 1.10 이전, JobManagers의 경우 1.11 이전에는 모든 메모리 관련 옵션에 기본값이 있었으므로 Flink가 전혀 설정을 요구하지 않았습니다. 새 메모리 구성은 다음 옵션 중 적어도 하나의 부분집합을 명시적으로 구성해야 하며, 그렇지 않으면 구성이 실패합니다:
Flink와 함께 배포되는 기본 Flink 구성 파일은 기본 메모리 구성을 일관되게 만들기 위해 taskmanager.memory.process.size(1.10부터)와 jobmanager.memory.process.size(1.11부터)를 설정합니다.
이 스프레드시트는 레거시와 새 메모리 계산의 결과를 평가하고 비교하는 데도 도움이 됩니다.
Task Manager 메모리 구성 마이그레이션 (Migrate Task Manager Memory Configuration)
구성 옵션 변경 사항 (Changes in Configuration Options)
이 장은 1.10 릴리스에서 도입된 Flink 메모리 구성 옵션의 모든 변경 사항을 간략히 나열합니다. 또한 새 구성 옵션으로 마이그레이션하는 자세한 내용은 다른 장을 참조합니다.
다음 옵션은 완전히 제거되었습니다. 여전히 사용되면 무시됩니다.
| 제거된 옵션 | 참고 |
|---|---|
taskmanager.memory.fraction |
새 옵션 taskmanager.memory.managed.fraction의 설명을 확인하세요. 새 옵션은 다른 의미를 가지며 일반적으로 더 이상 사용되지 않는 옵션의 값을 조정해야 합니다. managed memory 마이그레이션 방법도 참고하세요. |
taskmanager.memory.off-heap |
온힙(on-heap) managed memory는 더 이상 지원되지 않습니다. managed memory 마이그레이션 방법도 참고하세요. |
taskmanager.memory.preallocate |
사전 할당(pre-allocation)은 더 이상 지원되지 않으며 managed memory는 항상 지연(lazy) 할당됩니다. managed memory 마이그레이션 방법도 참고하세요. |
다음 옵션은 더 이상 사용되지 않지만(디프리케이트), 여전히 사용되면 역호환성을 위해 새 옵션으로 해석됩니다:
| 디프리케이트된 옵션 | 해석 대상 |
|---|---|
taskmanager.heap.size |
|
taskmanager.memory.size |
taskmanager.memory.managed.size, managed memory 마이그레이션 방법도 참고하세요. |
taskmanager.network.memory.min |
taskmanager.memory.network.min |
taskmanager.network.memory.max |
taskmanager.memory.network.max |
taskmanager.network.memory.fraction |
taskmanager.memory.network.fraction |
네트워크 메모리 구성은 크게 바뀌지 않았지만 구성을 검증하는 것이 권장됩니다. 다른 메모리 구성 요소가 새 크기를 가지면(예: 네트워크가 분수일 수 있는 total memory) 변경될 수 있습니다. 새 상세 메모리 모델도 참고하세요.
컨테이너 컷오프 구성 옵션인 containerized.heap-cutoff-ratio와 containerized.heap-cutoff-min은 TaskManagers에서 더 이상 효과가 없습니다. container cut-off 마이그레이션 방법도 참고하세요.
총 메모리 (Total Memory, 이전 Heap Memory)
Flink가 사용하는 총 메모리를 담당했던 이전 옵션은 taskmanager.heap.size 또는 taskmanager.heap.mb입니다. 이름과 달리 JVM Heap뿐만 아니라 다른 오프힙 메모리 구성 요소도 포함했습니다. 이 옵션들은 디프리케이트되었습니다.
대응하는 새 옵션을 지정하지 않고 언급한 레거시 옵션을 사용하면 다음 새 옵션으로 직접 변환됩니다:
- standalone 배포의 경우 총 Flink 메모리 (
taskmanager.memory.flink.size) - 컨테이너화된 배포(Yarn)의 경우 총 프로세스 메모리 (
taskmanager.memory.process.size)
다음 릴리스에서 완전히 제거될 수 있으므로 레거시 옵션 대신 새 옵션을 사용하는 것이 권장됩니다.
지금 총 메모리를 구성하는 방법도 참고하세요.
JVM Heap 메모리 (JVM Heap Memory)
JVM Heap 메모리는 이전에 managed memory(온힙으로 구성된 경우)와 힙 메모리의 다른 모든 사용처를 포함하는 나머지로 구성되었습니다. 이 나머지는 총 메모리의 남은 부분이었습니다. managed memory 마이그레이션 방법도 참고하세요.
이제 total Flink memory 또는 total process memory만 구성하면 JVM Heap은 총 메모리에서 다른 모든 구성 요소를 뺀 나머지입니다. 총 메모리 구성 방법도 참고하세요.
추가로 이제 연산자 태스크에 할당된 JVM Heap을 더 직접적으로 제어할 수 있습니다 (taskmanager.memory.task.heap.size). Task (Operator) Heap Memory도 참고하세요. JVM Heap 메모리는 스트리밍 작업에 heap 상태 백엔드(MemoryStateBackend 또는 FsStateBackend)를 선택하면 그에 의해서도 사용됩니다.
JVM Heap의 일부는 이제 항상 Flink 프레임워크를 위해 예약됩니다 (taskmanager.memory.framework.heap.size). Framework memory도 참고하세요.
Managed Memory
지금 managed memory를 구성하는 방법도 참고하세요.
명시적 크기 (Explicit Size)
managed memory 크기를 구성하던 이전 옵션(taskmanager.memory.size)은 taskmanager.memory.managed.size로 이름이 바뀌고 디프리케이트되었습니다. 레거시 옵션은 향후 릴리스에서 제거될 수 있으므로 새 옵션을 사용하는 것이 권장됩니다.
분수 (Fraction)
명시적으로 설정하지 않으면 managed memory는 이전에 총 메모리에서 네트워크 메모리와 컨테이너 컷오프를 뺀 값의 분수(taskmanager.memory.fraction)로 지정될 수 있었습니다(Yarn 배포만 해당). 이 옵션은 완전히 제거되었으며 여전히 사용되면 효과가 없습니다. 대신 새 옵션 taskmanager.memory.managed.fraction을 사용하세요. 이 새 옵션은 taskmanager.memory.managed.size로 크기가 명시적으로 설정되지 않으면 managed memory를 총 Flink 메모리의 지정된 분수로 설정합니다.
RocksDB 상태
스트리밍 작업에 RocksDBStateBackend이 선택되면 그 네이티브 메모리 소비는 이제 managed memory에 포함되어야 합니다. RocksDB 메모리 할당은 managed memory 크기에 의해 제한됩니다. 이는 Yarn에서 컨테이너가 죽는 것을 방지해야 합니다. state.backend.rocksdb.memory.managed를 false로 설정하여 RocksDB 메모리 제어를 비활성화할 수 있습니다. container cut-off 마이그레이션 방법도 참고하세요.
기타 변경 사항 (Other changes)
추가로 다음 변경이 이루어졌습니다:
- managed memory는 이제 항상 오프힙입니다. 구성 옵션
taskmanager.memory.off-heap은 제거되었으며 더 이상 효과가 없습니다. - managed memory는 이제 다이렉트 메모리가 아닌 네이티브 메모리를 사용합니다. 즉, managed memory는 더 이상 JVM 다이렉트 메모리 한도에 포함되지 않습니다.
- managed memory는 이제 항상 지연(lazy) 할당됩니다. 구성 옵션
taskmanager.memory.preallocate는 제거되었으며 더 이상 효과가 없습니다.
Job Manager 메모리 구성 마이그레이션 (Migrate Job Manager Memory Configuration)
이전에는 JobManager의 JVM Heap 크기를 설정하는 옵션이 있었습니다:
jobmanager.heap.sizejobmanager.heap.mb
이름과 달리 이들은 standalone 배포에서만 JVM Heap을 나타냈습니다. 컨테이너화된 배포(Kubernetes와 Yarn)에서는 다른 오프힙 메모리 소비도 포함했습니다. JVM Heap의 크기는 1.11 이후 완전히 제거된 컨테이너 컷오프에 의해 추가로 줄어들었습니다.
언급한 레거시 옵션은 디프리케이트되었습니다. 대응하는 새 옵션을 지정하지 않고 사용하면 다음 새 옵션으로 직접 변환됩니다:
- standalone 배포의 경우 JVM Heap (
jobmanager.memory.heap.size) - 컨테이너화된 배포(Kubernetes와 Yarn)의 경우 총 프로세스 메모리 (
jobmanager.memory.process.size)
다음 릴리스에서 완전히 제거될 수 있으므로 레거시 옵션 대신 새 옵션을 사용하는 것이 권장됩니다.
이제 total Flink memory 또는 total process memory만 구성하면 JVM Heap도 총 메모리에서 다른 모든 구성 요소를 뺀 나머지로 파생됩니다. 총 메모리 구성 방법도 참고하세요. 추가로 jobmanager.memory.heap.size 옵션을 조정하여 JVM Heap을 더 직접적으로 제어할 수 있습니다.
Flink JVM 프로세스 메모리 한도 (Flink JVM process memory limits)
1.10 릴리스부터 Flink는 TaskManager 프로세스에 대해 해당 JVM 인자를 추가하여 JVM Metaspace와 JVM Direct Memory 한도를 설정합니다. 1.11 릴리스부터 Flink는 JobManager 프로세스에 대해 JVM Metaspace 한도도 설정합니다. jobmanager.memory.enable-jvm-direct-memory-limit 옵션을 설정하면 JobManager 프로세스에 대해 JVM Direct Memory 한도를 활성화할 수 있습니다. JVM 파라미터도 참고하세요.
Flink는 해당 메모리 누수 디버깅을 단순화하고 컨테이너 out-of-memory 오류를 피하기 위해 언급한 JVM 메모리 한도를 설정합니다. JVM Metaspace와 JVM Direct Memory OutOfMemoryErrors에 대한 자세한 내용은 트러블슈팅 가이드도 참고하세요.
컨테이너 컷오프 메모리 (Container Cut-Off Memory)
컨테이너화된 배포의 경우 이전에 컷오프 메모리를 지정할 수 있었습니다. 이 메모리는 설명되지 않은 메모리 할당을 수용할 수 있었습니다. Flink가 직접 제어하지 않는 의존성이 이러한 할당의 주요 소스였습니다(예: RocksDB, JVM internals 등). 이는 더 이상 사용할 수 없으며 관련 구성 옵션(containerized.heap-cutoff-ratio와 containerized.heap-cutoff-min)은 더 이상 효과가 없습니다. 새 메모리 모델은 이러한 우려를 해결하기 위해 더 구체적인 메모리 구성 요소를 도입했습니다.
TaskManagers용
RocksDBStateBackend을 사용하는 스트리밍 작업에서 RocksDB 네이티브 메모리 소비는 이제 managed memory의 일부로 계산되어야 합니다. RocksDB 메모리 할당은 구성된 managed memory 크기에 의해서도 제한됩니다. managed memory 마이그레이션 및 지금 managed memory 구성 방법도 참고하세요.
다른 다이렉트 또는 네이티브 오프힙 메모리 소비자는 이제 다음 새 구성 옵션으로 해결할 수 있습니다:
- Task 오프힙 메모리 (
taskmanager.memory.task.off-heap.size) - Framework 오프힙 메모리 (
taskmanager.memory.framework.off-heap.size) - JVM metaspace (
taskmanager.memory.jvm-metaspace.size) - JVM overhead
JobManagers용
다이렉트 또는 네이티브 오프힙 메모리 소비자는 이제 다음 새 구성 옵션으로 해결할 수 있습니다:
- 오프힙 메모리 (
jobmanager.memory.off-heap.size) - JVM metaspace (
jobmanager.memory.jvm-metaspace.size) - JVM overhead
Flink 구성 파일의 기본 구성 (Default Configuration in Flink configuration file)
이 섹션은 Flink와 함께 배포되는 기본 Flink 구성 파일의 변경 사항을 설명합니다.
TaskManagers의 총 메모리(taskmanager.heap.size)는 기본 Flink 구성 파일에서 taskmanager.memory.process.size로 대체됩니다. 값은 1024MB에서 1728MB로 증가했습니다.
JobManagers의 총 메모리(jobmanager.heap.size)는 기본 Flink 구성 파일에서 jobmanager.memory.process.size로 대체됩니다. 값은 1024MB에서 1600MB로 증가했습니다.
지금 총 메모리 구성 방법도 참고하세요.
경고: 새 기본 Flink 구성 파일을 사용하면 메모리 구성 요소의 크기가 달라질 수 있고 성능 변경을 초래할 수 있습니다.