많은 수의 작은 파일 대신 적은 수의 큰 파일을 출력하도록 AWS Glue ETL 작업을 구성하고 싶습니다.
해결 방법
groupSize 파라미터의 값 늘리기
동적 프레임을 사용하고 Amazon Simple Storage Service (Amazon S3) 데이터 세트에 50,000개 이상의 파일이 있는 경우, AWS Glue ETL 작업은 자동으로 파일을 그룹화합니다. 더 적은 수의 큰 출력 파일을 만들려면 GroupSize 값을 늘리십시오. 자세한 내용은 대규모 그룹에서 입력 파일 읽기를 참조하십시오.
다음 예에서는 groupSize가 10485760바이트 또는 약 10MB로 설정되어 있습니다.
dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://awsexamplebucket/"], 'groupFiles': 'inPartition', 'groupSize': '10485760'}, format="json")
참고: groupSize 및 groupFiles 파라미터는 .csv, .ion, .grokLog, .json 및 .xml 파일 형식에서만 지원됩니다. .avro, .parquet 및 .orc 파일 형식은 이러한 파라미터를 지원하지 않습니다.
병합 또는 재분할 사용
다음 단계를 완료하십시오.
-
(선택 사항) 입력 데이터 세트 크기를 기반으로 목표 파티션 수(N)를 계산합니다. targetNumPartitions = 1Gb * 1000Mb/10Mb = 100 공식을 사용하여 출력 파일의 크기를 제어할 수 있습니다.
참고: 위 공식에서 입력 크기는 1GB, 대상 출력 크기는 10MB, 목표 파티션 수는 100입니다.
-
현재 파티션 수를 확인하려면 다음 명령을 실행합니다.
currentNumPartitions = dynamic_frame.getNumPartitions()
-
출력 파일 수를 줄이려면 Amazon S3에 쓰기 전에 Apache Spark 출력 파티션의 수를 줄이십시오. 파티션 수를 줄이려면 Spark coalesce 함수를 사용합니다.
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)
참고: targetNumPartitions가 너무 작으면 디스크 공간 문제로 인해 작업이 실패할 수 있습니다.
-또는-
Apache Spark repartition 함수를 사용합니다.
dynamic_frame_with_less_partitions=dynamic_frame.repartition(targetNumPartitions)
참고: 더 큰 파일을 생성하려면 targetNumPartitions를 currentNumPartitions보다 작은 값으로 설정하십시오.
coalesce 및 repartition 함수 모두 데이터를 재편성하므로 작업 실행 시간이 길어질 수 있습니다. 하지만 coalesce 함수는 기존 파티션을 사용하여 데이터 재편성 수를 최소화합니다.
maxRecordsPerFile 사용
Spark write 메서드에서 maxRecordsPerFile을 사용하여 각 파일의 최대 레코드 수를 늘립니다. 다음 예에서는 최대 레코드 수를 20으로 설정합니다.
df.write.option("compression", "gzip").option("maxRecordsPerFile", 20).json(s3_path)
참고: maxRecordsPerFile 옵션은 각 파일의 레코드 수에 더 높은 할당량을 설정합니다. 각 파일의 레코드 수는 여전히 maxRecordsPerFile의 값보다 작을 수 있습니다. maxRecordsPerFile을 0 또는 음수로 설정하면 레코드 수 할당량이 없게 됩니다.
관련 정보
여러 파일을 처리하는 문제를 그룹화를 사용하여 해결