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

6분 분량
0

AWS Glue 작업이 오랫동안 실행됩니다. 또는 AWS Glue 낙오 작업을 완료하는 데 시간이 오래 걸립니다.

해결 방법

AWS Glue 작업의 장시간 실행을 유발할 수 있는 일반적인 요인으로는 구성 설정과 데이터 및 스크립트의 구조가 있습니다.

다음 단계는 성능 최적화에 도움이 됩니다.

지표 및 로깅 설정

문제를 식별하고 성능을 최적화하려면 Amazon CloudWatch작업 관찰성 지표와 같은 AWS Glue의 통합 모니터링 도구를 사용하십시오.

또한 이상 현상에 대한 알림을 설정하고, Apache Spark UI를 켜서 AWS Glue 작업의 운영을 더 효과적으로 파악할 수 있습니다. AWS Glue 작업 실행 인사이트 기능을 사용하여 실행 중인 작업의 동작을 자세히 이해할 수 있습니다.

지표를 활성화하려면 다음 중 하나를 완료합니다.

AWS Glue 콘솔에서

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 ETL 작업을 선택합니다.
  3. 지표를 켜려는 작업을 선택합니다.
  4. 작업을 선택한 다음, 작업 편집을 선택합니다.
  5. 작업 세부 정보 탭의 고급 옵션에서 작업 지표, 작업 관찰성 지표, 연속 로깅Spark UI를 선택합니다.
  6. 저장을 선택합니다.

CLI 또는 SDK에서

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

API 호출 또는 CLI에서 DefaultArguments 파라미터에서 다음 파라미터를 전달합니다.

'--enable-metrics' : 'true'
'--enable-observability-metrics' : 'true'
'--enable-continuous-cloudwatch-log' : 'true'
'--enable-spark-ui' : 'true'
'--spark-event-logs-path' : '<s3://path/to/log/>'

병목 현상 파악

병목 현상을 찾으려면 작업 실행으로 생성된 CloudWatch의 드라이버 로그를 사용하거나 Spark UI 로그를 사용합니다. AWS Glue 3.0 이상에서는 적응형 쿼리 실행(AQE)과 같은 Spark 네이티브 기능을 사용하여 왜곡된 조인을 처리할 수 있습니다. 자세한 내용은 Apache 웹사이트의 웹 UI를 참조하십시오.

드라이버 로그

드라이버 로그 확인:

  1. AWS Glue 콘솔에서 작업을 엽니다.
  2. 실행 탭에서 로그를 확인하려는 작업 실행을 선택합니다.
  3. CloudWatch 로그 그룹 /aws-glue/jobs/error에서 로그를 연 작업 실행 ID와 이름이 동일한 로그 스트림을 선택합니다. 이름에 "_g-xxxxxx" 접미사가 포함된 스트림을 찾으십시오. 이 스트림이 실행 로그입니다.
  4. 드라이버 로그에서 완료되기 전에 오랜 시간 동안 실행되는 작업을 확인합니다. 다음 예시에서는 한 작업이 34분 동안 실행되었고, 이 작업을 위해 생성된 Spark 작업은 35분 만에 완료되었습니다.
    2024-09-13 10:06:13,847 INFO [task-result-getter-0] scheduler.TaskSetManager (Logging.scala:logInfo(61)): Finished task 0.0 in stage 0.0 (TID 0) in 2054673 ms on 172.35.184.56 (executor 1) (1/1)
    2024-09-13 10:06:13,894 INFO [Thread-13] scheduler.DAGScheduler (Logging.scala:logInfo(61)): Job 0 finished: save at DataSink.scala:666, took 2164.67 s

Spark UI 로그

Spark UI 로그의 작업스테이지 탭에서 장시간 실행된 스테이지와 작업을 찾습니다.

병목 현상 해결

데이터를 더 효율적으로 분할합니다. AWS Glue 작업은 분산 처리를 기반으로 합니다. 데이터가 효율적으로 분할되지 않으면 Spark 작업자가 크고 불균형한 파티션을 처리해야 할 수 있습니다. 이를 처리하는 시간으로 인해 지연이 발생합니다. 파티션 수를 제어하려면 Spark에서 repartition() 또는 coalesce() 함수를 사용합니다. 데이터가 효율적으로 분할되어야 Spark의 분산 특성을 활용할 수 있습니다. splitFields 또는 사용자 지정 파티션 키로 데이터를 분할하도록 AWS Glue DynamicFrame을 구성할 수도 있습니다.

작업자 노드를 추가하여 용량을 늘립니다. 데이터 볼륨을 처리할 작업자 노드가 충분하지 않으면 제한된 병렬 처리로 인해 작업 실행이 느려집니다. 작업자 노드 수를 늘리거나 더 큰 작업자 유형으로 전환하십시오. 적절한 작업자 크기를 사용하고 데이터를 효율적으로 처리하기에 충분한 DPU(데이터 처리 장치)를 할당해야 합니다. 실행자당 처리되는 작업 수는 DPU 수의 4배입니다. 예를 들어 G.1X 작업자 유형에는 1개의 DPU가 있고 실행자당 4개의 작업을 처리합니다. G.4X 및 G.8X 작업자 유형은 AWS Glue 버전 3.0 이상의 Spark ETL 작업에서만 사용할 수 있습니다.

