スキップしてコンテンツを表示

Amazon RDS から Amazon S3 に大規模なデータセットを移行する際、AWS Glue ジョブが失敗し、ノードが失われる原因を教えてください。

所要時間1分
0

AWS Glue を使用して、Amazon Relational Database Service (Amazon RDS) またはオンプレミスの JDBC データベースから Amazon Simple Storage Service (Amazon S3) に大規模データセットを移行しています。その ETL ジョブは長く実行された後に失敗し、ノードが失われます。

簡単な説明

AWS Glue は、単一の接続を使用してデータセット全体を読み取ります。大規模な JDBC テーブルを移行する場合、ETL ジョブが長時間実行されるものの、AWS Glue 側で進行しなくなる可能性があります。その後、ディスク容量の問題 (ノードの損失) が原因で、そのジョブは最終的に失敗する可能性があります。この問題を解決するには、JDBC テーブルを並行して読み取ってください。その方法でもノードの損失とジョブの失敗を解消できない場合は、プッシュダウン述語として SQL 式を使用してください。

解決策

JDBC データセットでのノード損失エラーを解決するには、次の 1 つまたは複数の方法を使用します。

JDBC テーブルを並行して読み込む

テーブルに INT や BIGINT などの数値列がない場合は、hashfield オプションを使用してデータを分割します。JDBC テーブル内のカラムの名前を、hashfield と設定します。最良の結果を得るには、値が均等に分布している列を選択してください。

テーブルに数値列が含まれる場合は、hashpartitions オプションおよび hashexpression オプションをテーブル内に設定するか、DynamicFrame の作成時に設定します。詳細については、「JDBC テーブルからの並列読み取り」を参照してください。

JDBC 接続で DynamicFrame を作成する際に、hashpartitionshashexpression を設定する方法例を次に示します。connection_option では、JDBC URL、ユーザー名、パスワード、テーブル名、および列名を置き換えます。

connection_option= {"url": "jdbc:mysql://mysql-instance1.123456789012.us-east-1.rds.amazonaws.com:3306/database", "user": "your_user_name", "password": "your_password","dbtable": "your_table","hashexpression":"column_name","hashpartitions":"10"}
datasource0 = glueContext.create_dynamic_frame.from_options('mysql',connection_options=connection_option,transformation_ctx = "datasource0")

注: your_user_nameyour_passwordyour_tablecolumn_name の各値を実際の情報で置き換えます。

AWS Glue データカタログから DynamicFrame を作成する際に、hashpartitionshashexpression を設定する方法例を次に示します。

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database", table_name = "your_table",additional_options={"hashexpression":"column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

注: hashpartitions に高い値を設定した場合、テーブルのパフォーマンスが低下する可能性があります。これは、各タスクがテーブル全体を読み取った後に、一連の行をエグゼキューターに返すことが原因です。

SQL 式をプッシュダウン述語として使用する

注: 次の SQL 式は、Oracle データベースではプッシュダウン述語として機能しません。この式は、AWS Glue がネイティブにサポートする他のすべてのデータベースでは、プッシュダウン述語として機能します。Amazon Aurora、MariaDB、マイクロソフト SQL サーバー、MySQL、PostgreSQL などのデータベースが該当します。

テーブルに数十億のレコードとテビバイト (TiB) のデータが含まれている場合、ジョブが完了するまでに長い時間がかかったり、ジョブが失敗してノードが失われたりする可能性があります。hashpartitionshashexpression を設定した後にも、このような遅延や障害が生じる可能性があります。これらの問題を解決するには、次のような SQL 式を hashexpression オプションと併用します。

column_name > 1000 AND column_name < 2000 AND column_name

この SQL 式はプッシュダウン述語として機能します。この式では、すべてのデータを一度に読み取るのではなく、ジョブの実行ごとに 1 セットの行を読み取ることをジョブに強制します。ステートメントの全体は次のようになります。

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "sampledb", table_name = "test_table",additional_options={"hashexpression":"column_name > 1000 AND column_name < 2000 AND column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

注: この設定でジョブを最初に実行する際は、ジョブブックマークを無効にしてください。ジョブブックマークを使用してジョブを実行すると、AWS Glue は列の最大値を記録します。ジョブを再度実行すると、AWS Glue は前回のブックマーク値よりも高い値を含む行のみを処理します。必要に応じて、最後のジョブ実行時にジョブブックマークを有効にしてください。

関連情報

AWS Glue ジョブが失敗し、「Exit status: -100.Diagnostics: Container released on a *lost* node」というエラーが発生する原因を教えてください

データに接続する

AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