AWS Glue ETL 작업에서 “No space left on device” 오류를 해결하려면 어떻게 해야 하나요?

4분 분량
0

AWS Glue ETL 작업을 실행할 때 “No space left on device” 오류가 발생하지 않도록 하려고 합니다.

간략한 설명

AWS Glue ETL(추출, 전환 및 적재) 작업을 실행할 때 다음과 같은 유형의 오류가 발생할 수 있습니다.

  • 스테이지 실패로 인해 작업이 중단됨: 158.0 스테이지의 태스크 68이 4번 실패했습니다. 가장 최근의 실패는 다음과 같습니다. Lost task 68.3 in stage 158.0 (TID 28820, 10.102.100.111, executor 17): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb: 기기에 남은 공간 없음

        -또는-

  • 스테이지 실패로 인해 작업이 중단됨: ResultStage 7이 최대 허용 횟수에 실패했습니다. 4. 가장 최근의 실패 원인: org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 2

Apache Spark는 AWS Glue 워커의 로컬 디스크를 사용하여 spark.executor.memory 구성 파라미터로 정의된 힙 공간을 초과하는 메모리에서 데이터를 유출합니다.

groupByKey(), reduceByKey(), 및 **join()**과 같은 광범위한 변환을 수행하면 셔플이 발생할 수 있습니다. 작업의 정렬 또는 셔플 스테이지에서 Spark는 다른 워커 간에 데이터를 교환하기 전에 중간 데이터를 로컬 디스크에 기록합니다. 이때 “No space left on device”이라는 메시지가 표시되거나 MetadataFetchFailedException 오류가 발생할 수 있습니다. Spark는 실행기에 디스크 공간이 충분하지 않고 복구가 되지 않을 때 이 오류를 발생시킵니다.

해결 방법

이러한 유형의 오류는 일반적으로 처리 작업에서 데이터세트에서 상당한 편차가 발견될 때 발생합니다. 이 섹션에서는 일반적인 모니터링 및 디버깅 이상 현상과 이를 해결할 수 있는 방법을 설명합니다.

AWS Glue 작업 지표 Apache Spark UI는 Apache Spark 실행기의 데이터 편차를 모니터링하는 강력한 도구입니다. 이 도구를 사용하면 구현 일정을 모니터링하여 데이터 편차를 초래할 수 있는 문제를 쉽게 식별할 수 있습니다. 각 스테이지, 태스크, 작업 및 실행기의 동작을 자세히 이해하는 데 도움이 됩니다.

컴퓨팅 및 스토리지 분리

이 접근 방식은 AWS Glue 워커의 로컬 디스크에 데이터를 쓰는 대신 대규모 셔플을 위해 스토리지를 확장합니다.

**전용 서버리스 스토리지 사용:**AWS Glue 2.0 이상에서는 Amazon Simple Storage Service(Amazon S3)를 사용하여 Spark 셔플 및 유출 데이터를 저장할 수 있습니다.

AWS Glue 2.0 AWS Glue에서 Amazon S3 셔플을 사용하려면 다음 작업 파라미터를 사용하십시오. 자세한 내용은 Amazon S3를 사용한 AWS Glue Spark 셔플 플러그인을 참조하십시오.

  • 키: --write-shuffle-files-to-s3
    값: TRUE
  • 키: --write-shuffle-spills-to-s3
    값: TRUE
  • 키: --conf
    값: spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
    **참고:**선택적 플래그 spark.shuffle.glue.s3ShuffleBucket은 셔플 파일을 작성하는 Amazon S3 버킷을 지정합니다. custom_shuffle_bucket을 S3 버킷 이름으로 바꿉니다.

AWS Glue 3.0/4.0 Apache Spark용 클라우드 셔플 스토리지 플러그인을 사용하려면 다음 작업 파라미터를 사용하세요. 자세한 내용은 Apache Spark용 클라우드 셔플 스토리지 플러그인을 참조하세요.

  • 키: --write-shuffle-files-to-s3
    값: TRUE
  • 키: --conf
    값: spark.shuffle.storage.path=s3://custom_shuffle_bucket
    참고: 선택적 플래그** spark.shuffle.storage.path**는 셔플 파일을 쓰는 Amazon S3 버킷을 지정합니다. custom_shuffle_bucket을 S3 버킷 이름으로 바꿉니다.