데이터를 재배포하여 파티션 간의 왜곡을 줄입니다. 파티션의 데이터 양이 크게 다르면 데이터 왜곡이 발생합니다. 다른 노드가 유휴 상태일 때 데이터가 많이 있는 노드에서 과부하가 발생합니다. 데이터 분포를 분석하여 왜곡된 키를 식별합니다. 파티션 간에 데이터를 재배포 또는 밸런싱하거나 솔팅 기법을 사용하여 핫 키를 분산할 수 있습니다. AWS Glue 3.0 이상에서는 Apache 웹사이트의 적응형 쿼리 실행(AQE)과 같은 Spark 네이티브 기능을 사용하여 왜곡된 조인을 처리할 수 있습니다. 이를 위해 적응형 쿼리 실행(AQE)을 켜고 spark.sql.adaptive.skewJoin.enabled를 true로 설정하십시오. AQE는 Spark 3.2.0부터 기본적으로 켜집니다. Glue 3.0에서 AQE를 켜려면 spark.sql.adaptive.enabled 파라미터를 추가하고 true로 설정하십시오.

UDF를 네이티브 Spark 함수로 대체합니다. 사용자 정의 함수(UDF) 또는 복합 변환은 실행 비용이 많이 들고 Spark 작업의 속도를 늦출 수 있습니다. 가능하면 UDF 사용을 자제하고 성능에 최적화된 네이티브 Spark 함수를 사용하십시오. UDF가 필요한 경우 Python 대신 Scala로 다시 작성하십시오. Scala UDF의 성능이 더 나은 경우가 많습니다. 또한 최적화 향상을 위해 DataFrame 또는 DynamicFrame을 사용하여 변환을 적용하십시오.

셔플 작업을 최소화합니다. groupBy, join 또는 orderBy와 같은 셔플 작업은 노드 간에 데이터를 전송합니다. 과도하게 사용하거나 제대로 관리하지 않으면 병목 현상이 발생할 수 있습니다. 변환 프로세스 초기에 가능하면 빨리 데이터를 필터링하고 집계하여 셔플 작업을 최소화하십시오. 불필요한 데이터 전송을 피하려면 해당하는 경우 브로드캐스트 조인을 사용하십시오. 또한 셔플된 데이터가 효율적으로 분할되었는지 확인하십시오.

불필요한 캐싱을 제거합니다. 캐싱을 과도하게 또는 잘못 사용하면 메모리 사용량이 증가하고 작업 속도가 느려질 수 있습니다. 워크플로에서 데이터세트를 여러 번 재사용하는 경우에만 cache() 또는 persist()를 사용하십시오. 사용 가능한 메모리를 파악하고 해당 데이터세트가 더 이상 필요하지 않은 경우 unpersist()를 사용하여 캐시된 데이터세트를 지우십시오.

긴 의존성 체인을 분할합니다. 작업에 긴 변환 체인이 있는 경우 Spark는 전체 종속성 체인을 다시 계산합니다. 이 작업으로 인해 처리 속도가 느려질 수 있습니다. 복잡한 작업을 작은 작업으로 나누십시오. 필요한 경우 중간 결과를 보존하십시오. 이렇게 하면 재계산 오버헤드가 감소하고 각 단계의 성능을 개별적으로 디버깅 및 모니터링할 수 있습니다.

네트워크 지연 시간 및 I/O 작업을 줄입니다. Amazon Simple Storage Service(Amazon S3), Amazon Relational Database Service(Amazon RDS) 또는 Amazon Redshift와 같은 외부 소스에서 데이터를 읽고 쓰는 경우, 특히 대규모 데이터세트를 읽고 쓰는 경우 지연이 발생할 수 있습니다. AWS Glue의 내장 커넥터를 사용하십시오. Parquet 또는 ORC와 같이 더 빠른 읽기 및 쓰기를 지원하는 형식으로 데이터를 저장하십시오. 데이터 전송 속도를 높이기 위해 S3 Transfer Acceleration을 활성화하고, AWS Glue Data Catalog를 사용하여 메타데이터 검색을 최적화하십시오.

네이티브 작업을 최적화합니다. 작업 북마크DynamoDB 내보내기 커넥터를 비롯한 Glue 네이티브 작업은 AWS Glue 작업의 런타임을 늘릴 수 있습니다. 런타임을 확인하려면 드라이버 로그에서 AWS Glue 작업이 시작된 시점과 작업 북마크 및 DynamoDB에서 내보내기 작업이 종료된 시점을 확인하십시오. DynamoDB의 경우 다음 예시와 비슷한 메시지가 있는지 확인하십시오.

2024-08-24 03:33:37.000Z connections.DynamoExportConnection (DynamoExportConnection.scala:dynamodbexport(129)): Dynamodb Export complete...exported 712948751 item(s) or 4859215204353 byte(s)

작업 북마크의 영향을 줄입니다.

  • 스캔되는 파일의 수를 줄이려면 작은 파일을 큰 파일로 통합하십시오.
  • 처리가 이미 완료되면 파티션을 아카이브 위치로 다시 이동합니다.
  • AWS Glue가 변경되지 않은 전체 파티션을 건너뛸 수 있도록 효율적인 파티션 전략을 사용하십시오.
  • 데이터를 조기에 필터링하려면 푸시다운 조건자를 사용하십시오.
  • 작업 프로세스에 값을 추가하지 않는 경우 작업 북마크를 일시적으로 끄십시오.

DynamoDB 커넥터의 영향을 줄입니다.

  • 가능하면 내보내는 데이터의 양을 줄이십시오.
  • 내보내기 지연의 원인이 되는 문제를 식별하려면 DynamoDB 및 AWS Glue를 모니터링하십시오.
  • 내보내기 시간 단축을 위해 DynamoDB 테이블 구성을 최적화하십시오.
  • 가능하면 기본 작업 외부로 데이터를 내보내거나 일정을 조정하여 병목 현상을 방지하십시오.

관련 정보

AWS Glue 작업에서 작업 파라미터 사용

Apache Spark 웹 UI를 사용하여 작업 모니터링

DPU 용량 계획을 위한 모니터링

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