當我將大型資料集從 Amazon RDS 移轉到 Amazon S3 時,為什麼 AWS Glue 作業會因遺失節點而失敗?

2 分的閱讀內容
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 資料集遺失節點錯誤。

並行讀取 JDBC 資料表

如果資料表沒有數值欄 (INT 或 BIGINT),請使用 hashfield 選項來分割資料。將 hashfield 設定為 JDBC 資料表中的欄名稱。為了獲得最佳結果,請選擇值分佈均勻的列。

如果資料表具有數值欄,請在資料表中或在建立 DynamicFrame 時設定 hashpartitionshashexpression 選項:

  • hashpartitions:定義 AWS Glue 為讀取資料而建立的任務數
  • hashexpression:在任務之間均勻地劃分行

以下是在使用 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")

以下是在 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 設定較大的值可能會降低資料表的效能。這是因為每個任務都會讀取整個資料表,然後將一組行傳回至執行程式。

如需詳細資訊,請參閱並行讀取 JDBC 資料表

使用 SQL 運算式作為下拉述詞

注意: 下面的 SQL 運算式不能用作 Oracle 資料庫的下拉述詞。不過,這個運算式可以作為 AWS Glue 原生支援的所有其他資料庫 (Amazon Aurora、MariaDB、Microsoft SQL 伺服器、MySQL 和 PostgreSQL) 的下拉述詞。

如果資料表包含數十億筆記錄和數兆 (TiB) 資料,即使在您設定 hashpartitionshashexpression 之後,作業也可能需要很長時間才會完成或因遺失節點而失敗。若要解決這些問題,請搭配 hashexpression 選項使用與下述內容相似的 SQL 運算式:

column_name > 1000 AND column_name < 2000 AND column_name

SQL 運算式可作為下拉述詞,強制作業在每個作業執行時讀取一組列,而不是一次讀取所有資料。完整的陳述式看起來類似於下列內容:

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 作業失敗,並顯示錯誤「結束狀態:-100。診斷: 容器在 *lost* 節點上發佈」?

在 AWS Glue Data Catalog 中定義連線

AWS 官方
AWS 官方已更新 2 年前