Amazon Redshift 是云中完全托管的、PB 级的数据仓库服务,可借助与您今天所用相同的基于 SQL 的工具和商业智能应用程序,提供快速查询性能。许多客户还喜欢将 Amazon Redshift 用作提取、转换和加载 (ETL) 引擎,以使用现有的 SQL 开发人员技能集,快速迁移预先存在的基于 SQL 的 ETL 脚本,并且由于 Amazon Redshift 完全兼容 ACID,作为合并来自源数据系统的变更数据的有效机制。在本文中,我将展示如何使用 AWS Step Functions 和 AWS Glue Python Shell 以完全无服务器的方式为那些基于 Amazon Redshift 的 ETL 工作流编排任务。AWS Glue Python Shell 是一个 Python 运行时环境,用于运行中小型 ETL 任务,例如提交 SQL 查询和等待响应。Step Functions 可让您将多个 AWS 服务协调到工作流中,从而可以轻松运行和监视一系列 ETL 任务。AWS Glue Python Shell 和 Step Functions 均无服务器,允许自动运行和扩展它们以响应定义的事件,而无需配置、扩展和管理服务器。尽管许多基于 SQL 的传统工作流都使用内部数据库结构(如触发器和存储过程),但将工作流编排、任务和计算引擎组件分离为独立的服务,使您可以独立开发、优化甚至重复使用每个组件。因此,尽管本博文以 Amazon Redshift 为例,但我的目的是更广泛地向您展示如何编排任何基于 SQL 的 ETL。
先决条件
如果您想使用自己的 AWS 帐户遵循本博文中的示例,则需要一个 Virtual Private Cloud (VPC),其至少具有两个到 S3 VPC 终端节点的路由的私有子网。
如果您没有 VPC,或者不确定您的 VPC 是否满足这些要求,我提供一个 AWS CloudFormation 模板堆栈,您可以通过选择以下按钮将其启动。在首页上提供堆栈名称,其他所有内容保留默认设置。等待堆栈显示创建完成(这只需要几分钟),然后转到其他部分。
场景
对于本文中的示例,我使用 Amazon Customer Reviews Dataset 数据集构建 ETL 工作流,该工作流完成了以下两个代表简单 ETL 过程的任务。
任务 1:将包含 2015 年及以后的评论的数据集的副本从 S3 移动到 Amazon Redshift 表。
任务 2:生成一组输出文件到另一个 Amazon S3 位置,该位置按市场和产品类别标识“最有用”的评论,从而使分析团队可以收集有关高质量评论的信息。
该数据集可通过 Amazon Simple Storage Service (Amazon S3) 存储桶公开获得。完成以下任务以进行设置。
解决方案概览
下图突出显示了端到端的解决方案架构:
此过程中的步骤如下:
状态机启动一系列运行的 AWS Glue Python Shell 作业(有关如何以及为何我稍后在本博文中使用单个作业的更多信息!),并带有用于从 AWS Secrets Manager 检索数据库连接信息和从 S3 检索 .sql 文件的参数。
AWS Glue Python Shell 作业每次运行时都使用数据库连接信息来连接到 Amazon Redshift 集群并提交.sql 文件中包含的查询。
对于任务 1:集群利用 Amazon Redshift Spectrum 从 S3 读取数据并将其加载到 Amazon Redshift 表中。Amazon Redshift Spectrum 通常用作将数据加载到 Amazon Redshift 的一种方式。(有关更多信息,请参阅 Amazon Redshift Spectrum 十二个最佳实践 的步骤 7。)
对于任务 2:集群执行聚合查询,然后通过 UNLOAD 将结果导出到另一个 Amazon S3 位置。
如果管道发生故障,状态机会将通知发送到 Amazon Simple Notification Service (SNS) 主题。
用户可以从集群查询数据和/或直接从 S3 检索报告输出文件。
我包括一个 AWS CloudFormation 模板以快速启动 ETL 环境,这样我可以将本博文重点放在专门用于构建任务和编排流程组件的步骤上。模板启动下列资源:
Amazon Redshift 集群
用于存储 Amazon Redshift 集群信息和凭证的 Secrets Manager 密钥
S3 存储桶已预加载 Python 脚本和 .sql 文件
AWS Glue Python Shell 作业的 Identity and Access Management (IAM) 角色
请参阅以下资源,了解如何手动完成这些步骤:
确保至少选择两个专用子网和相应的 VPC,如以下屏幕截图所示。如果您从上方使用 VPC 模板,则 VPC 显示为 10.71.0.0/16,子网名称为 A private 和 B private.。
堆栈应该需要 10-15 分钟才能启动。一旦显示 Create Complete,您可以继续进行下一部分。请确保注意 AWS CloudFormation 控制台中的 Resources 选项卡,如以下屏幕截图所示,因为我在整个帖子中都引用了这些资源。
本文转载自 AWS 技术博客。
评论