Aws lambda ETL+;使用红移和Dynamodb在之间同步数据

Aws lambda ETL+;使用红移和Dynamodb在之间同步数据,aws-lambda,amazon-dynamodb,amazon-redshift,etl,amazon-kinesis-firehose,Aws Lambda,Amazon Dynamodb,Amazon Redshift,Etl,Amazon Kinesis Firehose,我需要将来自DynamoDB的数据聚合到AWS Redshift,并且我需要准确和同步。对于ETL,我计划使用DynamoDB流、Lambda变换、Kinesis Firehorse,最后是红移 更新数据的过程如何?我发现它只是为ETL做了微调。哪一个应该是保持两者(迪纳摩和红移)同步的最佳选择 以下是我目前的选择: 直接从Lambda到Redshift触发“UPDATE”命令(阻塞) 汇总所有更新/删除记录,并“以某种方式”每小时对其进行处理 有这方面的经验吗?也许红移不是最好的解决方案?我需

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

更新数据的过程如何?我发现它只是为ETL做了微调。哪一个应该是保持两者(迪纳摩和红移)同步的最佳选择

以下是我目前的选择:

  • 直接从Lambda到Redshift触发“UPDATE”命令(阻塞)
  • 汇总所有更新/删除记录,并“以某种方式”每小时对其进行处理

  • 有这方面的经验吗?也许红移不是最好的解决方案?我需要提取聚合数据,以便在2 TB的数据上报告/仪表板。

    红移复制命令支持使用DyanmoDB表作为数据源。在您的情况下,这可能是也可能不是一个可行的解决方案,因为此过程存在一些限制。数据类型和表命名差异可能会使您感到困惑。另外,对于增量更新来说,这不是一个很好的选择,但是如果数据量很小,并且您可以设计更新SQL,那么可以这样做

    查看DynamoDB流的另一条路线。这将通过运动传递数据更新,并可用于以合理的速率更新红移。这有助于保持这些数据库之间的数据同步。这可能会使数据尽快用于红移

    请记住,您不会让红移以时刻为基础进行匹配。这就是你所说的“同步”吗?这些是非常不同的数据库,具有非常不同的用例和体系结构来支持这些用例。红移在大块数据中工作,其变化速度比DynamoDB中通常发生的要慢。在“块”中会有红移更新,其发生频率比在DynamoDB上更为罕见。我已经制作了一些系统,将更新时间间隔缩短到5分钟,但当试图保持仓库同步时,10-15分钟的更新时间间隔是大多数更新时间的结束时间


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

    红移复制命令支持使用DyanmoDB表作为数据源。在您的情况下,这可能是也可能不是一个可行的解决方案,因为此过程存在一些限制。数据类型和表命名差异可能会使您感到困惑。另外,对于增量更新来说,这不是一个很好的选择,但是如果数据量很小,并且您可以设计更新SQL,那么可以这样做

    查看DynamoDB流的另一条路线。这将通过运动传递数据更新,并可用于以合理的速率更新红移。这有助于保持这些数据库之间的数据同步。这可能会使数据尽快用于红移

    请记住,您不会让红移以时刻为基础进行匹配。这就是你所说的“同步”吗?这些是非常不同的数据库,具有非常不同的用例和体系结构来支持这些用例。红移在大块数据中工作,其变化速度比DynamoDB中通常发生的要慢。在“块”中会有红移更新,其发生频率比在DynamoDB上更为罕见。我已经制作了一些系统,将更新时间间隔缩短到5分钟,但当试图保持仓库同步时,10-15分钟的更新时间间隔是大多数更新时间的结束时间


    另一个选项是不经常(每小时?)更新红移,并使用联合查询将“最近”的数据与存储在红移中的“旧数据”组合起来。这是一个更复杂的解决方案,可能意味着对您的数据模型进行更改以支持但可行。因此,只有当您真的需要查询最新的数据以及更旧、更大的数据时,才转到这里。

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

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

    • 在不造成阻塞的情况下,尽可能使红移保持最新
    • 能够使用复杂的DynamoDB模式,因此它们不能直接用作源,必须转换数据以适应Redshift DDL
    这就是架构:

    因此,我们使用相同的复制机制不断地从Kinesis加载,但是我们使用了一个暂存机制,而不是直接加载到最终的表。将批加载到staging后,我们将在两个表之间查找重复项。在执行插入之前,将删除最终表格上的重复项

    在尝试了这一点之后,我发现如果将同一批上的所有删除操作封装在一个唯一的事务中,那么它们的性能会更好。此外,需要进行操作以重新平衡新负载


    关于UPSERT操作的更多细节,我发现非常有用。

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

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

    • 在不造成阻塞的情况下,尽可能使红移保持最新
    • 能够使用复杂的DynamoDB模式,因此它们不能直接用作源,必须转换数据以适应Redshift DDL
    这就是架构:

    因此,我们使用相同的复制机制不断地从Kinesis加载,但是我们使用了一个暂存机制,而不是直接加载到最终的表。将批加载到staging后,我们将在两个表之间查找重复项。在执行插入之前,将删除最终表格上的重复项

    尝试此操作后,我发现同一批上的所有删除操作