Amazon EMR에서 Spark의 "Container killed by YARN for exceeding memory limits" 오류를 해결하려면 어떻게 해야 하나요?

4분 분량
0

Amazon EMR에서 Spark의 "Container killed by YARN for exceeding memory limits" 오류를 해결하고 싶습니다.

간략한 설명

이 오류를 해결하려면 다음 방법 중 하나를 사용합니다.

  • 메모리 오버헤드를 늘립니다.
  • 실행기 코어 수를 줄입니다.
  • 파티션 수를 늘립니다.
  • 드라이버 및 실행기 메모리를 늘립니다.

해결 방법

이 오류의 근본 원인과 적절한 해결 방법은 워크로드에 따라 다릅니다. 오류를 해결하기 위해 다음 방법을 나와 있는 순서대로 하나씩 시도해볼 수 있습니다. 이 시퀀스의 다음 방법을 진행하기 전에 앞 섹션에서 spark-defaults.conf에 적용한 변경 내용을 모두 되돌리세요.

메모리 오버헤드를 늘림

메모리 오버헤드는 각 실행기에 할당되는 오프힙(Off-Heap) 메모리의 용량입니다. 기본적으로 메모리 오버헤드는 실행기 메모리의 10% 또는 384 중 더 높은 값으로 설정됩니다. 메모리 오버헤드는 Java NIO 다이렉트 버퍼, 스레드 스택, 공유 네이티브 라이브러리 또는 메모리 매핑 파일에 사용됩니다.

메모리 오버헤드를 조금씩 점진적으로 최대 25%까지 늘리는 것이 좋습니다. 드라이버 또는 실행기 메모리와 메모리 오버헤드의 합계는 인스턴스 유형에 대한 yarn.nodemanager.resource.memory-mb보다 작아야 합니다.

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

드라이버 컨테이너 또는 실행기 컨테이너에서 오류가 발생할 경우 해당 컨테이너의 메모리 오버헤드만 늘려 보세요. 클러스터 실행 중에, 새 클러스터를 시작할 때 또는 작업을 제출할 때 메모리 오버헤드를 늘릴 수 있습니다.

실행 중인 클러스터에서 다음을 수행합니다.

마스터 노드에서 spark-defaults.conf를 수정합니다.

예를 들면 다음과 같습니다.

sudo vim /etc/spark/conf/spark-defaults.conf

spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

새 클러스터에서 다음을 수행합니다.

클러스터를 시작할 때 다음과 유사한 구성 객체를 추가합니다.

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.driver.memoryOverhead": "512",
      "spark.executor.memoryOverhead": "512"
    }
  }
]

단일 작업에 대해 다음을 수행합니다.

spark-submit을 실행할 때 --conf 옵션을 사용하여 메모리 오버헤드를 늘립니다.

예를 들면 다음과 같습니다.

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 /usr/lib/spark/examples/jars/spark-examples.jar 100

메모리 오버헤드를 늘려도 문제가 해결되지 않을 경우 실행기 코어 수를 줄입니다.

실행기 코어 수를 줄임

실행기 코어 수를 줄이면 실행기가 수행할 수 있는 최대 태스크 수가 감소하므로 필요한 메모리 용량도 작아집니다. 드라이버 컨테이너에서 이 오류가 발생하는지 아니면 다른 실행기 컨테이너에서 이 오류가 나타나는지에 따라 드라이버 또는 실행기의 코어를 줄일 수 있습니다.

실행 중인 클러스터에서 다음을 수행합니다.

마스터 노드에서 spark-defaults.conf를 수정합니다.

예를 들면 다음과 같습니다.

sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.cores  3
spark.executor.cores  3

새 클러스터에서 다음을 수행합니다.

클러스터를 시작할 때 다음과 유사한 구성 객체를 추가합니다.

[
  {
    "Classification": "spark-defaults",
    "Properties": {"spark.driver.cores" : "3",
      "spark.executor.cores": "3"
    }
  }
]

단일 작업에 대해 다음을 수행합니다.

spark-submit을 실행할 때 --executor-cores 옵션을 사용하여 실행기 코어 수를 줄입니다.

