在 Amazon Redshift 上实现数据仓库解决方案

作者:Seshadri Senthamaraikannan 和 Mohamed Hamdy,发表于 2023 年 11 月 17 日,于 Amazon Redshift 版块。

重点概述

在本文中,我们将讨论如何在 Amazon Redshift 中使用 dbt (Data Build Tool) 实现一个成本效益高的数据仓库解决方案。dbt 提供了一个结构化的框架,方便数据分析、转换和调度,这使得数据工程师能够更加高效地管理数据流程。本文探讨了设定 dbt、使用 Docker、以及将其与 AWS Fargate 和 Amazon Elastic Container Registry 结合的方法,通过提供清晰的步骤和范例来指导读者实现整体架构。

重要信息

Amazon Redshift 是一种基于大规模并行处理MPP架构的云数据仓库服务,提供高性能的分析处理能力。数据管道的建立与维护是所有企业面临的普遍挑战,包括管理 SQL 文件、团队间的合作、软件工程原则的实施以及外部工具的引入。

dbt 的运作方式

dbt 提供了一个名为 dbtredshift 的适配器模组,能够与 Amazon Redshift 进行连接与操作。所有连接配置都存储在 profilesyml 文件中,并建议将凭证保存在 AWS Secrets Manager 中以便安全取用。

profilesyml 范例

yamlSampleProject target dev outputs dev type redshift host {{ envvar(DBTHOST) }} user {{ envvar(DBTUSER) }} password {{ envvar(DBTPASSWORD) }} port 5439 dbname {{ envvar(DBTDBNAME) }} schema dev threads 4 keepalivesidle 240 # 默认240秒 connecttimeout 10 # 默认10秒 sslmode require ra3node true

解决方案概览

接下来的图示展示我们的解决方案架构。

工作流程

工作流程包含以下步骤:

使用开源的 dbtredshift connector 创建我们的 dbt 项目,包括所有必要的模型、快照、测试、宏和配置档。创建 Docker 映像并推送至 ECR 存储库。通过 Fargate 以 ECS 任务运行 Docker 映像,并通过 AWS Step Functions 进行触发,Redshift 凭证存储于 Secrets Manager 中,由 ECS 任务使用连接。在执行期间,dbt 将所有模型、快照、测试和宏转换为符合 Amazon Redshift 的 SQL 语句,并根据内部数据沿革图进行调度,这些 SQL 命令会直接在 Redshift 集群上运行,因此工作负载将直接推向 Amazon Redshift。当执行完成后,dbt 将生成一组 HTML 和 JSON 文件,用于展示 dbt 文档,描述数据目录、编译的 SQL 语句、数据沿革图等信息。

前提条件

在开始之前,您需要满足以下条件:

了解 dbt 的基本原则与实施步骤。AWS 帐户,并赋予用户角色以访问所使用的 AWS 服务。Security Groups 允许 Fargate 访问 Redshift 集群及 Secrets Manager。一个 Redshift 集群。有关创建的指导,请参考 创建集群。一个 ECR 存储库:有关创建的指导,请参考 创建私有存储库。一个 Secrets Manager 密钥,包含所有连接 Amazon Redshift 的凭证包括主机、端口、数据库名、用户名和密码。有关更多信息,请参阅 创建 AWS Secrets Manager 数据库密钥。一个 Amazon S3 桶,用于承载文档文件。

创建 dbt 项目

我们将使用 dbt CLI,因此所有命令都在命令行中运行。请先安装 pip,如果尚未安装,请参考 安装指导。

创建 dbt 项目的步骤:

安装所需的 dbt 套件:pip install dbtredshift

使用 dbt init ltprojectnamegt 命令初始化 dbt 项目,会自动创建所有模板文件夹。

添加所有所需的 DBT 工件。 参考 dbtredshiftetlpattern 仓库,它包含一个参考的 dbt 项目。要深入了解如何构建项目,请参见 有关 dbt 项目 的信息。

在参考项目中,我们实现了以下功能:

一元机场网站使用增量模型的 SCD 类型 1。使用快照的 SCD 类型 2。Seed 查找文件。用于添加可重用代码的宏。用于分析输入数据的测试。

Python 脚本已准备好从 Secrets Manager 获取所需的凭证以访问 Amazon Redshift。参考 exportredshiftconnectionpy。

准备 rundbtsh 脚本以顺序运行 dbt 流水线,该脚本放置在 dbt 项目的根文件夹中,如下示例所示:

bash

导入所需的外部库

dbt deps profilesdir projectdir

基于 seed 文件创建表格

