亚马逊AWS官方博客

使用 Amazon Redshift 设计数据湖架构的 ETL 和 ELT 模式:第 1 部分

在本系列文章的第 1 部分中,我们将讨论使用主要和短期 Amazon Redshift 集群构建可扩展 ETL(提取、转换、加载)和 ELT(提取、加载、转换)数据处理管道的设计的最佳实践。您还将了解一些重要的 Amazon Redshift 功能(例如 Amazon Redshift Spectrum并发扩展以及最近新增的对数据湖导出的支持)的相关用例。
在本系列文章的第 2 部分( 使用 Amazon Redshift 设计数据湖架构的 ETL 和 ELT 模式:第 2 部分)中,分步演练了如何在您的 ETL 和 ELT 用例中利用 Amazon Redshift。

ETL 和 ELT

将数据从源系统转移到数据仓库有两种常见的设计模式。两种模式之间的主要区别在于转换在数据处理管道中发生的时间点。这也确定了用于提取和转换数据的工具集,以及用于分析数据的底层数据结构、查询和优化引擎。第一种模式是 ETL,数据在加载到数据仓库之前完成转换。第二种模式是 ELT,在该模式中,数据先加载到数据仓库中,然后使用熟悉的 SQL 语法和大规模并行处理 (MPP) 架构的功能来在数据仓库内执行转换。

下面的第一张图表示 ETL,其中使用 Amazon EMR AWS Glue 上的 Apache Spark 或 Apache Hive 之类的工具在数据仓库外部执行数据转换。在该模式中,您可以选择偏好的数据转换工具。第二张图表示的是 ELT,其中数据转换引擎内置在数据仓库中,用于关系和 SQL 工作负载。这种模式之所以强大,是因为它利用了高度优化和可扩展的数据存储以及 MPP 架构的计算能力。

Redshift Spectrum

Amazon Redshift 是 AWS 上的一项完全托管型数据仓库服务。它采用分布式、MPP 和无共享架构。Redshift Spectrum 是 Amazon Redshift 的原生功能,使您能够使用 BI 应用程序和当前使用的 SQL 客户端工具,对数据湖中以开放文件格式存储的所有数据 (Amazon S3) 运行SQL查询。

常用模式为: 运行跨越 Amazon Redshift 本地存储的经常访问数据和经济高效地存储在 Amazon S3 中的数据的查询,对外部表使用无架构绑定的视图。这使您能够针对各种用例在整个集群和 S3 上独立扩展计算资源和存储。

Redshift Spectrum 支持多种结构化和非结构化文件格式,例如 Apache Parquet、Avro、CSV、ORC、JSON 等。由于 S3 中存储的数据采用开放文件格式,因此相同的数据可以用作您的单一事实来源,并且其他服务(例如 Amazon Athena、Amazon EMR 和 Amazon SageMaker)也可以直接从 S3 数据湖访问这些数据。

有关更多信息,请参阅 Amazon Redshift Spectrum 将数据仓库扩展到 EB 级别且无需加载

并发扩展

使用并发扩展,Amazon Redshift 可以自动灵活地扩展查询处理能力,为数百个并发查询提供一致的快速性能。并发扩展资源会随着并发性的增加在几秒钟内自动添加到您的 Amazon Redshift 集群中,以应对并发请求的突增,实现快速性能,无需等待。当工作负载需求减少时,Amazon Redshift 会自动关闭并发扩展资源以节省成本。

下图显示了并发扩展的工作原理:

有关更多信息,请参阅新增功能 – Amazon Redshift 并发扩展 – 始终保持巅峰性能

数据湖导出

Amazon Redshift 现在支持 Apache Parquet 格式(一种用于分析的高效开放式列式存储格式)将查询结果卸载到 S3 上的数据湖中。与文本格式相比,Parquet 格式的卸载速度最多快 2 倍,而在 S3 中占用的存储空间最多减少 6 倍。您还可以指定一个或多个分区列,以便将卸载的数据自动分区到 S3 存储桶中的文件夹中,以提高查询性能并降低下游使用卸载数据的成本。例如,您可以选择卸载市场营销数据并按年、月和日列对其进行分区。这使您的查询可以利用分区修整功能,并在按分区列筛选后跳过对不相关分区的扫描,从而提高查询性能并降低成本。有关更多信息,请参阅参数 UNLOAD

