在 Amazon Redshift 中移入和移出数据 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

在 Amazon Redshift 中移入和移出数据

在将数据移入和移出 Amazon Redshift 集群时,AWS Glue 作业会对 Amazon Redshift 发出 COPY 和 UNLOAD 语句以实现最大吞吐量。这些命令要求 Amazon Redshift 集群访问 Amazon Simple Storage Service (Amazon S3) 作为暂存目录。默认情况下,AWS Glue 会传入使用您指定的角色创建的临时凭证来运行作业。出于安全原因,这些凭证在 1 小时后过期,这可能会导致长时间运行的作业失败。

要解决此问题,您可以使一个或多个 IAM 角色与 Amazon Redshift 集群本身相关联。COPY 和 UNLOAD 可以使用角色,Amazon Redshift 将根据需要刷新凭证。有关将角色与您的 Amazon Redshift 集群相关联的更多信息,请参阅 Amazon Redshift 数据库开发人员指南中的 COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限。 确保与您的集群关联的角色有权从您在作业中指定的 Amazon S3 临时目录中读取和写入该目录。

在为集群设置角色后,您需要在 AWS Glue 脚本中的 ETL(提取、转换和加载)语句中指定它。语法取决于您的脚本如何读取和写入您的动态帧。如果您的脚本从 AWS Glue 数据目录表中读取,则您可以按以下所示指定角色。

glueContext.create_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/role-name"})

类似地,如果您的脚本写入动态帧并从数据目录读取,则您可以按以下所示指定角色。

glueContext.write_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/role-name"})

在这些示例中,role-name 是让您与您的 Amazon Redshift 集群关联的角色,database-nametable-name 是指您的数据目录中的 Amazon Redshift 表。

您也可以在使用动态帧和使用 copy_from_options 时指定角色。语法类似,但您需要在 connection-options 映射中放置其他参数。

connection_options = { "url": "jdbc:redshift://host:port/redshift-database", "dbtable": "redshift-table", "user": "username", "password": "password", "redshiftTmpDir": args["TempDir"], "aws_iam_role": "arn:aws:iam::account-id:role/role-name" } df = glueContext.create_dynamic_frame_from_options("redshift", connection-options)

在写入 Amazon Redshift 时,选项类似。

connection_options = { "dbtable": "redshift-table", "database": "redshift-database", "aws_iam_role": "arn:aws:iam::account-id:role/role-name" } glueContext.write_dynamic_frame.from_jdbc_conf( frame = input-dynamic-frame, catalog_connection = "connection-name", connection_options = connection-options, redshift_tmp_dir = args["TempDir"])