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

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

OOM 오류 효과

Compute Engine VM에서 Dataproc에 메모리 부족(OOM) 오류가 발생할 때의 효과는 다음과 같습니다.

  • 마스터 및 작업자 VM이 일정 기간 동안 작동 중지합니다.

  • 마스터 VM OOM 오류로 인해 작업이 실패하고 "태스크가 획득되지 않음" 오류가 표시됩니다.

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

YARN 메모리 제어

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

  • 폴링 기반(기존)
  • 엄격
  • 탄력적

기본적으로 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 누적 측정항목을 증분하고 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. 이러한 메시지를 보려면 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 컨테이너 예약에 사용되는 메모리 양을 제어합니다.
    • 작업 컨테이너가 계속해서 실패하면 데이터 비대칭으로 인해 특정 컨테이너 사용이 증가하는지 확인합니다. 그렇다면 작업에 대해 파티션을 다시 나누거나 추가 메모리 요구사항을 충족하도록 작업자 크기를 늘립니다.