使用案例

您可以使用 Amazon Redshift 的部分或全部功能来满足数据管理和数据集成的需求。由于您的工作负载主要是关系型,熟悉 SQL 语法以及 MPP 架构的大规模可扩展性,因此随着 MPP 数据库的出现,您可能已从 ETL 过渡到 ELT 。

本节介绍了使用 Amazon Redshift 设计数据处理管道的 ELT 和 ETL 的常见用例。

ELT

我们以一个需要在少量关系和结构化的数据上进行标准 SQL 连接和聚合的批量数据处理工作负载为例。您最初选择了一个基于 Hadoop 的解决方案来满足您的 SQL 需求。但是,随着时间的流逝,随着数据量的不断增长,您的系统无法很好地扩展。现在,您会发现很难达到所需的性能 SLA 目标,并且随着硬件和维护成本不断增加。关系 型MPP 数据库在性能和成本方面具有优势,并通过让用户可以使用熟悉的 SQL查询,降低了处理数据的技术障碍。

Amazon Redshift 具有强大的可扩展性和完全托管的计算功能,可在 S3 中直接处理您的数据湖中的结构化和半结构化数据,因此具有显著优势。

下图显示了 Redshift Spectrum 如何利用 CTAS (Create Table As) 命令,将数据处理流程从四步简化到一步并实现加速。

在各种数据集成用例中,先前的架构可实现 Amazon Redshift 数据仓库解决方案与 S3 上托管企业数据集(例如 ERP、财务和第三方数据)现有的数据湖解决方案之间的无缝互操作性。

下图显示了 Amazon Redshift 和 S3 上的数据湖之间的无缝互操作性:

使用 ELT 模式时,在从本地数据仓库迁移到 Amazon Redshift 时,还可以使用现有的针对 ELT 优化的 SQL 工作负载。这样就无需从头开始将关系和复杂的 SQL 工作负载重写为新的计算框架。借助 Amazon Redshift,您可以使用熟悉的 SQL,借助高级和强大的 SQL 支持、简单性以及与现有 SQL 工具的无缝集成,高效地加载、转换和扩充数据。您还需要 Amazon Redshift 为集群提供的监控功能。

Warner Bros. Interactive Entertainment 是全球领先的互动空间娱乐内容出版商、开发商、授权商和发行商,跨所有平台(包括游戏主机、手持设备、手机和基于 PC)为内部和第三方游戏提供服务。“我们使用许多 AWS 和第三方分析工具,我们很高兴看到 Amazon Redshift 继续采用我们自己的解决方案已经使用的相同的各种数据转换模式,”Warner Bros. Analytics 分析营销运营技术总监 Kurt Larson 说道。“自 2017 年以来,我们就利用 Amazon Redshift 的 Redshift Spectrum 功能在整个数据湖中查询开放数据格式,现在有了新的 Redshift 数据湖导出功能,我们可以方便地将数据写回到我们的数据湖。即使在最高查询负载下,所有这些都以始终如一性能快速完成。我们期待着利用集成大数据堆栈的协同作用来推动跨 Amazon Redshift 集群的更多数据共享,并以更低的成本为我们的所有游戏带来更多价值。”

ETL

您需要以开放且分析优化的列式文件格式 (Parquet) 将 Amazon Redshift 的数据子集卸载回数据湖 (S3)。然后,您可以使用 Redshift Spectrum 以及其他 AWS 服务从数据湖查询卸载的数据集,例如,使用 Athena 进行临时和按需分析、使用 AWS Glue 和 Amazon EMR 进行 ETL 以及使用 Amazon SageMaker 进行机器学习。

您需要跨数据湖的多个业务流程共享一组精选指标(在 Amazon Redshift 中计算)的单个版本。您可以在 Amazon Redshift 中使用 ELT 计算这些指标,然后使用具有优化文件格式和分区的卸载操作在数据湖中卸载计算的指标。

