AWS Glue:SQL Server 多个分区数据库 ETL 到 Redshift

Posted

技术标签:

【中文标题】AWS Glue:SQL Server 多个分区数据库 ETL 到 Redshift【英文标题】:AWS Glue: SQL Server multiple partitioned databases ETL into Redshift 【发布时间】:2018-01-17 17:26:32 【问题描述】:

我们的团队正在尝试在 Redshift 中创建一个 ETL,作为我们用于某些报告的数据仓库。我们正在使用 Microsoft SQL Server,并将我们的数据库划分为 40 多个数据源。我们正在寻找一种能够将来自所有这些相同数据源的数据通过管道传输到 1 个 Redshift DB 的方法。

查看 AWS Glue 似乎无法实现这一点。由于他们打开了工作脚本供开发人员编辑,我想知道是否有其他人有过循环多个数据库并将同一个表传输到单个数据仓库的经验。我们正在努力避免自己必须为每个数据库创建一个作业...除非我们可以以编程方式循环并为每个数据库创建多个作业。

我们还研究了 DMS,它有助于将架构和当前数据转移到 redshift,但它似乎也不适用于多分区数据源问题。

【问题讨论】:

我的一些同事遇到了类似的问题,在对 Amazon Glue 没有印象后,他们最终使用了 Matillion。但是我认为他们必须做一些奇特的逻辑来合并来自多个数据库的数据。 @ColdSolstice 感谢您提供信息,很遗憾听到他们无法使用 Amazon Glue,但我一定会研究 Matillion。您是否知道他们是否将此解决方案不仅仅用于数据迁移,并且将其用作数据仓库来持续进行管道传输? SQL Server 也支持分区列存储。您确定需要新数据库而不是更好的架构吗? 40 个数据源是什么意思?为什么不是单个数据仓库?为什么不使用星型模式和列存储? @LucaKlaassen 1st) 我们在谈论多少数据?为什么在 RAID 阵列、OLAP 多维数据集或列存储中使用 40 个服务器而不是更多磁盘? 2nd) SQL Server 自 2000 年以来支持联合视图。您可以拥有一个引用其他表的视图,只要它们具有适当的约束,优化器就会知道向适当的链接表询问数据。 @LucasKlaassen 另一方面,联想发布了单实例 10TB 数据仓库 almost 2 years ago 的 TPC-H 结果。你有多少数据?在该范围内,Redshift 将花费 $10K-$55K per year 【参考方案1】:

这听起来像是 Matillion ETL for Redshift 的绝佳用例。

(完全披露:我是 Matillion ETL for Redshift 的产品经理)

Matillion 是一个 ELT 工具 - 它会从您的(众多)SQL 服务器数据库中提取数据,并通过高效的 Redshift COPY 将它们加载到一些临时表中(可以以通常的方式存储在 Redshift 中,也可以是在 S3 上保存并通过 Spectrum 从 Redshift 访问)。从那里,您可以将转换作业添加到清理/过滤/加入(以及更多!)为您的报告用户提供可查询的星型模式。

如果您的 40 多个数据库上的表架构非常相似(您的问题没有说明您如何将数据分解到这些服务器中 - 水平或垂直),您可以参数化作业中的连接详细信息并使用迭代来在每个源数据库上运行它们,可以是串行的,也可以是一定程度的并行。

将转换下推到 Redshift 效果很好,因为所有这些转换查询都可以利用大规模并行、可扩展的计算架构的强大功能。工作负载管理配置可用于确保 ETL 和用户查询可以同时发生。

此外,您可能希望在 Redshift 集群中混搭其他数据源,Matillion 支持更多 - 请参阅 https://www.matillion.com/etl-for-redshift/integrations/。

【讨论】:

【参考方案2】:

您可以为此使用 AWS DMS。

步骤:

    设置和配置 DMS 实例 为 redshift 设置目标端点 为每个 sql server 实例设置源端点,请参阅 https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.html 为每个sql server源设置任务,可以指定表 复制/同步,您可以使用转换来指定 您要写入 redshift 上的哪个模式名称。

然后,您将在 redshift 上拥有相同架构中的所有数据。

如果您想同时查询所有这些,您可以通过在 redsshift 中运行一些转换代码来组合并创建新表来实现。或者您可以使用视图。

【讨论】:

Redshift 擅长聚合查询,而不是 ETL。如果您必须在 Redshift 中执行转换,性能将非常很差。 错了,Redshift 在许多 ETL 任务上都表现出色。如果您有 ETL 运行以及其他用途,则必须整理 WLM。 错了,除非您想购买更大的集群来将 Redshift 视为临时数据库。转换表示specify which schema name(s) on redshift you want to write to .这意味着合并数据、清理、删除坏行、拆分或合并列,直到您将数据带到适合您的业务案例的形式,通常是报告。如果你有少量的数据,你不能零碎地做,它必须以流的方式完成——这就是为什么 T 在 L 之前。否则你在谈论 ELT - 提取负载变换。 显然会增加资源使用,但这种模式很好! - 看我上面的评论 - 如果你想要一些证据,研究 matillion 在这个领域的成功。 我认为 Matillion 不会像您认为的那样做。它不执行inside Redshift 的转换,即使用SQL 查询。它也不是世界上第一个 ETL 产品。所有人都做类似的工作,都面临同样的限制。 eTl 工具从流中的源加载数据,在数据通过时对其进行转换,然后将其发送到输出。例如,all 中的 Aggregate 转换必须缓存数据。 Distinct 也是如此,这就是它们昂贵的原因

以上是关于AWS Glue:SQL Server 多个分区数据库 ETL 到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue 不检测分区并在目录中创建 1000 多个表

连接到 SQL Server 实例 AWS Glue

使用 AWS Glue Scala 查询 Athena(添加分区)

如何使用 AWS Glue Crawler 读取 PostgreSQL 表分区?

AWS Glue Crawler 为每个分区添加表?

AWS Glue - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列