스케일링 아웃

스케일아웃은 수평적 스케일링을 통해 워커 수를 늘리거나 수직 스케일링을 통해 워커 유형을 업그레이드하는 것을 말합니다. 그러나 스케일아웃이 항상 효과가 있는 것은 아닙니다. 특히 데이터가 키 몇 개로 편차가 심한 경우에는 더욱 그렇습니다. 데이터 편차를 해결하려면 솔팅 기법을 구현하여 Apache Spark 애플리케이션 로직을 수정하는 것이 좋습니다.

입력 데이터 감소 및 필터링

입력 데이터를 최대한 사전 필터링하여 광범위한 작업 중에 데이터 셔플링과 네트워크 사용을 최소화합니다. 효과적인 데이터 필터링을 위해 다음 기술을 사용하세요.

소형 테이블 브로드캐스트

Apache Spark에서 테이블을 조인하면 서로 다른 워커의 실행기 간에 데이터 셔플링과 대량의 데이터 이동이 트리거될 수 있습니다. 이로 인해 시스템의 메모리가 부족해지고 워커의 디스크에 데이터가 유출될 수 있습니다. 네트워크 오버헤드를 최소화하기 위해 Spark는 브로드캐스트에 더 작은 테이블을 사용할 수 있도록 지원합니다. 이러한 테이블은 크기가 수십 MB(메가바이트)를 넘지 않으며 데이터 파티셔닝과 셔플링을 방지합니다. Spark에 힌트를 제공하여 브로드캐스트용으로 소형 테이블을 사용하세요. 자세한 내용은 AWS 블로그 AWS Glue의 메모리 관리 최적화소형 테이블 브로드캐스트를 참조하세요.

AQE 사용

Databricks의 적응형 쿼리 실행(AQE)은 Spark SQL의 최적화 기법입니다. 런타임 통계를 사용하여 가장 효율적인 쿼리 구현 계획을 선택하여 각 스테이지에서 데이터 편차와 동적 셔플 파티션을 해결합니다. AQE는 AWS Glue 3.0/4.0에서 기본적으로 사용할 수 있습니다.

AQE는 다음 기능을 수행합니다.

  • 셔플 파티션을 동적으로 병합
    필요한 경우 각 쿼리 스테이지 후에 파티션을 자동으로 병합하고 파티션 관리 문제를 해결합니다. 자세한 내용은 적응형 쿼리 실행의 셔플 파티션 동적 병합을 참조하세요. Databricks 웹 사이트에서 런타임 시 Spark SQL 속도를 높임. **–파티션이 너무 적음:**로컬 디스크 유출을 유발하는 과도한 데이터가 있는 파티션을 자동으로 분할합니다.
    –파티션이 너무 많음: 필요에 따라 파티션을 자동으로 결합합니다. 파티션은 각 파티션의 데이터 크기가 작고 셔플 블록을 읽기 위해 작은 네트워크 데이터를 가져와야 할 때 결합됩니다.

  • 조인 전략을 동적으로 전환
    각 스테이지의 테이블 크기 통계를 기반으로 Sort-MergeBroadcast Hash Join으로 변환합니다.

  • 편차 조인을 동적으로 최적화
    셔플 파일 통계에서 편차 조인을 자동으로 감지하고 최적화합니다. AQE는 편차 파티션을 더 작은 하위 파티션으로 분할합니다. 그런 다음 이 작은 파티션을 다른 노드의 해당 파티션에 조인합니다. 자세한 내용은 적응형 쿼리 실행의 편차 조인 동적 최적화를 참조하세요. Databricks 웹 사이트에서 런타임 시 Spark SQL 속도를 높임.

AQE 구성

다음 작업 파라미터를 사용하여 AQE를 켜세요.

  • 키: --conf
    값: spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
AWS 공식
AWS 공식업데이트됨 일 년 전