我是kafka初学者和flink爱好者。 我注意到了一些令人不安的事情。当我将 kafka 作业的并行度增加到超过 1 时,我没有窗口来执行它们的进程。我希望使用并行来提高分析速度。
查看来自 Apache Flink Web Dashboard 的图像示例,其中可视化了该问题。 这是完全相同的代码和完全相同的摄取数据集,不同之处在于仅并行性。在第一个示例中,摄取的数据流经窗口函数,但是当并行性增加时,数据只是堆积在第一个永远不会执行的窗口函数中。它永远保持这样,永远不会产生任何错误。
代码中使用的源是 KafkaSource,FlinkKafkaConsumer 似乎可以在相同的设置下正常工作,但已被弃用,所以我不希望使用它。
感谢任何想法!
最佳答案
问题(几乎可以肯定)正在使用的 Kafka 主题的分区数少于配置的并行度。新的 KafkaSource
处理这种情况的方式与 FlinkKafkaConsumer
不同。
事件时间窗口等待水印的到来,指示流现在通过窗口的结束时间完成。当您的 KafkaSource
运算符有 10 个实例时,其中一些实例未接收任何数据,这些空闲实例会阻止水印。基本上,Flink 不知道这些实例永远不会产生数据——而是等待它们被分配工作要做。
您可以通过执行以下操作之一解决此问题:
- 将 Flink 的并行度降低到小于或等于 Kafka 分区的数量。
- 将您的
WatermarkStrategy
配置为使用withIdleness(duration)
,这样空闲的实例就会意识到它们没有做任何事情,并且(暂时)将它们自己从参与中移除带水印。 (如果这些实例曾被分配要使用的拆分/分区,它们将继续添加水印。)
关于apache-kafka - flink kafka source 中的并行性不会导致任何执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70096166/