AWS Glue ETL ジョブが長時間実行される原因を教えてください。
AWS Glue ジョブが長時間実行されます。または、AWS Glue の低速タスクが完了するまでに長い時間がかかります。
解決策
AWS Glue ジョブを長時間実行することになる一般的な要因には、データやスクリプトの設定、構造などがあります。
次の手順は、パフォーマンスを最適化するうえで役立ちます。
メトリクスとログ記録を設定する
問題を特定してパフォーマンスを最適化するには、Amazon CloudWatch やジョブオブザーバビリティメトリクスなどの AWS Glue の統合監視ツールを使用します。
さらに、異常に対するアラートを設定し、Apache Spark UIを有効にすることで、AWS Glue ジョブの稼働状況を詳細に把握できます。AWS Glue のジョブ実行インサイト機能を使用すると、実行中のジョブの動作を詳細に把握できます。
メトリクスを有効にするには、次のいずれかを実行します。
AWS Glue コンソールを使用
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [ETL ジョブ] を選択します。
- メトリクスを有効にする対象のジョブを選択します。
- [アクション] を選択し、[ジョブを編集] を選択します。
- [ジョブの詳細] タブの [詳細オプション] で [ジョブメトリクス]、[ジョブオブザーバビリティメトリクス]、[継続的ログ記録]、[Spark UI] を選択します。
- [保存] を選択します。
CLI または SDK を使用
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
API コールまたは CLI 経由で、DefaultArguments パラメータに次のパラメータを渡します。
'--enable-metrics' : 'true' '--enable-observability-metrics' : 'true' '--enable-continuous-cloudwatch-log' : 'true' '--enable-spark-ui' : 'true' '--spark-event-logs-path' : '<s3://path/to/log/>'
ボトルネックを特定する
ボトルネックを特定するには、ジョブの実行によって生成された CloudWatch のドライバーログまたは Spark UI ログを参照します。AWS Glue 3.0 以降では、アダプティブクエリ実行 (AQE) などの Spark ネイティブ機能を使用して偏った結合を処理できます。詳細については、Apache のウェブサイトで「Web UI」を参照してください。
ドライバーログ
ドライバーログを確認する方法を次に示します。
- AWS Glue コンソールからジョブを開きます。
- [実行] タブで、ログを確認する対象のジョブ実行を選択します。
- CloudWatch ロググループ /aws-glue/jobs/error で、ログを開いたジョブ実行 ID と同じ名前のログストリームを選択します。名前に "_g-xxxxxx" というサフィックスが付いたストリームがエグゼキューターログです。
- ドライバーログで、完了までの実行が長いタスクがないか確認します。次の例では、1 つのタスクが 34 分間実行され、このタスクが作成された Spark ジョブは 35 分で完了しました。
2024-09-13 10:06:13,847 INFO [task-result-getter-0] scheduler.TaskSetManager (Logging.scala:logInfo(61)): Finished task 0.0 in stage 0.0 (TID 0) in 2054673 ms on 172.35.184.56 (executor 1) (1/1) 2024-09-13 10:06:13,894 INFO [Thread-13] scheduler.DAGScheduler (Logging.scala:logInfo(61)): Job 0 finished: save at DataSink.scala:666, took 2164.67 s
Spark UI ログ
Spark UI ログの [ジョブ] タブと [ステージ] タブで、長時間実行されたステージとタスクを探します。
ボトルネックを修正する
データをより効率的に分割します。AWS Glue ジョブは分散処理に依存しています。データが効率的に分割されていない場合、Spark ワーカーは大規模で不均衡なパーティションを処理することになる可能性があります。この処理時間は遅延の原因となります。パーティションの数を制御するには、Spark の repartition () または coalesce () 関数を使用します。Spark の分散機能を活用するには、データを適切に分割する必要があります。AWS Glue DynamicFrame を設定することでも、splitFields またはカスタムパーティションキーを使用してデータを分割できます。
ワーカーノードを追加してキャパシティを増やします。大量のデータを処理するのに十分なワーカーノードがない場合、並列処理が制限されるため、ジョブの実行が遅くなります。ワーカーノードの数を増やすか、より大きなワーカータイプに切り替えます。適切なワーカーサイズを使用し、データを効率的に処理するのに十分な DPU (データ処理ユニット) を割り当てていることを確認してください。エグゼキューターごとに処理されるタスクの数は、DPU の数の 4 倍です。たとえば、G.1X ワーカータイプに DPU が 1 つある場合は、各エグゼキューターは 4 件のタスクを処理します。なお、G.4X と G.8X のワーカータイプは、AWS Glue バージョン 3.0 以降の Spark ETL ジョブでのみ使用できます。
データを再分散してパーティション間の偏りを軽減します。データの偏りは、パーティションごとのデータ量が大幅に異なる場合に発生します。データ量の多いノードは過負荷になり、他のノードはアイドル状態になります。データ分布を分析することで、偏ったキーを特定します。データをパーティション間で再分散またはバランス調整するか、ソルティング手法を使用してホットキーを分散させます。AWS Glue 3.0 以降では、Apache ウェブサイトでのアダプティブクエリ実行 (AQE) などの Spark ネイティブ機能を使用して偏った結合を処理できます。この処理を行うには、アダプティブクエリ実行 (AQE) を有効にし、spark.sql.adaptive.skewJoin.enabled を true に設定します。Spark 3.2.0 以降では、AQE はデフォルトで有効になっています。Glue 3.0 で AQE を有効にするには、パラメータ spark.sql.adaptive.enabled を追加し、true に設定します。
UDF をネイティブの Spark 関数に置き換えます。カスタムのユーザー定義関数 (UDF) や複雑な変換は、実行にコストがかかり、Spark ジョブの速度を低下させる可能性があります。可能な限り UDF は避け、パフォーマンス用に最適化されたネイティブ Spark 関数を使用してください。UDF が必要な場合は、多くの場合は Scala UDF を使用すると良いパフォーマンスが得られるため、Python ではなく Scala で書き直してください。さらに、効果的に最適化を行うには、DataFrames または DynamicFrames を使用して変換を適用してください。
シャッフル操作を最小限に抑えます。groupBy、join、orderBy などのシャッフル操作は、ノード間でデータを転送します。これらの操作を使いすぎたり、適切に管理しなかったりすると、ボトルネックになる可能性があります。変換プロセスのできるだけ早い段階でデータをフィルター処理して集計することで、シャッフル操作を最小限に抑えられます。不要なデータ転送を避けるため、使用できる場合はブロードキャスト結合を使用してください。また、シャッフルされたデータが効率的に分割されていることを確認してください。
不要なキャッシュを削除します。キャッシュを使いすぎたり不適切に使用したりすると、メモリ消費量が増加し、ジョブが遅くなる可能性があります。cache () または persist () は、ワークフローでデータセットを複数回再利用する場合にのみ使用してください。使用可能なメモリを記録し、キャッシュされたデータセットが不要になったら unpersist () でそれらのデータセットをクリアします。
長い依存関係チェーンを分割します。ジョブで変換の連鎖が長い場合、Sparkは依存関係チェーン全体を再計算します。これらのアクションにより、処理が遅くなる場合があります。複雑なジョブを小さなタスクに分割します。必要に応じて、中間結果を保持します。こうすることで、再計算のオーバーヘッドを軽減し、各ステップのパフォーマンスを個別にデバッグ、監視できるようになります。
ネットワーク遅延と I/O 操作を削減します。Amazon Simple Storage Service (Amazon S3)、Amazon Relational Database Service (Amazon RDS)、Amazon Redshift などの外部ソースに対してデータを読み書きすると、特に大きなデータセットの場合に遅延が発生する可能性があります。AWS Glue の組み込みコネクタを使用してください。Parquet や ORC など、より高速な読み取りと書き込みをサポートする形式でデータを格納します。S3 Transfer Acceleration を有効にしてデータ転送速度を高速化し、AWS Glue データカタログを使用してメタデータの取得を最適化します。
ネイティブ操作を最適化します。ジョブブックマークや DynamoDB エクスポートコネクタなどの Glue ネイティブ操作により、AWS Glue ジョブの実行時間が長くなる場合があります。実行時間を確認するには、ドライバーログで AWS Glue ジョブが開始された時間と、DynamoDB によるジョブブックマークタスクまやエクスポートが終了した時間を特定します。DynamoDB で、次の例のようなメッセージを確認します。
2024-08-24 03:33:37.000Z connections.DynamoExportConnection (DynamoExportConnection.scala:dynamodbexport(129)): Dynamodb Export complete...exported 712948751 item(s) or 4859215204353 byte(s)
ジョブブックマークの影響を軽減する
- スキャンするファイルの数を減らすために、小さなファイルを大きなファイルに統合します。
- 処理が完了したら、パーティションをアーカイブの場所に再移動します。
- AWS Glue が変更されていないパーティション全体をスキップできるように、効率的なパーティション戦略を実施します。
- データを早期に絞り込むために、プッシュダウン述語を使用します。
- ジョブブックマークがジョブプロセスに有益ではない場合は、一時的に無効にします。
DynamoDB コネクタの影響を軽減する
- 可能であれば、エクスポートするデータの量を削減します。
- エクスポートの遅延の原因となっている問題を特定するには、DynamoDB と AWS Glue を監視します。
- エクスポート時間を短縮するために、DynamoDB テーブルの設定を最適化します。
- 可能であれば、メインジョブの外にデータをエクスポートしたり、スケジュールを調整してボトルネックを回避したりします。
関連情報
関連するコンテンツ
- 質問済み 3ヶ月前lg...
- 質問済み 2年前lg...
- 質問済み 1年前lg...
- 質問済み 5ヶ月前lg...
- AWS公式更新しました 6ヶ月前