apache-kafka - flink kafka source 中的并行性不会导致任何执行

标签 apache-kafka apache-flink flink-streaming

我是kafka初学者和flink爱好者。 我注意到了一些令人不安的事情。当我将 kafka 作业的并行度增加到超过 1 时,我没有窗口来执行它们的进程。我希望使用并行来提高分析速度。

查看来自 Apache Flink Web Dashboard 的图像示例,其中可视化了该问题。 这是完全相同的代码和完全相同的摄取数据集,不同之处在于仅并行性。在第一个示例中,摄取的数据流经窗口函数,但是当并行性增加时,数据只是堆积在第一个永远不会执行的窗口函数中。它永远保持这样,永远不会产生任何错误。

Parallelism 1, everything flows fine, output from window 1 is sent to window 2 image

Parallelism 10, everything stops at the first window image

代码中使用的源是 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/

相关文章:

apache-kafka - 只读取来自 kafka 主题的特定消息

gradle - 在shadowJar中没有为属性 'mainClassName'指定值

java - Apache Flink IncationTargetException : Job execution failed. 连接超时

scala - 使用Flink获取DataStream的文件名

spring-boot - org.apache.kafka.common.KafkaException : Failed to construct kafka consumer

apache-kafka - 如何负载均衡 Kafka 领导层?

apache-flink - flink 计算流中的中值

java.lang.NoSuchMethodError : scala. Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object

redis - 从 Redis 读取数据到 Flink

amazon-web-services - AWS MSK 用户/密码认证/授权