より大きなファイルを出力するように AWS Glue ETL ジョブを設定する方法を教えてください。
最終更新日: 2021 年 10 月 7 日
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")
coalesce() を使用する
Apache Spark coalesce() オペレーションを使用して、Amazon S3 に書き込む前に Spark 出力パーティションの数を減らします。これにより、出力ファイルの数が減少します。
次の点にご注意ください。
- coalesce() は Spark データシャッフルを実行し、ジョブの実行時間を大幅に増やすことができます。
- パーティションの数を小さく指定すると、それでジョブが失敗する場合があります。例えば、coalesce(1) を実行すると、Spark はすべてのデータを 1 つのパーティションに配置しようとします。これにより、ディスク容量の問題が発生する可能性があります。
注意: repartition() を使用してパーティション数を減らすこともできます。ただし、repartition() はすべてのデータを再度シャッフルします。coalesce() オペレーションでは、既存のパーティションを使用してデータシャッフルの量を最小限に抑えます。
coalesce() オペレーションを使用して Spark パーティションの数を減らすには:
1. 現在のパーティション数を確認します。
dynamic_frame.getNumPartitions()
2. coalesce() を実行します。例:
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(20)