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

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")

**注: ** JDBC URL、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、Microsoft SQL Server、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公式更新しました 1年前