내용으로 건너뛰기

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는 메모리 오버헤드를 실행기 메모리의 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에 적용한 변경 사항을 모두 취소하십시오.

실행기 코어 수를 줄이면 실행기가 수행할 수 있는 최대 작업 수가 줄어들어 필요한 메모리 양이 줄어듭니다. 오류를 일으키는 드라이버 컨테이너나 오류가 발생하는 다른 실행기 컨테이너에 따라 드라이버 또는 실행기의 코어 수를 줄이십시오.

실행 중인 클러스터

프라이머리 노드에서 spark-defaults.conf를 수정합니다.

예시:

sudo vim /etc/spark/conf/spark-defaults.confspark.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

오류 메시지를 계속 받으면 파티션 수를 늘리십시오.

파티션 수 늘리기

참고: 위 섹션에서 spark-defaults.conf에 적용한 변경 사항을 모두 취소하십시오.

파티션 수를 늘리려면 원시 복원력 분산 데이터세트의 spark.default.parallelism 값을 늘리거나 .repartition() 작업을 실행하십시오.

파티션 수를 늘리면 파티션당 필요한 메모리 양이 줄어듭니다. Spark는 속도를 극대화하는 효과적인 방법으로 클러스터 RAM을 많이 사용합니다. 따라서 Ganglia(Amazon EMR 버전 6.15용) 또는 Amazon CloudWatch 에이전트(Amazon EMR 7.0 이상용)를 사용하여 메모리 사용량을 모니터링해야 합니다. 그런 다음, 클러스터 설정과 파티셔닝 전략이 증가하는 데이터 요구 사항을 충족하는지 확인하십시오. ‘Container killed by YARN for exceeding memory limits’ 오류 메시지가 계속 표시되면 드라이버와 실행기 메모리를 늘리십시오.

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

참고: 위 섹션에서 spark-defaults.conf에 적용한 변경 사항을 모두 취소하십시오.

오류가 드라이버 컨테이너나 실행기 컨테이너에서 발생하는 경우 드라이버 또는 실행기 중 하나의 메모리를 늘리되 둘 다 늘리지 마십시오. 드라이버 또는 실행기 메모리와 드라이버 또는 실행기 메모리 오버헤드의 합계가 항상 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 인스턴스에는 워크로드에 필요한 메모리 리소스가 없을 수 있습니다. 더 큰 메모리 최적화 인스턴스 유형으로 전환합니다. 인스턴스 유형을 변경한 후에도 메모리 예외가 계속 발생하면 새 인스턴스에서 문제 해결 방법을 시도해 보십시오.

관련 정보

Apache Spark 웹 사이트의 Spark 구성

Amazon EMR에서 Spark의 ‘java.lang.ClassNotFoundException’ 오류를 해결하려면 어떻게 해야 합니까?

AWS 공식업데이트됨 9달 전