dbt seed profilesdir projectdir

运行所有模型文件

dbt run profilesdir projectdir

运行所有快照文件

dbt snapshot profilesdir projectdir

运行所有准备好的内部和自定义测试案例

dbt test profilesdir projectdir

生成 dbt 文档文件

dbt docs generate profilesdir projectdir

将 dbt 输出复制到 S3 桶 用于托管

aws s3 cp recursive exclude= include=json include=html dbt/target/ s3///REDSHIFTPOC/

在 dbt 项目文件夹的上层目录中创建 Docker 文件,此步骤将构建要推送到 ECR 存储库的 dbt 项目的映像。

dockerfileFROM python3

ADD dbtsrc /dbtsrc

RUN pip install U pip

安装 DBT 库

RUN pip install nocachedir dbtcoreRUN pip install nocachedir dbtredshiftRUN pip install nocachedir boto3RUN pip install nocachedir awscli

WORKDIR /dbtsrcRUN chmod R 755 ENTRYPOINT [ /bin/sh c ]CMD [/rundbtsh]

将映像上传至 Amazon ECR 并作为 ECS 任务运行

将映像推送至 ECR 存储库的步骤如下:

获取身份验证令牌并通过 Docker 客户端对您的注册表进行身份验证: bash aws ecr getloginpassword region ltregionnamegt docker login username AWS passwordstdin ltrepositorynamegt

使用以下命令构建您的 Docker 映像: bash docker build t ltimage taggt

构建完成后,为您的映像打标签,以便可以推送到注册表: bash docker tag ltimage taggtlatest ltrepositorynamegtlatest

以以下命令将映像推送到 AWS 注册表: bash docker push ltrepositorynamegt/ltimage taggtlatest

在 Amazon ECS 控制台上,创建一个以 Fargate 作为基础设施选项的集群。

提供所需的 VPC 和子网信息。创建集群后,创建一个 ECS 任务并将创建的 dbt 映像分配为任务定义。在网络部分,选择您的 VPC、子网和安全组以连接 Amazon Redshift、Amazon S3 和 Secrets Manager。

这个任务将触发 rundbtsh 流水线脚本,并依次运行所有 dbt 命令。当脚本执行完成后,我们可以在 Amazon Redshift 中查看结果,并将文档文件推送至 Amazon S3。

您可以通过 Amazon S3 静态网站托管来承载文档,相关信息请参考 使用 Amazon S3 托管静态网站。最后,您可以在 Step Functions 中将此任务作为 ECS 任务运行,按需安排作业,更多信息请参见 使用 Step Functions 管理 Amazon ECS 或 Fargate 任务。

dbtredshiftetlpattern 仓库现在拥有所有所需的代码示例。

在 AWS Fargate 上执行 dbt 任务的最低运营成本约为每月 15 美元 (参考 成本计算器)。

清理

请按照以下步骤清理资源:

删除您创建的 ECS 集群。删除您为存储映像文件创建的 ECR 存储库。删除您创建的 Redshift 集群。删除存储在 Secrets Manager 中的 Redshift 凭证。

结论

本文介绍了如何通过在 Amazon ECS 中使用 Fargate 实现一个成本效益高的 dbt 与 Amazon Redshift 的集成。我们描述了基础设施和配置设置的关键要素,并提供了示例项目来帮助读者掌握整个架构。这种架构能够帮助您充分利用 dbt 框架的优势来管理您在 Amazon Redshift 中的数据仓库平台。

有关 dbt 宏和模型的更多信息,请参考以下 GitHub 仓库。在接下来的文章中,我们将探讨可在 Amazon Redshift 中使用 dbt 框架实现的传统提取、转换和加载 (ETL) 模式。希望您能在您的帐户中测试此解决方案,并在评论中提供反馈或建议。

关于作者

Seshadri Senthamaraikannan 是 AWS 专业服务团队的数据架构师,驻伦敦,英国。他在数据分析方面具有丰富的经验,专注于为客户构建创新和可扩展的 AWS 云解决方案,以达成其业务目标。业余时间,他喜欢和家人共度时光并参加运动。

使用 dbt 在 Amazon Redshift 上实现数据仓库解决方案 大数据博客

Mohamed Hamdy 是AWS 专业服务部门的高级大数据架构师,驻伦敦,英国。他在架构、领导和构建数据仓库及大数据平台方面拥有超过 15 年的经验,帮助客户通过云采用之旅开发大数据及分析解决方案,以加速业务成果。在工作之余,Mohamed 喜欢旅行、跑步、游泳和打壁球。