我们目前是 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 中实现类似的功能吗?我将列出我的一些假设和担忧:
现在在我们的场景中,我们的 Pipeline 在 F 附近开始失败,看来我们唯一的选择是从头开始或丢失数据?我相信这可以通过大量自定义代码(自定义 DoFn 以确保 Kafka Consumer 永远不会提交)和我们的上游接收器的一些自定义代码来克服,这些代码最终会提交偏移量。有没有更好的方法来做到这一点,和/或者我对数据流中如何处理偏移管理的一些假设是否错误?
感谢您详细的问题!