【发布时间】:2021-05-25 07:10:46
【问题描述】:
我们目前是 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 结构化流式处理中,由于能够使用外部检查点,我们将能够重新启动流式处理作业并恢复处理前一个作业停止(成功处理)的队列,只进行一次处理。在 vanilla 或 spring boot Java 应用程序中,我们可以循环使用 Kafka 消费者,并且只有在将结果写入我们的“接收器”之后,才能提交偏移量。
我的总体问题是我们能否在 Dataflow 中实现类似的功能?我将列出我的一些假设和担忧:
- 似乎在KafkaIO 中,偏移提交 PCollection 和用户的之间没有关系,这是否意味着它们可以分开?
- 似乎在KafkaOffsetCommit 这需要 aw5 分钟的间隔 并发出最高的偏移量,但这是不是墙上时间,这是 kafka 记录时间.回到我们的示例数据,在我看来,整个队列的偏移量将尽可能快地提交(以五分钟为单位)! 这意味着如果我们只在前五分钟完成了记录 F 的处理,我们可能已经提交了几乎整个队列的 fests?
现在在我们的场景中,我们的管道在 F 附近开始失败,看来我们唯一的选择是从头开始还是丢失数据?我相信这可以通过大量自定义代码(自定义 DoFn 以确保 Kafka 消费者永远不会提交)和一些用于我们上游接收器的自定义代码来克服,这些代码最终会提交偏移量。有没有更好的方法来做到这一点,和/或我对如何在 Dataflow 中处理偏移管理的一些假设是错误的?
【问题讨论】:
标签: google-cloud-platform apache-kafka google-cloud-dataflow apache-beam