Amazon EMR 클러스터에서 Spark 드라이버 로그에 액세스하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 4월 13일

Apache Spark 애플리케이션의 문제를 해결해야 합니다. Amazon EMR 클러스터에서 Spark 드라이버 로그에 액세스하려면 어떻게 해야 합니까?

간략한 설명

Amazon EMR에서 Spark는 YARN 애플리케이션으로 실행되고 2개의 배포 모드를 지원합니다.

  • 클라이언트 모드: 기본 배포 모드입니다. 클라이언트 모드에서 Spark 드라이버가 spark-submit 명령이 실행되는 호스트에서 실행됩니다.
  • 클러스터 모드: Spark 드라이버가 애플리케이션 마스터에서 실행됩니다. 애플리케이션 마스터는 Spark 작업이 실행될 때 가장 먼저 실행되는 컨테이너입니다.

해결 방법

클라이언트 모드 작업

마스터 노드에서 spark-submit--deploy-mode client를 함께 실행하여 Spark 애플리케이션을 제출하면 드라이버 로그가 터미널 창에 표시됩니다. Amazon EMR은 기본적으로 이 로그를 보관하지 않습니다. 로그를 수집하려면 spark-submit 명령의 출력 내용을 파일에 저장합니다. 예:

$ spark-submit [--deploy-mode client] ... 1>output.log 2>error.log

Amazon EMR 단계를 사용하여 Spark 애플리케이션을 제출하면 드라이버 로그는 Amazon Simple Storage Service(Amazon S3)의 stderr.gz 파일에 보관됩니다. 파일 경로는 다음과 유사합니다.

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

자세한 내용은 로그 파일 보기를 참조하십시오.

단계 로그를 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 다운로드한 다음, 경고와 오류를 검색합니다.

1.    단계 로그를 다운로드합니다.

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

2.    단계 로그 폴더를 엽니다.

cd s-2M809TD67U2IA/

3.    로그 파일을 압축 해제합니다.

find . -type f -exec gunzip {} \;

4.    클러스터 모드 로그에서 YARN 애플리케이션 ID를 가져옵니다.

grep "Client: Application report for" * | tail -n 1

5.    클라이언트 모드 로그에서 오류 및 경고를 찾습니다.

egrep "WARN|ERROR" *

JupyterHub, Apache Livy, Apache Zeppelin 등의 애플리케이션을 사용하여 Spark 애플리케이션을 제출할 수도 있습니다. 이러한 애플리케이션은 Spark 애플리케이션을 클러스터에 제출하는 클라이언트가 됩니다. 이 경우 드라이버 로그는 마스터 노드의 /mnt/var/log/ 폴더에서 해당 애플리케이션 로그에 저장됩니다. 다음의 Amazon S3 경로에서 압축된 로그를 찾을 수도 있습니다.

s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/

예를 들어, Zeppelin을 사용할 경우 /mnt/var/log/zeppelin/zeppelin-interpreter-spark-xxxxxxxxxx.log에서 Spark 드라이버 로그를 찾을 수 있습니다.

참고: Jupyter의 경우 드라이버 로그는 Livy 로그(/mnt/var/log/livy/livy-livy-server.out)에 저장됩니다.

각 애플리케이션 로그에 액세스하는 방법에 대한 자세한 내용은 로그 파일 보기를 참조하십시오.

클러스터 모드 작업

클러스터 모드에서 Spark 애플리케이션을 제출하면 드라이버 프로세스가 애플리케이션 마스터 컨테이너에서 실행됩니다. 애플리케이션 마스터는 Spark 애플리케이션이 실행되었을 때 가장 먼저 실행되는 컨테이너입니다. YARN 애플리케이션이 보고하는 클라이언트 로그입니다. 드라이버 로그를 가져오려면 다음을 수행합니다.

1.    클라이언트 로그에서 애플리케이션 ID를 가져옵니다. 다음 예제에서 application_1572839353552_0008이 애플리케이션 ID입니다.

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

2.    애플리케이션 마스터 컨테이너 로그를 식별합니다. 다음은 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 인스턴스에 다운로드합니다.

aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/

4.    Spark 애플리케이션 로그 폴더를 엽니다.

cd application_1572839353552_0008/

5.    로그 파일을 압축 해제합니다.

find . -type f -exec gunzip {} \;

6.    모든 컨테이너 로그에서 오류 및 경고를 검색합니다.

egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"

7.    이전의 명령에서 출력된 내용에 반환된 컨테이너 로그를 엽니다.

실행 중인 클러스터에서 YARN CLI를 사용하여 YARN 애플리케이션 컨테이너 로그를 가져올 수 있습니다. 클러스터 모드에서 제출된 Spark 애플리케이션의 경우, 다음과 같이 애플리케이션 마스터 컨테이너 로그를 가져오면 Spark 드라이버 로그에 액세스할 수 있습니다.

# 1. Get the address of the node that the application master container ran on
$ yarn logs -applicationId application_1585844683621_0001 | grep  'Container: container_1585844683621_0001_01_000001'

20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-xxx-xx-xx-xx.us-west-2.compute.internal/xxx.xx.xx.xx:8032
Container: container_1585844683621_0001_01_000001 on ip-xxx-xx-xx-xx.us-west-2.compute.internal_8041

# 2. Use the node address to pull the container logs
$ yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-xxx-xx-xx-xx.us-west-2.compute.internal

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

개선할 부분이 있습니까?


다른 도움이 필요하십니까?