Amazon dynamodb 使用Flink在DynamoDB表中聚合电影租赁信息

Amazon dynamodb 使用Flink在DynamoDB表中聚合电影租赁信息,amazon-dynamodb,aggregate,apache-flink,flink-streaming,amazon-dynamodb-streams,Amazon Dynamodb,Aggregate,Apache Flink,Flink Streaming,Amazon Dynamodb Streams,祝大家节日快乐 tl;dr:我需要聚合存储在一个DynamoDB表中的电影租赁信息,并将聚合的运行总数存储在另一个表中。我如何确保只发生一次 聚合 我目前将电影租赁信息存储在名为MovieRentals的DynamoDB表中: {电影名称、租赁期(以天为单位)、订单日期、租赁金额} 我们每天都有数百万的电影出租。我们的web应用程序需要显示任何给定电影标题的合计租金金额 我计划使用Flink在MovieRental DynamoDB流上按电影标题汇总租金金额,并将汇总的租金金额存储在另一个名为R

祝大家节日快乐

tl;dr:我需要聚合存储在一个DynamoDB表中的电影租赁信息,并将聚合的运行总数存储在另一个表中。我如何确保只发生一次 聚合

我目前将电影租赁信息存储在名为MovieRentals的DynamoDB表中: {电影名称、租赁期(以天为单位)、订单日期、租赁金额}

我们每天都有数百万的电影出租。我们的web应用程序需要显示任何给定电影标题的合计租金金额

我计划使用Flink在MovieRental DynamoDB流上按电影标题汇总租金金额,并将汇总的租金金额存储在另一个名为RentalAmountsByMovie的DynamoDB表中: {电影名称,总租赁金额}

我如何确保RentalAmountsByMovie金额始终准确。i、 e.如何防止来自任何检查点的结果多次不更新RentalAmountsByMovie表记录

方法1:我将检查点ID存储在RentalAmountsByMovie表中,并进行条件更新以处理上述场景? 方法2:我可以实现使用DynamoDB事务的。然而,根据Flink文档,提交函数可以被多次调用,因此需要是幂等函数。因此,即使这个解决方案也需要将检查点ID存储在目标数据存储中。 方法3:另一种模式似乎只是将时间窗口聚合结果存储在RentalAmountsByMovie表中:{movie_title,rental_amount_for_checkpoint,checkpoint_id}。这样,从Flink到DynamoDB的写操作将是幂等的Flink没有进行任何更新,它只是对目标DDB表进行插入。但是,webapp必须通过聚合RentalAmountsByMovie表中的结果来实时计算运行总数。我不喜欢这个解决方案,因为它对webapp的延迟有影响

方法4:也许我可以使用Flink的可查询状态特性。但是,该功能似乎处于测试阶段:

我想这是一个非常常见的聚合用例。人们通常如何处理Flink外部接收器中的聚合结果更新

我很感激你的指点。如果需要,很乐意提供更多细节


谢谢

通常您关心的问题不是问题,因为人们正在使用幂等写来捕获外部接收器中的聚合结果

你可以依靠弗林克在弗林克的内部状态下始终掌握RentalAmountsByMovie的准确信息。之后,只需将这些信息镜像到DynamoDB即可


一般来说,如果你的汇是幂等的,那么事情就变得非常简单了。Flink中保存的状态将由指向输入的某种指针组成,例如,偏移量或时间戳,与消耗输入到该点所产生的聚合相结合。您将需要引导状态;这可以通过处理所有历史数据来实现,或者通过使用状态处理器API来创建一个建立起点的保存点。

为什么不使用DynamoDB Streams+Lambda?我没有使用DynamoDB Streams+Lambda,因为解决方案无法处理消费者重试。i、 e.如果Lambda多次处理同一流记录。为了处理这种情况,我必须在RentalAmountsByMovie表中存储kinesis碎片id和kinesis序列号。谢谢David!你是说我应该使用Flink的内部状态来跟踪RentalAmountsByMovie信息并将该内部状态复制到外部接收器?我使用Flink执行时间窗口聚合,然后将该数量添加到外部接收器中的记录中。因为我的方法涉及添加,所以除非跟踪检查点ID,否则很难实现幂等性。您的方法包括将Flink的内部状态镜像到外部接收器。您能给我指一下内部状态镜像方法的任何参考实现吗?上述方法有任何已知的缺陷吗?我已经对我的答案进行了一些扩展。如果你能把sink安排成幂等的,那么剩下的就很容易了——通常情况就是这样。