VM 메모리 부족 오류 문제 해결

이 페이지에서는 Compute Engine VM의 Dataproc 메모리 부족 (OOM) 오류에 대한 정보를 제공하고 OOM 오류 문제를 해결하는 단계에 대해 설명합니다.

OOM 오류 효과

Compute Engine VM의 Dataproc에서 메모리 부족(OOM) 오류가 발생하면 다음과 같은 상태가 발생합니다.

  • 마스터 VM과 작업자 VM이 일정 시간 동안 정지됩니다.

  • 마스터 VM OOM 오류로 인해 '작업을 획득하지 못했습니다' 오류와 함께 작업이 실패합니다.

  • 워커 VM OOM 오류로 인해 YARN HDFS에서 노드가 손실되어 Dataproc 작업 실행이 지연됩니다.

YARN 메모리 제어

Apache YARN은 다음과 같은 유형의 메모리 제어를 제공합니다.

  • 폴링 기반(기존)
  • 강제
  • Elastic

기본적으로 Dataproc은 다음과 같은 이유로 YARN 메모리 제어를 사용 설정하도록 yarn.nodemanager.resource.memory.enabled를 설정하지 않습니다.

  • 엄격한 메모리 제어는 컨테이너 크기가 올바르게 구성되지 않은 경우 메모리가 충분한데도 컨테이너가 종료될 수 있습니다.
  • Elastic 메모리 제어 요구사항은 작업 실행에 부정적인 영향을 미칠 수 있습니다.
  • 프로세스가 메모리를 공격적으로 소비하는 경우 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 누적 측정항목을 증가시키고 reasonProcessKilledDueToMemoryPressure로 설정합니다. 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 마스터 노드 또는 드라이버 노드 풀 작업이 종료되면 작업이 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 메시지를 작성합니다. 이러한 메시지를 보려면 로깅을 사용 설정한 다음 다음 로그 필터를 사용하세요.

    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 컨테이너 예약에 사용되는 메모리 양을 제어합니다.
    • 작업 컨테이너가 지속적으로 실패하면 데이터 왜곡으로 인해 특정 컨테이너의 사용량이 증가하는지 확인합니다. 이 경우 작업을 다시 분할하거나 작업자 크기를 늘려 추가 메모리 요구사항을 수용합니다.