더 큰 파일을 출력하도록 AWS Glue ETL 작업을 구성하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 11월 25일

많은 수의 작은 파일 대신 소수의 큰 파일을 출력하도록 AWS Glue ETL 작업을 구성하려고 합니다.

해결 방법

다음 방법 중 하나를 사용하여 AWS Glue ETL 작업에 대한 출력 파일 수를 줄입니다.

groupSize 파라미터 값 늘리기

동적 프레임을 사용하고 Amazon Simple Storage Service(Amazon S3) 데이터 세트에 50,000개가 넘는 파일이 있는 경우 그룹화가 자동으로 활성화됩니다. 더 적은 수의 큰 출력 파일을 생성하려면 이 값을 늘립니다. 자세한 내용은 더 큰 그룹에서 입력 파일 읽기를 참조하세요.

다음 예제에서 groupSize는 10,485,760바이트(10MB)로 설정됩니다.

dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://awsexamplebucket/"], 'groupFiles': 'inPartition', 'groupSize': '10485760'}, format="json")

참고: groupSizegroupFiles 파라미터는 csv, ion, grokLog, json 및 xml과 같은 데이터 형식에서만 지원됩니다. 이 옵션은 avro, parquet 및 orc에서는 지원되지 않습니다.

coalesce(N) 또는 repartition(N) 사용

1.    (선택 사항)입력 데이터 세트 크기를 기반으로 대상 파티션 수(N)를 계산합니다. 다음 공식을 사용합니다.

targetNumPartitions=1Gb * 1000Mb/10Mb=100

참고: 이 예시에서 입력 크기는 1GB이고 대상 출력은 10MB입니다. 이 계산을 통해 출력 파일의 크기를 제어할 수 있습니다.

2.    다음 코드를 사용하여 현재 파티션 수를 확인합니다.

currentNumPartitions = dynamic_frame.getNumPartitions()

참고: 재분할 시 targetNumPartitionscurrentNumPartitions보다 작아야 합니다.

3.    Apache Spark coalesce() 작업을 사용하여 Amazon S3에 쓰기 전에 Spark 출력 파티션의 수를 줄입니다. 이렇게 하면 출력 파일 수가 줄어듭니다. 예를 들어, 다음과 같습니다.

dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)

다음 사항에 유의하세요.

  • coalesce()는 Spark 데이터 셔플을 수행하므로 작업 실행 시간이 크게 늘어날 수 있습니다.
  • 적은 수의 파티션을 지정하면 그 다음에 작업이 실패할 수 있습니다. 예를 들어 coalesce(1)를 실행하면 Spark가 모든 데이터를 단일 파티션에 넣으려고 시도합니다. 이로 인해 디스크 공간 문제가 발생할 수 있습니다.
  • repartition()을 사용하여 파티션 수를 줄일 수도 있습니다. 하지만 repartition()은 모든 데이터를 리셔플링합니다. coalesce() 작업은 기존 파티션을 사용하여 데이터 셔플의 수를 최소화합니다. repartition () 사용에 대한 자세한 내용은 eduCBA 웹 사이트의 Spark 재분할을 참조하세요.

maxRecordsPerFile 사용

Spark write () 메서드를 사용하여 파일당 최대 레코드 수를 제어합니다. 다음 예시에서는 최대 레코드 수를 20으로 설정합니다.

df.write.option("compression", "gzip").option("maxRecordsPerFile",20).json(s3_path)

참고: maxRecordsPerFile 옵션은 파일당 레코드 수의 상한선으로만 역할합니다. 각 파일의 레코드 수는 지정된 수보다 작거나 같습니다. 값이 0이거나 음수이면 제한이 없습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?