AWS Glue ETL 작업이 장시간 실행되는 이유는 무엇입니까?

최종 업데이트 날짜: 2021년 8월 20일

AWS Glue 작업이 장시간 실행되고 있습니다.

-또는-

AWS Glue 스트래글러 태스크를 완료하는 데 시간이 오래 걸립니다.

간략한 설명

AWS Glue 작업을 완료하는 데 시간이 오래 걸리는 몇 가지 일반적인 이유는 다음과 같습니다.

  • 대규모 데이터 집합
  • 데이터 집합에 데이터 배포가 균일하지 않음
  • 실행기 전체에 태스크 배포가 고르지 않음
  • 리소스 프로비저닝 부족

해결 방법

지표 활성화

AWS Glue는 실행기 및 각 실행기가 수행하는 양에 대한 정보를 제공하는 데 사용할 수 있는 Amazon CloudWatch 지표를 제공합니다. 다음 중 하나를 수행하여 AWS Glue 작업에서 CloudWatch 지표를 활성화할 수 있습니다.

특수 파라미터 사용: AWS Glue 작업에 다음 인수를 추가합니다. 이 파라미터를 사용하면 작업 실행에 대한 작업 프로파일링의 지표를 수집할 수 있습니다. 이러한 지표는 AWS Glue 콘솔과 CloudWatch 콘솔에서 사용할 수 있습니다.

Key: --enable-metrics

AWS Glue 콘솔 사용: 기존 작업에 대한 지표를 활성화하려면 다음을 수행합니다.

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 Jobs(작업)을 선택합니다.
  3. 지표를 활성화할 작업을 선택합니다.
  4. Action(작업)을 선택한 다음 Edit job(작업 편집)을 선택합니다.
  5. Monitoring options(모니터링 옵션)에서 Job metrics(작업 지표)를 선택합니다.
  6. Save(저장)을 선택합니다.

API 사용: --enable-metricsDefaultArguments 파라미터로 설정한 AWS Glue UpdateJob API를 사용하여 기존 작업에 대한 지표를 활성화합니다.

참고: AWS Glue 2.0은 지표를 보고하는 YARN을 사용하지 않습니다. 즉, AWS Glue 2.0의 경우 numberMaxNeededExecutors 및 numberAllExecutor와 같은 일부 실행기 지표를 가져올 수 없습니다.

연속 로깅 활성화

AWS Glue 작업에서 연속 로깅을 활성화하면 실시간 드라이버 및 실행기 로그가 5초마다 CloudWatch에 푸시됩니다. 이 실시간 로깅 정보를 사용하여 실행 중인 작업에 대해 세부 정보를 확인할 수 있습니다. 자세한 내용은 AWS Glue 작업에 대한 연속 로깅 활성화 단원을 참조하세요.

드라이버 및 실행기 로그 확인

드라이버 로그에서, 완료되기 전에 장시간 실행된 태스크가 있는지 확인합니다. 예를 들면 다음과 같습니다.

2021-04-15 10:53:54,484 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 10:53:54,484 INFO [task-result-getter-1] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 0.0 in stage 7.0 (TID 139) in 4538 ms on 10.117.101.76 (executor 10) (13/14)
...
2021-04-15 12:11:30,692 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 12:11:30,692 INFO [task-result-getter-3] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 13.0 in stage 7.0 (TID 152) in 4660742 ms on 10.117.97.97 (executor 11) (14/14)

이러한 로그에서 단일 태스크를 완료하는 데 77분이 걸렸음을 확인할 수 있습니다. 이 정보를 사용하여 특정 태스크에 시간이 오래 걸리는 이유를 검토할 수 있습니다. 검토에는 Apache Spark 웹 UI를 사용할 수 있습니다. Spark UI는 다양한 단계, 태스크 및 실행기에 대해 구조적인 정보를 제공합니다.

스파크 UI 활성화

