Amazon EMR에서 실패한 Spark 단계의 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 11월 18일

Amazon EMR에서 실패한 Apache Spark 단계의 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

실패한 Spark 단계 문제를 해결하려면 다음을 수행합니다.

  • -deploy-mode 클라이언트로 제출된 Spark 작업의 경우: 단계 로그를 확인하여 단계 실패의 근본 원인을 식별합니다.
  • -deploy-mode 클러스터로 제출된 Spark 작업의 경우: 단계 로그를 확인하여 애플리케이션 ID를 식별합니다. 그런 다음 애플리케이션 마스터 로그를 확인하여 단계 실패의 근본 원인을 확인합니다.

해결 방법

클라이언트 모드 작업

Spark 작업이 클라이언트 모드로 배포되면 단계 로그가 작업 파라미터와 단계 오류 메시지를 제공합니다. 이러한 로그는 Amazon Simple Storage Service(Amazon S3)에 보관됩니다. 예를 들어 다음과 같습니다.

  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/controller.gz: 이 파일은 spark-submit 명령을 포함합니다. 이 로그를 확인하여 작업의 파라미터를 확인합니다.
  • s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz: 이 파일은 드라이버 로그를 제공합니다. (Spark 작업이 클라이언트 모드에서 실행되면 Spark 드라이버가 마스터 노드에서 실행됩니다.)

단계 실패의 근본 원인을 찾으려면 다음을 수행합니다.

다음 명령을 실행하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 단계 로그를 다운로드하고 경고 및 오류를 검색합니다.

#Download the step logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
#Open the step log folder:
cd s-2M809TD67U2IA/
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Get the yarn application id from the cluster mode log:
grep "Client: Application report for" * | tail -n 1
#Get the errors and warnings from the client mode log:
egrep "WARN|ERROR" *

예들 들어 이 파일은 다음과 같습니다.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

메모리 문제를 나타냅니다.

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

로그의 정보를 사용하여 오류를 해결합니다. 예를 들어 메모리 문제를 해결하려면 더 많은 실행기 메모리가 있는 작업을 제출합니다.

spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

클러스터 모드 작업

1.    stderr 단계 로그를 확인하여 실패한 단계와 연결된 애플리케이션의 ID를 식별합니다. 단계 로그는 Amazon S3에 보관됩니다. 예를 들어 이 로그는 다음과 같습니다.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz

identifies application_1572839353552_0008:

19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)

2.    애플리케이션 마스터 로그를 식별합니다. Spark 작업이 클러스터 모드에서 실행되면 Spark 드라이버가 애플리케이션 마스터 내에서 실행됩니다. 애플리케이션 마스터는 Spark 작업이 실행될 때 실행되는 첫 번째 컨테이너입니다. 다음은 Spark 애플리케이션 로그의 예제 목록입니다. 이 목록에서 container_1572839353552_0008_01_000001이 첫 번째 컨테이너입니다. 즉, 애플리케이션 마스터입니다.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz

3.    애플리케이션 마스터 로그를 식별한 후 EC2 인스턴스에 로그를 다운로드합니다. 그리고 경고 및 오류를 검색합니다. 예를 들어 다음과 같습니다.

#Download the Spark application logs:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
#Open the Spark application log folder:
cd application_1572839353552_0008/ 
#Uncompress the log file:
find . -type f -exec gunzip {} \;
#Search for warning and errors inside all the container logs. Then, open the container logs returned in the output of this command.
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

예를 들어 이 로그는 다음과 같습니다.

s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz

메모리 문제를 나타냅니다.

19/11/04 05:24:45 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200. Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration.

4.    로그에서 식별된 문제를 해결합니다. 예를 들어 메모리 문제를 해결하려면 더 많은 실행기 메모리가 있는 작업을 제출합니다.

spark-submit --deploy-mode cluster --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 1000

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?