数据流从Kafka读取数据不会丢失?

问题描述 投票:0回答:1

我们目前是 Dataflow 批处理作业的大用户,并且希望开始使用 Dataflow 流(如果可以可靠地完成)。

这是一个常见的场景:我们有一个非常大的 Kafka 主题,我们需要对其进行一些基本的 ETL 或聚合,以及一个非幂等上游队列。这是我们的 Kafka 数据的示例:

    ID |     msg | timestamp (mm,ss)
-----------------------
  1    |     A   |  01:00
  2    |     B   |  01:01
  3    |     D   |  06:00
  4    |     E   |  06:01
  4.3  |     F   |  06:01
 ....  | ......  | ...... (millions more)
  
  4.5  |    ZZ   |  19:58




糟糕,数据在某个时刻从整数变为小数,这最终会导致某些元素失败,从而需要我们终止管道,可能会修改下游服务,并可能对 Dataflow 管道进行较小的代码更改。

在 Spark 结构化流中,由于能够使用外部检查点,我们将能够重新启动流作业并恢复处理前一个作业停止(成功处理)的队列,以进行一次处理。在普通或 Spring Boot Java 应用程序中,我们可以使用 Kafka 消费者进行循环,并且仅在将结果写入我们的“接收器”后,提交偏移量。

我的总体问题是我们可以在 Dataflow 中实现类似的功能吗?我将列出我的一些假设和担忧:

  1. KafkaIO 中,偏移提交 PCollection 和用户的偏移提交 PCollection 之间似乎没有关系,这是否意味着它们可以分开?
  2. KafkaOffsetCommit中,这似乎需要一个五分钟的窗口并发出最高的偏移量,但这不是不是墙上时间,这是Kafka记录时间。回到我们的示例数据,对我来说,看起来整个队列的偏移量将尽快提交(以五分钟为单位)! 这意味着如果我们在前五分钟内只处理完记录F,我们可能已经提交了几乎整个队列的偏移量?

现在在我们的场景中,我们的 Pipeline 在 F 附近开始失败,看来我们唯一的选择是从头开始或丢失数据?我相信这可以通过大量自定义代码(自定义 DoFn 以确保 Kafka Consumer 永远不会提交)和我们的上游接收器的一些自定义代码来克服,这些代码最终会提交偏移量。有没有更好的方法来做到这一点,和/或者我对数据流中如何处理偏移管理的一些假设是否错误?

google-cloud-platform apache-kafka google-cloud-dataflow apache-beam
1个回答
3
投票

感谢您详细的问题!

  1. 在 Beam(因此称为 Dataflow)中,“捆绑包”的所有输出以及所有状态更新、检查点等都一起提交,因此不同输出 PCollection 之间没有漂移。在这种特定情况下,偏移量是直接从要输出的元素中提取的,因此它们精确对应。在将偏移量提交回 Kafka 之前,输出和偏移量都会持久地提交到 Dataflow 的内部存储。
  2. 您是正确的,已处理元素的偏移量被分组为 5 分钟事件时间窗口(Kafka 记录时间),并采用最大偏移量。虽然 5 分钟是任意持续时间,但偏移量对应于已成功从队列中拉出的元素。
© www.soinside.com 2019 - 2024. All rights reserved.