AWS Glue ETL ジョブを設定して、多数の小さなファイルではなく少数の大きなファイルを出力したいと考えています。
解決方法
AWS Glue ETL ジョブの出力ファイル数を減らすには、次のいずれかの方法を使用します。
groupSize パラメータの値を大きくする
動的フレームを使用する場合、および Amazon Simple Storage Service (Amazon S3) データセットに 50,000 を超えるファイルがある場合、グループ化は自動的に有効になります。この値を大きくすると、より少ない数で、より大きな出力ファイルが作成されます。詳細については、「より大きいグループの入力ファイル読み取り」をご参照ください。
次の例では、groupSize は 10485760 バイト (10 MB) に設定されています。
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 ではサポートされていません。
coalesce(N) または repartition(N) を使用する
1. (オプション) 入力データセットのサイズに基づいて、ターゲットのパーティション数 (N) を計算します。次の式を使用します:
targetNumPartitions = 1 Gb * 1000 Mb/10 Mb = 100
注: この例では、入力サイズは 1 GB、ターゲット出力は 10 MB です。この計算により、出力ファイルのサイズを制御できます。
2. 次のコードを使用して、現在のパーティション数を確認します:
currentNumPartitions = dynamic_frame.getNumPartitions()
注: 再パーティションする場合、targetNumPartitions は currentNumPartitions よりも小さい必要があります。
3. Apache Spark coalesce() オペレーションを使用して、Amazon S3 に書き込む前に Spark 出力パーティションの数を減らします。これにより、出力ファイルの数が減少します。例:
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)
次の点にご注意ください。
- coalesce() は Spark データシャッフルを実行し、ジョブの実行時間を大幅に増やすことができます。
- パーティションの数を小さく指定すると、それでジョブが失敗する場合があります。例えば、coalesce(1) を実行すると、Spark はすべてのデータを 1 つのパーティションに配置しようとします。これにより、ディスク容量の問題が発生する可能性があります。
- repartition() を使用してパーティション数を減らすこともできます。ただし、repartition() はすべてのデータを再シャッフルします。coalesce() オペレーションでは、既存のパーティションを使用してデータシャッフルの数を最小限に抑えます。repartition() の使用方法の詳細については、eduCBA ウェブサイトの「Spark Repartition」(Spark の再パーティション) を参照してください。
maxRecordsPerFile を使用する
Spark write() メソッドを使用して、ファイルあたりの最大レコード数を制御します。次の例では、最大レコード数を 20 に設定しています:
df.write.option("compression", "gzip").option("maxRecordsPerFile",20).json(s3_path)
注: maxRecordsPerFile オプションは、ファイルごとのレコード数の上限としてのみ機能します。各ファイルのレコード数は、指定された数以下になります。値がゼロまたは負の場合、制限はありません。
関連情報
グループ化を使用した複数のファイル処理の修正