AWS Glue の「java.lang.OutOfMemoryError: Java heap space」エラーを解決するにはどうすれば良いですか?

最終更新日: 2020 年 6 月 19 日

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 がファイルを表示するとき、ドライバーメモリにファイルインデックスを作成します。次の例に示すように useS3ListImplementationTrue に設定すると、AWS Glue はメモリ内のファイルリストを一度にキャッシュしません。代わりに、AWS Glue はリストをバッチでキャッシュします。これは、ドライバーがメモリ不足になる可能性が低いことを意味します。

from_cataloguseS3ListImplementation を有効にする方法の例を次に示します。

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

from_optionsuseS3ListImplementation を有効にする方法の例を次に示します。

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 へのスケールアップを検討してください。