AWS Glue の「java.lang.OutOfMemoryError: Java heap space」エラーを解決するにはどうすれば良いですか?
最終更新日: 2022 年 2 月 7 日
AWS Glue ジョブで「終了コード 1 でのコマンドが失敗しました」というエラーが発生し、Amazon CloudWatch Logs に「java.lang.OutOfMemoryError: Java heap space」エラーが表示されます。
簡単な説明
「java.lang.OutOfMemoryError: Java heap space」エラーは、ドライバーまたはエグゼキュタープロセスでメモリが不足していることを示します。ドライバーまたはエグゼキュターのどちらが OOM を発生させているかどうかを判断するには、「OOM 例外とジョブの異常のデバッグ」を参照してください。次の解決方法は、ドライバー OOM 例外のみを扱っています。
解決方法
ドライバー OOM 例外は、Apache Spark ジョブが Amazon Simple Storage Service (Amazon S3) から多数の小さなファイルを読み取るときによく発生します。次の 1 つ以上の方法を使用して、DynamicFrame でドライバーの OOM 例外を解決します。
グループ化
グループ化機能を有効化した場合、タスクは個々のファイルではなく複数のファイルを処理します。詳細については、「グループ化を使用した複数ファイルの処理を修正」を参照してください。
useS3ListImplementation を有効にする
AWS Glue は、ファイルをリストすると、ドライバーのメモリリストにファイルインデックスを作成します。次の例に示すように useS3ListImplementation を True に設定すると、AWS Glue はメモリ内のファイルリストを一度にキャッシュしません。代わりに、AWS Glue はリストをバッチでキャッシュします。これは、ドライバーがメモリ不足になる可能性が低いことを意味します。
from_catalog で useS3ListImplementation を有効にする方法の例を次に示します。
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")
from_options で useS3ListImplementation を有効にする方法の例を次に示します。
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")
useS3ListImplementation 機能は、大きな結果セットを複数の応答に分割する Amazon S3 ListKeys オペレーションの実装です。ジョブブックマークで useS3ListImplementation を使用するのがベストプラクティスです。
追加のトラブルシューティング
グループ化と useS3ListImplementation でドライバー OOM 例外を解決できない場合は、次を試してください。
- CloudWatch Logs と CloudWatch メトリクスを使用して、ドライバーのメモリを分析します。CloudWatch アラームを設定して、ジョブで特定のしきい値に違反したときにアラートを発します。
- collect や count などのアクションの使用は控えてください。これらのアクションは、結果をドライバーに収集し、ドライバーの OOM 例外を引き起こす可能性があります。
- データセットを分析し、ジョブに適したワーカータイプを選択します。G.1X または G.2X へのスケールアップを検討してください。