Redshift 连接 - AWS Glue

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Redshift 连接

你可以使用 AWS Glue for Spark 读取和写入亚马逊 Redshift 数据库中的表。连接到亚马逊 Redshift 数据库时,G AWS lue 使用亚马逊 Red COPY shift SQL 和命令通过亚马逊 S3 移动数据以实现最大吞吐量。UNLOAD在 AWS Glue 4.0 及更高版本中,您可以使用适用于 Apache Spark 的 Amazon Redshift 集成进行读写,除了通过先前版本连接时可用的优化和功能外,还具有针对亚马逊 Redshift 的优化和功能。

了解 Glue 如何 AWS 让亚马逊 Redshift 用户比以往任何时候都更轻松地迁移到 G AWS lue 进行无服务器数据集成和 ETL。

配置 Redshift 连接

要在 G AWS lue 中使用 Amazon Redshift 集群,你需要一些先决条件:

  • 读取和写入数据库时用于临时存储的 Amazon S3 目录。

  • 一种亚马逊 VPC,允许在您的亚马逊 Redshift 集群、Glu AWS e 任务和亚马逊 S3 目录之间进行通信。

  • AWS Glue 任务和 Amazon Redshift 集群的相应的 IAM 权限。

配置 IAM 角色

为 Amazon Redshift 集群设置角色

您的 Amazon Redshift 集群需要能够读取和写入亚马逊 S3 才能与 Glue 任务集成 AWS 。为此,您可以将 IAM 角色与要连接的新 Amazon Redshift 集群关联。您的角色应具有允许读取和写入 Amazon S3 临时目录的策略。您的角色应该有信任关系,允许 redshift.amazonaws.com 服务连接到 AssumeRole

将 IAM 角色与 Amazon Redshift 关联
  1. 先决条件:用于临时存储文件的 Amazon S3 存储桶或目录。

  2. 确定您的 Amazon Redshift 集群需要哪些 Amazon S3 权限。在将数据移入和移出亚马逊 Redshift 集群时,G AWS lue 作业会针对亚马逊 Redshift 发出 COPY 和 UNLOAD 语句。如果你的任务修改了 Amazon Redshift 中的表, AWS Glue 还会发出 CREATE LIBRARY 语句。有关亚马逊 Redshift 执行这些语句所需的特定 Amazon S3 权限的信息,请参阅亚马逊 Redshift 文档:Amazon R edshift:访问其他资源的权限。 AWS

  3. 在 IAM 控制台中,创建具有必要权限的 IAM policy。有关创建策略的更多信息,请参阅 Creating IAM policies

  4. 在 IAM 控制台中,创建角色和信任关系,允许 Amazon Redshift 担任该角色。按照 IAM 文档中的说明为 AWS 服务创建角色(控制台)

    • 当系统要求选择 AWS 服务用例时,选择 “Redshift-可自定义”。

    • 当系统要求附加策略时,请选择您之前定义的策略。

    注意

    有关为亚马逊 Redshift 配置角色的更多信息,请参阅亚马逊 R edshift 文档中的授权亚马逊 Redshift 代表您访问其他 AWS 服务

  5. 在 Amazon Redshift 控制台中,将角色与您的 Amazon Redshift 集群关联。按照 Amazon Redshift 文档中的说明操作。

    在 Amazon Redshift 控制台中选择突出显示的选项,配置此设置:

    在 Amazon Redshift 控制台中何处管理 IAM 权限的示例。
注意

默认情况下, AWS Glue 任务会通过 Amazon Redshift 临时证书,这些证书是使用您为运行任务而指定的角色创建的。我们建议不使用这些凭证。出于安全考虑,这些凭证将在 1 小时后过期。

为 Glue 作业 AWS 设置角色

AWS Glue 任务需要一个角色才能访问 Amazon S3 存储桶。您不需要 Amazon Redshift 集群的 IAM 权限,您的访问权限由 Amazon VPC 中的连接和您的数据库凭证控制。

