Skip to content

当我将大型数据集从 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 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 Data Catalog 创建 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 表达式充当下推谓词。该表达式强制作业每次运行读取一组行,而不是一次读取所有数据。完整的语句如下所示:

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 官方已更新 1 个月前