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

3분 분량
0

Amazon EMR 클러스터의 Apache Spark 드라이버 로그에 액세스하여 Spark 애플리케이션 문제를 해결하려고 합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

Amazon EMR에서 Spark는 YARN 애플리케이션으로 실행되며 클라이언트 및 클러스터 배포 모드를 지원합니다.

클라이언트 모드 작업

클라이언트 모드는 기본 배포 모드입니다. 클라이언트 모드에서 Spark 드라이버는 spark-submit 명령이 실행되는 호스트에서 실행됩니다. 프라이머리 노드에서 --deploy-mode client와 함께 spark-submit 명령을 실행하면 터미널 창에 드라이버 로그가 표시됩니다. Amazon EMR은 기본적으로 이러한 로그를 보관하지 않습니다. 로그를 캡처하려면 spark-submit 명령의 출력을 파일에 저장하십시오.

명령 예시:

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

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

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

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

Spark 드라이버 로그에 액세스하려면 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 단계 로그를 다운로드한 다음, 경고와 오류를 검색합니다.

다음 단계를 완료하십시오.

  1. 다음 sync 명령을 실행하여 단계 로그를 다운로드합니다.

    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 filename\;

    참고: filename을 사용자 파일의 이름으로 바꾸십시오.

  4. 다음 명령을 실행하여 클러스터 모드 로그에서 YARN 애플리케이션 ID를 가져옵니다.

    grep "Client: Application report for" * | tail -n 1
  5. 다음 명령을 실행하여 클라이언트 모드 로그에서 오류와 경고를 찾습니다.

    egrep "WARN|ERROR" *

JupyterHub, Apache Livy 또는 Apache Zeppelin 등과 같은 애플리케이션을 클라이언트로 사용하여 Spark 애플리케이션을 클러스터에 제출할 수도 있습니다. 애플리케이션은 프라이머리 노드의 /mnt/var/log/ 폴더에 애플리케이션의 로그에 있는 드라이버 로그를 저장합니다.

또한 s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/ Amazon S3 경로에서도 압축된 로그를 찾을 수 있습니다.

Zeppelin을 사용하는 경우 /mnt/var/log/zeppelin/zeppelin-interpreter-spark-##########.log에서 Spark 드라이버 로그를 찾을 수 있습니다.

Jupyter의 경우 /mnt/var/log/livy/livy-livy-server.out Livy 로그에서 드라이버 로그를 찾을 수 있습니다.

클러스터 모드 작업

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 애플리케이션 로그의 예제 목록:

    `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`

    참고: 목록의 첫 번째 컨테이너는 항상 기본 컨테이너입니다. 위 목록에서 기본 컨테이너는 container_1572839353552_0008_01_000001입니다.

  3. 다음 sync 명령을 실행하여 애플리케이션 기본 컨테이너 로그를 인스턴스에 다운로드합니다.

    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 애플리케이션 컨테이너 로그를 가져올 수 있습니다.

    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-###-##-##-##.us-west-2.compute.internal/###.##.##.##:8032
    Container: container_1585844683621_0001_01_000001 on ip-###-##-##-##.us-west-2.compute.internal_8041
  8. 클러스터 모드에서 제출하는 Spark 애플리케이션의 경우 다음 명령을 실행하여 애플리케이션 기본 컨테이너 로그를 가져옵니다.

    yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-###-##-##-##.us-west-2.compute.internal

    참고: applicationId를 애플리케이션 ID로, containerId를 컨테이너 ID로, nodeAddress ip를 노드 주소로 바꾸십시오.

관련 정보

Amazon EMR 클러스터 문제 해결

Spark 구성

AWS 공식
AWS 공식업데이트됨 3달 전