设置 Amazon VPC

设置 Amazon Redshift 数据存储访问权限
  1. 登录 AWS Management Console 并打开亚马逊 Redshift 控制台,网址为 https://console.aws.amazon.com/redshiftv2/。

  2. 在左侧导航窗格中,选择集群

  3. 选择要从 AWS Glue 访问的集群名称。

  4. Cluster Properties (集群属性) 部分,从 VPC security groups (VPC 安全组) 中选择一个安全组以允许 AWS Glue 使用。记录下所选的安全组名称以供将来参考。选择安全组将打开 Amazon EC2 控制台 Security Groups (安全组) 列表。

  5. 选择要修改的安全组并导航到入站选项卡。

  6. 添加一个自引用规则,以允许 AWS Glue 组件进行通信。具体来讲,添加或确认有一条类型All TCP 的规则,协议TCP端口范围包括所有端口,其具有与组 ID相同的安全组名。

    入站规则类似如下:

    类型 协议 端口范围 来源

    所有 TCP

    TCP

    0–65535

    database-security-group

    例如:

    自引用入站规则的示例。
  7. 同时也为出站流量添加一条规则。打开到所有端口的出站流量,例如:

    类型 协议 端口范围 目标位置

    所有流量

    ALL

    ALL

    0.0.0.0/0

    或创建一条 Type (类型)All TCPProtocol (协议)TCPPort Range (端口范围) 包括所有端口及其 Destination (目标) 具有与 Group ID (组 ID) 相同的安全组名称的自引用规则。如果使用 Amazon S3 VPC 终端节点,还可以添加 HTTPS 规则以访问 Amazon S3。为了允许从 V prefix-list-id PC 到 Amazon S3 VPC 终端节点的流量,需要在安全组规则中使用 s3-

    例如:

    类型 协议 端口范围 目标位置

    所有 TCP

    TCP

    0–65535

    security-group

    HTTPS

    TCP

    443

    s3-prefix-list-id

设置 AWS Glue

您需要创建一个提供 Amazon VPC 连接信息的 AWS Glue 数据目录连接。

要在控制台中配置 Amazon Redshift 亚马逊 VPC 与 Gl AWS ue 的连接
  1. 按照步骤创建 Data Catalog 连接:添加 AWS Glue 连接。创建连接后,保留连接名称 connectionName,以供下一步使用。

    • 选择连接类型时,请选择 Amazon Redshift

    • 选择 Redshift 集群时,按名称选择集群。

    • 为集群上的 Amazon Redshift 用户提供默认连接信息。

    • 您的 Amazon VPC 设置将自动配置。

    注意

    通过 AWS SDK 创建 Amazon Redshift 连接时,您需要手动为 Amazon VPC 提供 PhysicalConnectionRequirements

  2. 在你的 AWS Glue 作业配置中,提供 ConnectionName 作为附加网络连接。

示例:从 Amazon Redshift 表中读取

您可以从 Amazon Redshift 集群和 Amazon Redshift Serverless 环境中读取。

先决条件:您想读取的 Amazon Redshift 表。按照上一节中的步骤进行操作,配置 Redshift 连接之后您应该拥有临时目录、t emp-s3-dir 和 IAM 角色(账户中)的 Amazon S 3 URI。rs-role-namerole-account-id

Using the Data Catalog

其他先决条件:您要从中读取 Amazon Redshift 表的 Data Catalog 数据库和表。有关 Data Catalog 的更多信息,请参阅 AWS Glue 中的数据目录和爬网程序。为您的 Amazon Redshift 表创建条目后,您将识别出您与和的redshift-dc-database-name关联。redshift-table-name

配置:在函数选项中,您将使用 databasetable_name 参数标识数据目录表。您将使用 redshift_tmp_dir 标识 Amazon S3 临时目录。您还将rs-role-name使用additional_options参数中的aws_iam_role密钥提供。