您还需要使用熟悉的 SQL 在存储在数据湖 (S3) 冷存储中的大型数据集上,预先聚合一组最终用户经常请求的指标,然后将聚合的指标卸载到数据湖中以供下游使用。换言之,您需要一个短期的批处理工作负载,以对存储在 S3 中的大量关系和结构化冷数据进行标准的 SQL 联接和聚合。您可以通过建立一个或多个短期的 Amazon Redshift 集群来利用 Redshift Spectrum,以对 S3 中存储的数据执行所需的 SQL 转换、以优化的文件格式将转换后的结果卸载回 S3,然后在处理结束时终止不需要的 Amazon Redshift 集群。这样,您只需支付 Amazon Redshift 集群为工作负载提供支持期间的费用。

如下图所示,一旦将转换后的结果卸载到了 S3 中,您就可以使用 Redshift Spectrum 从数据湖中查询已卸载的数据(如果您已拥有 Amazon Redshift 集群);使用 Athena 的按使用付费和无服务器按需查询模型查询其中的数据;使用 AWS Glue 和 Amazon EMR 对卸载的数据执行 ETL 操作,以及与存储在数据湖中的其他数据集(例如 ERP、财务和第三方数据)进行数据集成;以及通过 Amazon SageMaker 利用这些数据进行机器学习。

您还可以使用 Amazon Redshift 的并发扩展功能来扩展卸载操作。这提供了一个可扩展且无服务器的选项,让您可以使用熟悉的 SQL 以开放的、分析优化的文件格式批量导出数据。

最佳实践

以下推荐做法可帮助您使用 Amazon Redshift 优化 ELT 和 ETL 工作负载。

分析需求以确定采用 ELT 还是 ETL

Amazon Redshift 的 MPP 架构及其 Spectrum 功能高效且专为大规模的大容量关系型和基于 SQL 的 ELT 工作负载(联接、聚合)而设计。使用 Amazon Redshift 设计高效的 ELT 解决方案的常见做法是花费足够的时间来分析以下内容:

  • 来自源系统的数据的类型(结构化、半结构化和非结构化)
  • 所需转换的性质(通常包括清理、扩充、协调、转换和聚合)
  • 逐行、基于光标的处理需求与批处理 SQL
  • 考虑了未来数据量增长的性能 SLA 和可扩展性要求
  • 解决方案的成本

这些有助于评估工作负载是否为关系型并且适合于 MPP 架构的 SQL。

ELT 的主要注意事项

对于 ELT 和 ELT 而言,重要的是建立一个良好的物理数据模型以在所有表上实现更好的性能,包括以适当的数据类型和分发方法暂存表。联接较少的维度数据模型(星型架构)最适合 MPP 架构,包括基于 ELT 的 SQL 工作负载。考虑将 临时表用于过渡的暂存表对于 ELT 流程来说是可行的,以获得更好的写入性能,因为临时表仅写入单个副本。

ELT 工作负载的通用经验法则是避免逐行、基于光标的处理(存储过程通常被忽略)。这不是最佳选择,因为此类处理需要在 Amazon Redshift 之类的 MPP 数据库的领导节点上进行。对于这种工作负载的建议是,寻找替代的分布式处理编程框架,例如 Apache Spark。

处理大量事务时,使用 MPP 架构无法成百上千地进行单条记录插入、更新和删除。而是要将这些记录作为批处理操作在表上暂存为批量 UPDATE 或 DELETE/INSERT。

借助 Redshift Spectrum 的外部表功能,您可以使用单个 SQL 优化转换逻辑,而不是先将数据加载到 Amazon Redshift 本地存储中以进行暂存,然后再对这些暂存表进行转换。

数据湖导出的主要注意事项

将数据从 Amazon Redshift 卸载到 S3 中的数据湖时,需要注意 Amazon Redshift 表中的数据倾斜或处理倾斜。UNLOAD 命令在集群中的切片上并行处理。因此,如果存在静态数据倾斜或运行时处理倾斜,则 S3 上的已卸载文件可能具有不同的文件大小,这会影响您的 UNLOAD 命令的响应时间和下游对数据湖中已卸载数据的查询的响应时间。