Spark UI를 사용하여 장시간 실행되는 Spark 작업의 문제를 해결할 수 있습니다. Spark 기록 서버를 시작하고 Spark UI 로그를 활성화하면 스테이지와 태스크에 대한 정보를 얻을 수 있습니다. 로그를 사용하여 작업자가 태스크를 실행하는 방법을 알아볼 수 있습니다. AWS Glue 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Spark UI를 활성화할 수 있습니다. 자세한 내용은 AWS Glue 작업에 대해 Apache Spark 웹 UI 활성화를 참조하세요.

작업이 완료되면 다음과 유사한 드라이버 로그가 표시될 수 있습니다.

ERROR executionlogs:128 - example-task-id:example-timeframe INFO [pool-2-thread-1] s3n.MultipartUploadOutputStream (MultipartUploadOutputStream.java:close(414)): close closed:false s3://dox-example-bucket/spark-application-1626828545941.inprogress

작업에 대한 로그를 분석한 후 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 또는 Docker를 사용하여 Spark 기록 서버를 시작할 수 있습니다. UI를 열고 Executor(실행기) 탭으로 이동하여 특정 실행기가 더 오랫동안 실행 중인지 확인합니다. 실행 중이라면 데이터 집합의 데이터 왜곡으로 인해 작업 배포가 고르지 않고 사용 가능한 리소스의 사용률이 낮아질 수 있습니다. Stages(스테이지) 탭에서는 장시간 걸린 스테이지에 대한 자세한 정보와 통계를 확인할 수 있습니다. 해당 스테이지에서 비용과 시간이 많이 드는 셔플 유출이 관련되었는지에 대한 자세한 내용을 확인할 수 있습니다.

데이터 처리 장치(DPU) 용량 계획

모든 실행기가 작업에 동등하게 기여하지만 여전히 작업 완료에 오랜 시간이 걸리면 작업 속도를 높이기 위해 작업에 더 많은 작업자를 추가하는 것이 좋습니다. DPU 용량 계획은 다음을 방지하는 데 도움이 될 수 있습니다.

  • 프로비저닝 부족으로 인해 실행 시간이 느려짐
  • 비용은 커지지만 결과 제공 시간이 동일한 프로비저닝 과다

CloudWatch 지표로부터, 현재 사용된 실행기 수와 필요한 최대 실행기 수에 대한 정보를 얻을 수 있습니다. 필요한 DPU 수는 입력 파티션의 수와 요청된 작업자 유형에 따라 다릅니다.

입력 파티션 수를 정의할 때는 다음 사항에 유의하세요.

  • Amazon Simple Storage Service(Amazon S3) 파일을 분할할 수 없는 경우, 파티션 수는 입력 파일 수와 같습니다.
  • Amazon S3 파일을 분할할 수 있고 데이터가 구조화되지 않은/반구조화인 경우 파티션 수는 총 파일 크기/64MB와 같습니다. 각 파일의 크기가 64MB 미만이면 파티션 수는 파일 수와 같습니다.
  • Amazon S3 파일을 분할할 수 있고 데이터가 구조화된 경우 파티션 수는 총 파일 크기/128MB와 같습니다.

최적의 DPU 수를 계산하려면 다음을 수행하세요.

예를 들어, 입력 파티션 수가 428이라고 가정합니다. 그런 다음 다음 공식을 사용하여 최적의 DPU 수를 계산할 수 있습니다.

필요한 최대 실행기 수=입력 파티션 수/실행기당 태스크 수=428/4=107

다음 사항에 유의하세요.

  • 표준 작업자 유형은 실행기당 4개의 태스크 지원
  • G.1X는 실행기당 8개의 태스크 지원
  • G.2X는 실행기당 16개의 태스크 지원

표준 작업자 유형에는 하나의 노드에 드라이버 하나를 포함하여 두 개의 실행기가 있습니다. 이 실행기 중 하나는 Spark의 드라이버입니다. 따라서 108개의 실행기가 필요합니다.

필요한 DPU 수=(실행기 수/노드당 실행기 수)+1 DPU=(108/2)+1=55