glueContext.create_dynamic_frame.from_catalog( database = "redshift-dc-database-name", table_name = "redshift-table-name", redshift_tmp_dir = args["temp-s3-dir"], additional_options = {"aws_iam_role": "arn:aws:iam::role-account-id:role/rs-role-name"})
Connecting directly

其他先决条件:你需要你的 Amazon Redshift 表的名称(. redshift-table-name 您将需要存储该表的 Amazon Redshift 集群的 JDBC 连接信息。您将提供连接信息,包括主机端口redshift-database-name用户名密码

使用 Amazon Redshift 集群时,您可以从 Amazon Redshift 控制台检索连接信息。使用 Amazon Redshift Serverless 时,请参阅 Amazon Redshift 文档中的 Connecting to Amazon Redshift Serverless

配置:在函数选项中,您将使用 urldbtableuserpassword 参数标识连接参数。您将使用 redshift_tmp_dir 标识 Amazon S3 临时目录。您可以在使用 aws_iam_role 时使用 from_options 来指定 IAM 角色。语法类似于通过 Data Catalog 进行连接,但您可以将参数放在 connection_options 地图中。

将密码硬编码为 AWS Glue 脚本是不好的做法。考虑使用适用于 AWS Secrets Manager Python 的 SDK (Boto3) 将密码存储在脚本中,然后将其检索到脚本中。

my_conn_options = { "url": "jdbc:redshift://host:port/redshift-database-name", "dbtable": "redshift-table-name", "user": "username", "password": "password", "redshiftTmpDir": args["temp-s3-dir"], "aws_iam_role": "arn:aws:iam::account id:role/rs-role-name" } df = glueContext.create_dynamic_frame.from_options("redshift", my_conn_options)

示例:写入 Amazon Redshift 表

您可以写入 Amazon Redshift 集群和 Amazon Redshift Serverless 环境。

先决条件:一个 Amazon Redshift 集群并按照上一节中的步骤进行操作,配置 Redshift 连接之后您应该拥有临时目录、t emp-s3-dir 和 IAM 角色的 Amazon S 3 URI(在账户中 rs-role-name)。role-account-id您还需要想写入数据库的内容的 DynamicFrame

Using the Data Catalog

其他先决条件:您要对其写入的 Amazon Redshift 集群和表的 Data Catalog 数据库。有关 Data Catalog 的更多信息,请参阅 AWS Glue 中的数据目录和爬网程序。您将标识与的连接redshift-dc-database-name以及与的目标表redshift-table-name

配置:在函数选项中,您将使用 database 参数标识 Data Catalog 数据库,并为表提供 table_name。您将使用 redshift_tmp_dir 标识 Amazon S3 临时目录。您还将rs-role-name使用additional_options参数中的aws_iam_role密钥提供。

glueContext.write_dynamic_frame.from_catalog( frame = input dynamic frame, database = "redshift-dc-database-name", table_name = "redshift-table-name", redshift_tmp_dir = args["temp-s3-dir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/rs-role-name"})
Connecting through a AWS Glue connection

您可以使用 write_dynamic_frame.from_options 方法直接连接到 Amazon Redshift。但是,与其将连接详细信息直接插入脚本,不如使用 from_jdbc_conf 方法引用存储在 Data Catalog 连接中的连接详细信息。无需为数据库爬取或创建 Data Catalog 表,即可执行此操作。有关 Data Catalog 连接的更多信息,请参阅 连接到数据

其他先决条件:您要从中读取 Amazon Redshift 表的数据库的 Data Catalog 连接。

配置:您将识别与您的数据目录连接dc-connection-name。您将使用和来标识您的 Amazon Redshift 数据库和表。redshift-table-nameredshift-database-name您将使用 catalog_connection 提供 Data Catalog 连接信息,使用 dbtabledatabase 提供 Amazon Redshift 信息。语法类似于通过 Data Catalog 进行连接,但您可以将参数放在 connection_options 地图中。

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

Amazon Redshift 连接选项参考

用于所有 AWS Glue JDBC 连接的基本连接选项在所有 JDBC 类型中password都是一致的url,用于设置user和之类的信息。有关标准 JDBC 参数的更多信息,请参阅 JDBC 连接选项参考

Amazon Redshift 连接类型需要一些额外的连接选项:

  • "redshiftTmpDir":(必需)从数据库中复制时,可以用于暂存临时数据的 Amazon S3 路径。

  • "aws_iam_role":(可选)IAM 角色的 ARN。 AWS Glue 任务会将此角色传递给 Amazon Redshift 集群,以授予完成任务指令所需的集群权限。

AWS Glue 4.0+ 版本中提供了其他连接选项

你也可以通过 Glue 连接选项传递新的 Amazon Redshift 连接 AWS 器的选项。有关支持的连接器选项的完整列表,请参阅适用于 Apache Spark 的 Amazon Redshift 集成中的 Spark SQL 参数部分。

为方便起见,我们在此重申某些新选项:

名称 必需 默认值 描述

autopushdown

TRUE

通过捕获和分析 SQL 操作的 Spark 逻辑计划,应用谓词和查询下推。这些操作转换为 SQL 查询,然后在 Amazon Redshift 中运行以提高性能。

autopushdown.s3_result_cache

FALSE

缓存 SQL 查询以将 Amazon S3 路径映射的数据卸载到内存中,以便同一查询不需要在同一 Spark 会话中再次运行。仅在启用 autopushdown 时支持。

unload_s3_format

PARQUET

PARQUET — 以 Parquet 格式卸载查询结果。

TEXT — 以竖线分隔的文本格式卸载查询结果。

sse_kms_key

不适用

UNLOAD操作期间用于加密的 AWS SSE-KMS 密钥,而不是默认的加密密钥。 AWS

extracopyoptions

不适用

加载数据时附加到 Amazon Redshift COPY命令的额外选项列表,例如 TRUNCATECOLUMNSMAXERROR n(有关其他选项,请参阅 COPY: Optional 参数)。

请注意,由于这些选项附加到 COPY 命令的末尾,因此只能使用在命令末尾有意义的选项。这应该涵盖最有可能的使用案例。

cvsnullstring(实验)

NULL

使用 CSV tempformat 时要为空值写入的字符串值。这应该是一个不会出现在实际数据中的值。

这些新参数可以通过以下方式使用。

提高性能的新选项

新的连接器推出了一些新的性能改进选项:

  • autopushdown:默认情况下启用。

  • autopushdown.s3_result_cache:默认情况下禁用。

  • unload_s3_format:默认为 PARQUET

有关使用这些选项的信息,请参阅适用于 Apache Spark 的 Amazon Redshift 集成。我们建议您在进行混合读取和写入操作时不要开启 autopushdown.s3_result_cache,因为缓存的结果可能包含过时的信息。UNLOAD 命令的默认选项 unload_s3_format 设置为 PARQUET,以提高性能并降低存储成本。要使用 UNLOAD 命令的默认行为,请将该选项重置为 TEXT

新的读取加密选项

默认情况下,从 Amazon Redshift 表读取数据时,AWS Glue 使用的临时文件夹中的数据使用 SSE-S3 加密进行加密。要使用 AWS Key Management Service (AWS KMS) 中的客户托管密钥来加密您的数据,您可以设置密钥 ID 来自("sse_kms_key" → kmsKey)哪里 ksmKey AWS KMS,而不是AWS Glue版本 3.0 ("extraunloadoptions" → s"ENCRYPTED KMS_KEY_ID '$kmsKey'") 中的传统设置选项。

datasource0 = glueContext.create_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"sse_kms_key":"<KMS_KEY_ID>"}, transformation_ctx = "datasource0" )
支持基于 IAM 的 JDBC URL