为了最大程度地提高查询性能,Amazon Redshift 尝试创建32 MB或以上行组的 Parquet 文件。您指定的 MAXFILESIZE 值将自动舍入为的最接近的 32 MB 的倍数。例如,如果您指定 MAXFILESIZE 为 200 MB,则每个卸载的 Parquet 文件大约为 192 MB(32 MB 行组 x 6 = 192 MB)。要确定最佳文件大小以提高性能,以便下游使用卸载的数据,这取决于您选择的工具。如果选择 Redshift Spectrum 作为查询已卸载 Parquet 数据的首选工具,则 32 MB 行组和 6.2 GB 默认文件大小将提供良好的性能。此外,Redshift Spectrum 可能会将大型文件的处理分为多个 Parquet 文件请求,以提高性能。同样,如果您选择的工具是 Amazon Athena 或其他 Hadoop 应用程序,则最佳文件大小可能会根据查询模式的并行性和数据量而有所不同。无论选择哪种工具,我们都建议您避免使用太多 KB级别的小文件。同样,对于 S3 分区,通常的做法是使 S3 上每个表的分区数最多为数百个。您可以通过选择低基数分区列(例如年、季度、月和日)作为 UNLOAD 命令的一部分来做到这一点。

要使并行运行的多个 UNLOAD 命令在并发下获得最佳吞吐量和性能,可在启用并发扩展的情况下为卸载查询创建单独的队列。这样,Amazon Redshift 可以根据需要短时间内迅速增加并发扩展集群。

将 Redshift Spectrum 用于 ELT 的主要注意事项

为了从 Redshift Spectrum 中获得最佳性能,请在查询计划中注意最大可能的下推操作,例如 S3 扫描、投影、筛选和聚合,以提高性能。这是因为您需要利用支持 Redshift Spectrum 的强大的基础设施。利用谓词下推还能够避免消耗 Amazon Redshift 集群中的资源。

此外,应避免在多列上使用 DISTINCT 或 ORDER BY 之类的复杂操作,并在适用时将其替换为 GROUP BY。Amazon Redshift 可以将单列 DISTINCT 作为 GROUP BY 下推到 Spectrum 计算层(具有查询重写功能),而多列 DISTINCT 或 ORDER BY 操作需要在 Amazon Redshift 集群内进行。

Amazon Redshift 优化器可使用外部表统计生成更好的执行计划。没有统计,执行计划将在假设 S3 表格是相对较大的前提下基于启发式算法生成。建议手动为 S3 外部表设置表统计 (numRows)。

有关 Amazon Redshift Spectrum 最佳实践的更多信息,请参阅 Amazon Redshift Spectrum 的十二个最佳实践以及如何在 Amazon S3 中为 AWS KMS 加密的数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询

小结

本文讨论了使用 Amazon Redshift 的一些关键功能(包括 Spectrum、并发扩展以及最近发布的对具有分区功能的数据湖导出的支持)为数据湖架构构建 ELT 和 ETL 数据处理管道的常见用例和设计最佳实践。

在本系列文章的第 2 部分(使用 Amazon Redshift 设计数据湖架构的 ETL 和 ELT 模式:第 2 部分)中,我们将通过使用 AWS 示例数据集分步演练一些简单的用例,以展示如何开始利用 Amazon Redshift。

与往常一样,AWS 欢迎反馈。欢迎在评论中提出想法或问题。

 


关于作者

Asim Kumar Sasmal 是 AWS 专业服务部 Global Specialty Practice 的 IoT 高级数据架构师。他通过在 AWS 平台上提供专家技术咨询、最佳实践指导和实施服务,帮助 AWS 全球客户设计和构建数据驱动型解决方案。他热衷于从客户的要求出发进行逆向工作,帮助他们从大处着眼,并进行深入了解,以利用 AWS 平台的力量解决实际业务问题。
Maor Kleider 是快速、简单、经济高效的数据仓库 Amazon Redshift 的首席产品经理。Maor 热衷于与客户和合作伙伴之间的合作,了解他们独特的大数据用例并进一步改善其体验。在空闲时间,Maor 喜欢与家人一起旅行和探索新美食。