예를 들면 다음과 같습니다.

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-cores 3 --driver-cores 3 /usr/lib/spark/examples/jars/spark-examples.jar 100

그래도 오류 메시지가 계속 표시되면 파티션 수를 늘립니다.

파티션 수를 늘림

파티션 수를 늘리려면 원시 탄력적 분산 데이터 세트(RDD)에 대해 spark.default.parallelism 값을 늘리거나 .repartition() 작업을 실행합니다. 파티션 수를 늘리면 파티션당 필요한 메모리 크기가 줄어듭니다. Spark는 속도를 극대화하는 데 효과적인 클러스터 RAM을 많이 사용합니다. 따라서 반드시 Ganglia를 사용하여 메모리 사용량을 모니터링한 다음 클러스터 설정과 파티셔닝 전략이 증가하는 데이터 요구 사항에 적절한지 확인해야 합니다. "Container killed by YARN for exceeding memory limits" 오류 메시지가 계속 표시되면 드라이버 및 실행기 메모리를 늘립니다.

드라이버 및 실행기 메모리를 늘림

드라이버 컨테이너 또는 실행기 컨테이너에서 오류가 발생할 경우 드라이버 또는 실행기의 메모리를 늘릴 수 있습니다. 단, 두 가지 메모리를 모두 늘려서는 안 됩니다. 드라이버 또는 실행기 메모리와 드라이버 또는 실행기 메모리 오버헤드의 합이 항상 해당 EC2 인스턴스 유형의 yarn.nodemanager.resource.memory-mb 값보다 작아야 합니다.

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

실행 중인 클러스터에서 다음을 수행합니다.

마스터 노드에서 spark-defaults.conf를 수정합니다.

예:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.executor.memory  1g
spark.driver.memory  1g

새 클러스터에서 다음을 수행합니다.

클러스터를 시작할 때 다음과 유사한 구성 객체를 추가합니다.

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.memory": "1g",
      "spark.driver.memory":"1g",
    }
  }
]

단일 작업에 대해 다음을 수행합니다.

spark-submit을 실행할 때 --executor-memory--driver-memory 옵션을 사용하여 메모리를 늘립니다.

예를 들면 다음과 같습니다.

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-memory 1g --driver-memory 1g /usr/lib/spark/examples/jars/spark-examples.jar 100

기타 솔루션 옵션

그래도 오류 메시지가 계속 표시되면 다음을 시도해 봅니다.

  • 벤치마킹: 샘플 데이터 세트에 대해 애플리케이션을 실행해 봅니다. 이를 통해 메모리 문제의 원인이 될 수 있는 속도 저하 및 편향된 파티션 문제를 찾아낼 수 있습니다.
  • 데이터 필터링: 최소한의 데이터를 처리하고 있는지 확인합니다. 데이터를 필터링하지 않거나 애플리케이션 실행 프로세스에서 늦게 필터링할 경우 과도한 데이터 양으로 인해 애플리케이션 속도가 저하될 수 있습니다. 이로 인해 메모리 예외가 발생할 가능성이 높아질 수 있습니다.
  • 데이터 세트 크기: 최소한의 필수 데이터를 처리하는 것이 좋습니다. 데이터를 파티셔닝하여 꼭 필요한 데이터만 수집되도록 합니다.
  • 파티셔닝 전략: 다른 파티셔닝 전략을 사용해 봅니다. 예를 들어 대체 키를 기준으로 파티셔닝하여 크기가 큰 파티션과 편향된 파티션이 생기지 않게 합니다.
  • EC2 인스턴스 유형: 워크로드에 필요한 만큼의 메모리 리소스가 EC2 인스턴스에 없을 수 있습니다. 이 경우 크기가 더 크고 메모리에 최적화된 인스턴스 유형으로 전환하면 오류가 해결될 수 있습니다. 인스턴스 유형을 변경한 후에도 메모리 예외가 계속 발생하면 새 인스턴스에서 문제 해결 방법을 시도해 보세요.

관련 정보

Spark 구성

Amazon EMR 기반의 Spark에서 "java.lang.ClassNotFoundException"은 어떻게 해결합니까?

AWS 공식
AWS 공식업데이트됨 일 년 전