跳至內容

當我將大型資料集從 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 選項。如需詳細資訊,請參閱並行讀取 JDBC 表

以下是使用 JDBC 連線建立 DynamicFrame 時,如何設定 hashpartitionshashexpression 的範例。在 connection_option 中,替換 JDBC 網址、使用者名稱、密碼、資料表名稱和欄名稱。

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,仍可能會發生此延遲或失敗。若要解決這些問題,請搭配 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 作業會失敗,並顯示錯誤「Exit status: -100.診斷: Container released on a *lost* node」(結束狀態:-100。診斷:容器發佈在 *lost* 節點上)?

連線至資料

AWS 官方已更新 1 年前