新的连接器支持基于 IAM 的 JDBC URL,因此您无需传递用户/密码或密钥。通过基于 IAM 的 JDBC URL,连接器可使用作业运行时角色访问 Amazon Redshift 数据源。

步骤 1:将以下最低要求策略附加到您的 AWS Glue 作业运行时角色。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "redshift:GetClusterCredentials", "Resource": [ "arn:aws:redshift:<region>:<account>:dbgroup:<cluster name>/*", "arn:aws:redshift:*:<account>:dbuser:*/*", "arn:aws:redshift:<region>:<account>:dbname:<cluster name>/<database name>" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "redshift:DescribeClusters", "Resource": "*" } ] }

步骤 2:使用基于 IAM 的 JDBC URL,如下所示。使用您连接的 Amazon Redshift 用户名指定一个新选项 DbUser

conn_options = { // IAM-based JDBC URL "url": "jdbc:redshift:iam://<cluster name>:<region>/<database name>", "dbtable": dbtable, "redshiftTmpDir": redshiftTmpDir, "aws_iam_role": aws_iam_role, "DbUser": "<Redshift User name>" // required for IAM-based JDBC URL } redshift_write = glueContext.write_dynamic_frame.from_options( frame=dyf, connection_type="redshift", connection_options=conn_options ) redshift_read = glueContext.create_dynamic_frame.from_options( connection_type="redshift", connection_options=conn_options )
注意

DynamicFrame 目前在 GlueContext.create_dynamic_frame.from_options 工作流程中仅支持对 DbUser 使用基于 IAM 的 JDBC URL。

从 AWS Glue 版本 3.0 迁移到版本 4.0

在 AWS Glue 4.0 中,ETL 作业可以访问新的 Amazon Redshift Spark 连接器和具有不同选项和配置的新 JDBC 驱动程序。全新 Amazon Redshift 连接器和驱动程序在编写时充分考虑了性能,可保持数据的交易一致性。这些产品记录在 Amazon Redshift 文档中。有关更多信息,请参阅:

表/列名和标识符限制

新的 Amazon Redshift Spark 连接器和驱动程序对 Redshift 表名称的要求更为严格。有关更多信息,请参阅名称和标识符以定义您的 Amazon Redshift 表名称。作业书签工作流程可能不适用于不符合规则的表名和某些字符(例如空格)。

如果您的旧表的名称不符合名称和标识符规则,并且发现书签存在问题(作业正在重新处理旧的 Amazon Redshift 表数据),我们建议您重命名表名。有关更多信息,请参阅修改表示例

数据帧中的默认临时格式更改

在写入到 Amazon Redshift 时,AWS Glue 版本 3.0 Spark 连接器会将 tempformat 的默认值设置为 CSV。为了保持一致,在 AWS Glue 3.0 版中, DynamicFrame 仍会将 tempformat 的默认值设置为使用 CSV。如果您之前曾在 Amazon Redshift Spark 连接器上直接使用过 Spark Dataframe API,则可以在 DataframeReader/Writer 选项中将 tempformat 明确设置为 CSV。否则,tempformat 在新 Spark 连接器中默认为 AVRO

行为更改:将 Amazon Redshift 数据类型 REAL 映射到 Spark 数据类型 FLOAT,而不是 DOUBLE

在 AWS Glue 3.0 版本中,Amazon Redshift REAL 被转换为 Spark DOUBLE 类型。新的 Amazon Redshift Spark 连接器更新了行为,因此 Amazon Redshift REAL 类型可以转换为 Spark FLOAT 类型,然后从这一类型转换回来。如果您的旧用例仍希望将 Amazon Redshift REAL 类型映射到 Spark DOUBLE 类型,则可以使用以下解决方法:

  • 对于 DynamicFrame,使用 DynamicFrame.ApplyMappingFloat 类型映射到 Double 类型。对于 Dataframe,需要使用 cast

代码示例:

dyf_cast = dyf.apply_mapping([('a', 'long', 'a', 'long'), ('b', 'float', 'b', 'double')])