【问题标题】:ETL + sync data between with Redshift and DynamodbETL + 在 Redshift 和 Dynamodb 之间同步数据
【发布时间】:2021-03-27 05:26:00
【问题描述】:

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

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

这些是我目前的选择:

  1. 直接从 Lambda 触发“更新”命令到 Redshift(阻塞)。
  2. 汇总所有更新/删除记录并“以某种方式”每小时处理一次。

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

【问题讨论】:

    标签: aws-lambda amazon-dynamodb amazon-redshift etl amazon-kinesis-firehose


    【解决方案1】:

    Redshift COPY 命令支持使用 DyanmoDB 表作为数据源。在您的情况下,这可能是也可能不是可能的解决方案,因为此过程存在一些限制。数据类型和表命名差异可能会让您大吃一惊。此外,这对于增量更新不是一个很好的选择,但如果数据量很小并且您可以设计更新 SQL,则可以这样做。

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

    请记住,您不会让 Redshift 逐时匹配。这就是你所说的“同步”吗?这些是非常不同的数据库,具有非常不同的用例和架构来支持这些用例。 Redshift 在大块数据中的工作比在 DynamoDB 中通常发生的变化要慢。将在“块”中更新 Redshift,这比在 DynamoDB 上发生的频率更低。我已经将系统设置为 5 分钟间隔,但 10-15 分钟更新间隔是在尝试保持仓库同步时最常见的结果。

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

    【讨论】:

    • 感谢您的回答@Bill-Weiner。通过同步,我的意思是让 redshift 端的聚合保持最新,因此当一条记录在 dynamo 上被删除或更新时,我可以在 Redshift 上反映该更改。据我了解,这无法通过使用 COPY 命令来完成。另外,我不能直接使用发电机作为源,因为我使用的是地图结构。
    • 我明白了,您希望将维度信息的不常见变化快速推送到 Redshift。可以在相关表上设置 DynamoDB 流,并在它们发生变化时触发 Lambda 函数。此 Lambda 可以启动将更改的数据移动到 Redshift。这更接近您的用例吗?
    • 是的,这将接近用例。也类似于我的选项 1。我也很惊讶从 Lambda 连接是 AWS 中的最佳解决方案,我期待类似 Kinesis 流的更新,或类似的东西,但似乎不可能!
    • 看起来你已经拼凑起来了 - DDB Streams -> Lambda -> Kinesis -> Redshift
    【解决方案2】:

    最适合的答案是使用带有 UPSERT 操作的暂存表(或对其进行 Redshift 解释)。

    我发现答案在我的用例中有效:

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

    这是架构:

    因此,我们不断地使用相同的 COPY 机制从 Kinesis 加载,但我们不是直接加载到决赛桌,而是使用暂存机制。一旦批处理加载到暂存中,我们就会在两个表之间寻找重复项。在执行 INSERT 之前,最终表上的那些重复项将被删除。

    尝试此操作后,我发现同一批次的所有 DELETE 操作如果包含在唯一事务中,性能会更好。此外,还需要 VACUUM 操作来重新平衡新负载。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-02
      • 2017-01-16
      • 2017-03-13
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      相关资源
      最近更新 更多