이 페이지에서는 Compute Engine VM의 Dataproc 메모리 부족(OOM) 오류에 대한 정보를 제공하고 OOM 오류 문제를 해결하는 단계에 대해 설명합니다.
OOM 오류 효과
Compute Engine VM에서 Dataproc에 메모리 부족(OOM) 오류가 발생할 때의 효과는 다음과 같습니다.
마스터 및 작업자 VM이 일정 기간 동안 작동 중지합니다.
마스터 VM OOM 오류로 인해 작업이 실패하고 "태스크가 획득되지 않음" 오류가 표시됩니다.
작업자 VM OOM 오류로 인해 YARN HDFS에서 노드가 손실되어 Dataproc 작업 실행이 지연됩니다.
YARN 메모리 제어
Apache YARN은 다음 유형의 메모리 제어를 제공합니다.
- 폴링 기반(기존)
- 엄격
- Elastic
기본적으로 Dataproc이 YARN 메모리 제어를 사용 설정하기 위해 yarn.nodemanager.resource.memory.enabled를 설정하지 않는 이유는 다음과 같습니다.
- 엄격한 메모리 제어를 선택한 경우 컨테이너 크기를 올바르게 구성하지 않으면 메모리가 충분하더라도 컨테이너가 종료됩니다.
- 탄력적 메모리 제어 요구사항은 작업 실행에 부정적인 영향을 줄 수 있습니다.
- YARN 메모리 제어를 선택하면 프로세스가 메모리를 공격적으로 소비할 경우 OOM 오류를 방지하지 못할 수 있습니다.
Dataproc 메모리 보호
Dataproc 클러스터 VM에 메모리 압박이 발생하면 Dataproc 메모리 보호 기능이 OOM 조건이 사라질 때까지 프로세스 또는 컨테이너를 종료합니다.
Dataproc은 다음과 같이 Compute Engine의 Dataproc 이미지 버전에서 클러스터 노드에 대한 메모리 보호 기능을 제공합니다.
| 역할 | 1.5 | 2.0 | 2.1 | 2.2 |
|---|---|---|---|---|
| 마스터 VM | 1.5.74+ | 2.0.48+ | 모두 | 모두 |
| 작업자 VM | 사용할 수 없음 | 2.0.76+ | 2.1.24+ | 모두 |
| 드라이버 풀 VM | 사용할 수 없음 | 2.0.76+ | 2.1.24+ | 모두 |
메모리 보호 종료 식별 및 확인
다음 정보를 활용해서 메모리 압박으로 인한 작업 종료를 식별 및 확인할 수 있습니다.
프로세스 종료
Dataproc 메모리 보호가
137또는143코드로 종료되는 프로세스를 처리합니다.Dataproc이 메모리 압박으로 인해 프로세스를 종료하면 다음 작업 또는 조건이 발생할 수 있습니다.
- Dataproc은
dataproc.googleapis.com/node/problem_count누적 측정항목을 증분하고reason을ProcessKilledDueToMemoryPressure로 설정합니다. Dataproc 리소스 측정항목 수집을 참조하세요. - Dataproc은
"A process is killed due to memory pressure: process name메시지로google.dataproc.oom-killer로그를 작성합니다. 이러한 메시지를 보려면 Logging을 사용 설정한 후 다음 로그 필터를 사용합니다.resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"A process is killed due to memory pressure:"
- Dataproc은
마스터 노드 또는 드라이버 노드 풀 작업 종료
Dataproc 마스터 노드 또는 드라이버 노드 풀 작업이 메모리 압박으로 인해 종료되면 작업이 실패하고
Driver received SIGTERM/SIGKILL signal and exited with INT오류 코드가 표시됩니다. 이러한 메시지를 보려면 Logging을 사용 설정한 후 다음 로그 필터를 사용합니다.resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"google.dataproc.oom-killer로그 또는dataproc.googleapis.com/node/problem_count에서 Dataproc 메모리 보호로 작업이 종료되었는지 확인합니다(프로세스 종료 참조).
해결책:
- 클러스터에 드라이버 풀이 있으면
driver-required-memory-mb를 실제 작업 메모리 사용량으로 늘립니다. - 클러스터에 드라이버 풀이 없으면 클러스터를 다시 만들고 클러스터에서 실행되는 최대 동시 작업 수를 줄입니다.
- 메모리가 증가한 마스터 노드 머신 유형을 사용합니다.
워커 노드 YARN 컨테이너 종료
Dataproc은 YARN 리소스 관리자에서 다음 메시지를 작성합니다.
container id exited with code EXIT_CODE. 이러한 메시지를 보려면 Logging을 사용 설정한 후 다음 로그 필터를 사용합니다.resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
컨테이너가
code INT로 종료되었으면google.dataproc.oom-killer로그 또는dataproc.googleapis.com/node/problem_count에서 Dataproc 메모리 보호로 작업이 종료되었는지 확인합니다(프로세스 종료 참조).해결책:
- 컨테이너 크기가 올바르게 구성되었는지 확인하세요.
yarn.nodemanager.resource.memory-mb를 줄여보세요. 이 속성은 YARN 컨테이너 예약에 사용되는 메모리 양을 제어합니다.- 작업 컨테이너가 계속해서 실패하면 데이터 비대칭으로 인해 특정 컨테이너 사용이 증가하는지 확인합니다. 그렇다면 작업에 대해 파티션을 다시 나누거나 추가 메모리 요구사항을 충족하도록 작업자 크기를 늘립니다.
마스터 노드에서 Linux 메모리 보호 미세 조정 (고급)
Dataproc 마스터 노드는 사용 가능한 메모리가 매우 부족할 때 메모리를 해제하여 시스템이 멈추지 않도록 earlyoom 유틸리티를 사용합니다. 기본 구성은 많은 워크로드에 적합합니다. 하지만 마스터 노드의 메모리가 많고 메모리 소비가 빠른 경우 구성을 조정해야 할 수 있습니다.
메모리 압력이 높은 시나리오에서 시스템은 메모리 관리에 대부분의 시간을 소비하고 응답하지 않는 '스래싱' 상태에 들어갈 수 있습니다. 이러한 상황이 너무 빨리 발생하여 earlyoom가 기본 설정에 따라 조치를 취하지 못하거나 커널 OOM 응답이 호출되기 전에 조치를 취하지 못할 수 있습니다.
시작하기 전에
- 이는 고급 조정 옵션입니다.
earlyoom설정을 조정하기 전에 메모리가 더 많은 마스터 VM을 사용하거나, 작업 동시성을 줄이거나, 작업 메모리 사용량을 최적화하는 등 다른 솔루션을 우선적으로 고려하세요.
earlyoom 설정 맞춤설정
기본 earlyoom 구성은 고정된 여유 메모리 양을 트리거로 사용합니다. RAM이 많은 가상 머신(예: 32GB 이상)에서는 이 고정된 양이 총 메모리의 작은 부분을 나타낼 수 있습니다.
이로 인해 시스템이 메모리 사용량의 급격한 증가에 취약해집니다.
earlyoom 설정을 맞춤설정하려면 마스터 노드에 연결하고 구성 파일을 수정합니다.
수정할 구성 파일을 엽니다.
sudo nano /etc/default/earlyoom최소 메모리 임계값을 조정합니다.
EARLYOOM_ARGS행을 찾습니다.-M <kbytes>옵션은earlyoom가 유지하려고 하는 여유 메모리의 최소 크기를 KiB 단위로 설정합니다. 기본값은-M 65536(64 MiB)입니다.메모리가 많은 마스터 노드의 경우 이 값을 늘립니다. 예를 들어 기준점을
1 GiB(1048576 KiB)로 설정하려면 다음과 같이 줄을 수정합니다.EARLYOOM_ARGS="-r 15 -M 1048576 -s 1"참고:
-r: 메모리 보고 간격(초)-s:earlyoom을 트리거하는 스왑 공간 기준점
earlyoom서비스를 다시 시작하여 변경사항을 적용합니다.sudo systemctl restart earlyoom