AWS Glue ETL ジョブを、多数の小さなファイルを出力するのではなく、少数の大きなファイルを出力するように設定したいと考えています。
解決策
GroupSize パラメーターの値を増やす
ダイナミックフレームを使用しており、Amazon Simple Storage Service (Amazon S3) データセットに 50,000 を超えるファイルがある場合、AWS Glue ETL ジョブは自動的にファイルをグループ化します。より少なく、サイズが大きい出力ファイルを作成するには、GroupSize の値を大きくします。詳細については、「大きなグループでの入力ファイルの読み取り」を参照してください。
次の例では、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 または repartition を使用する
次の手順を実行します。
-
(オプション) 入力データセットのサイズに基づいて目標のパーティション数 (N) を計算します。targetNumPartitions = 1 Gb * 1000 Mb/10 Mb = 100 という数式で、出力ファイルのサイズを制御します。
注: 上記の式では、入力サイズは 1 GB、目標出力サイズは 10 MB、目標パーティション数は 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 または負の値に設定すると、レコード数の制限はなくなります。
関連情報
グループ化を使用して複数のファイルの処理を修正する