ETL + 在 Redshift 和 Dynamodb 之间同步数据
ETL + sync data between with Redshift and Dynamodb
我需要将来自 DynamoDB 的数据聚合到 AWS Redshift,并且我需要准确且同步。对于 ETL,我计划使用 DynamoDB Streams、Lambda 转换、Kinesis Firehorse,最后使用 Redshift。
更新数据的过程如何?我发现它都针对 ETL 进行了微调。哪个应该是保持两者(Dynamo 和 Redshift)同步的最佳选择?
这些是我当前的选择:
- 触发直接从 Lambda 到 Redshift 的“UPDATE”命令(阻塞)。
- 聚合所有 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 非常有用。
我需要将来自 DynamoDB 的数据聚合到 AWS Redshift,并且我需要准确且同步。对于 ETL,我计划使用 DynamoDB Streams、Lambda 转换、Kinesis Firehorse,最后使用 Redshift。
更新数据的过程如何?我发现它都针对 ETL 进行了微调。哪个应该是保持两者(Dynamo 和 Redshift)同步的最佳选择?
这些是我当前的选择:
- 触发直接从 Lambda 到 Redshift 的“UPDATE”命令(阻塞)。
- 聚合所有 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 非常有用。