ETL + 在 Redshift 和 Dynamodb 之间同步数据

ETL + sync data between with Redshift and Dynamodb

我需要将来自 DynamoDB 的数据聚合到 AWS Redshift,并且我需要准确且同步。对于 ETL,我计划使用 DynamoDB Streams、Lambda 转换、Kinesis Firehorse,最后使用 Redshift。

更新数据的过程如何?我发现它都针对 ETL 进行了微调。哪个应该是保持两者(Dynamo 和 Redshift)同步的最佳选择?

这些是我当前的选择:

  1. 触发直接从 Lambda 到 Redshift 的“UPDATE”命令(阻塞)。
  2. 聚合所有 update/delete 记录并“以某种方式”每小时处理一次。

有这方面的经验吗?也许 Redshift 不是最好的解决方案?我需要提取聚合数据以对 2 TB 数据进行报告/仪表板显示。

Redshift COPY 命令支持使用 DyanmoDB table 作为数据源。这可能是也可能不是您的情况的可能解决方案,因为此过程存在一些限制。数据类型和 table 命名差异可能会让您感到困惑。这也不是增量更新的好选择,但如果数据量很小并且您可以设计更新 SQL.

另一种查看 DynamoDB Stream 的方法。这将通过 Kinesis 路由数据更新,这可用于以合理的速度更新 Redshift。这有助于保持这些数据库之间的数据同步。这可能会使数据尽快可用于 Redshift。

请记住,您不会让 Redshift 逐时匹配。这就是你所说的“同步”吗?这些是非常不同的数据库,具有非常不同的用例和架构来支持这些用例。 Redshift 处理大块数据变化的速度比 DynamoDB 中通常发生的变化要慢。将以“块”的形式更新 Redshift,这比在 DynamoDB 上发生的频率更低。我已经让系统将其降低到 5 分钟的间隔,但是 10-15 分钟的更新间隔是大多数尝试保持仓库同步的地方。

另一种选择是不经常(每小时?)更新 Redshift 并使用联合查询将“最新”数据与存储在 Redshift 中的“较旧数据”结合起来。这是一个更复杂的解决方案,可能意味着更改您的数据模型以支持但可行。因此,只有在您确实需要查询最新数据以及更旧和更大的数据时才去这里。

最合适的答案是使用 Staging table 和 UPSERT 操作(或它的 Redshift 解释)。

我发现答案对我的用例有效时:

  • 尽可能使 Redshift 保持最新,而不会导致阻塞。
  • 能够使用复杂的 DynamoDB 架构,因此它们不能直接用作源,并且必须转换数据以适应 Redshift DDL。

这是架构:

所以我们不断地使用相同的 COPY 机制从 Kinesis 加载,但我们使用暂存机制而不是直接加载到最终 table。将批次加载到暂存区后,我们会在两个 table 之间寻找重复项。在执行插入之前,最终 table 上的那些重复项将被删除。

尝试此操作后,我发现如果包含在一个唯一的事务中,则对同一批次的所有 DELETE 操作执行得更好。此外,需要 VACUUM 操作以重新平衡新负载。

有关 UPSERT 操作的更多详细信息,我发现 this source 非常有用。