Apache flink 使用Flink Kafka连接器均匀地消耗事件

Apache flink 使用Flink Kafka连接器均匀地消耗事件,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在使用Flink处理卡夫卡的流数据。流程非常基本,从卡夫卡开始消耗,数据丰富,然后汇到FS 在我的例子中,分区的数量大于Flink并行级别。我注意到Flink并不是从所有分区中平均消耗 有时,在一些Kafka分区中会创建滞后。 重新启动该应用程序有助于Flink“重新平衡”消费,并快速关闭滞后。然而,过了一段时间,我看到其他分区出现了滞后等现象 看到这种行为,我尝试按照Flink文档中的建议,使用rebalance()重新平衡消费率: 分区元素循环,为每个分区创建相等的负载。对于存在数据倾斜

我正在使用Flink处理卡夫卡的流数据。流程非常基本,从卡夫卡开始消耗,数据丰富,然后汇到FS

在我的例子中,分区的数量大于Flink并行级别。我注意到Flink并不是从所有分区中平均消耗

有时,在一些Kafka分区中会创建滞后。 重新启动该应用程序有助于Flink“重新平衡”消费,并快速关闭滞后。然而,过了一段时间,我看到其他分区出现了滞后等现象

看到这种行为,我尝试按照Flink文档中的建议,使用rebalance()重新平衡消费率:

分区元素循环,为每个分区创建相等的负载。对于存在数据倾斜的情况下的性能优化非常有用

dataStream.rebalance()

代码中的更改很小,只需将rebalance()添加到数据流源中即可。 使用rebalance()运行应用程序导致Flink出现一个非常奇怪的行为:

我将并行级别设置为260并提交了一个作业,但由于某种原因,作业管理器将插槽数乘以4。查看执行计划图,我意识到现在所有数据都被260个内核消耗,然后被发送到3个接收器(希望是均匀的)。由于缺乏资源,作业失败

因为我想使用260个内核,所以我再次尝试提交作业,这次并行度为65(=260/4)。 作业运行正常,但处理率较低。在web UI中,我发现插槽总数不等于可用任务插槽+正在运行的任务。但是如果我将rtbJsonRequest(我提交的作业)称为一个包含65(=260/4)个任务槽的作业,而不是它所写的260个任务槽,那么它等于

长话短说,我试图找到一种平衡卡夫卡分区消费的方法。根据Flink documentation,rebalance()是我需要的,但显然我用错了

增加更多的投入。本主题共有520个分区,并行度为260(每个核心有2个分区)

我可以清楚地看到,很少有分区的使用率非常低:

在源之后插入重新平衡不会平衡源本身,而是通过在作业图中插入循环网络洗牌来平衡后续输入。这最多只能平衡水槽上的负载,这对解决问题没有帮助


您总共使用了多少个Kafka分区?您使用的是主题发现还是分区发现?重新开始工作确实很有帮助,这似乎很奇怪。

我发现我的两个Flink任务经理与其他员工相比处理率非常低

正如您在下面的屏幕截图中所看到的,每秒少于5K个事件,而其他处理至少37K个事件:

这真的让我明白了,我面临的是一个环境问题,而不是一个棘手的问题。 在我的例子中,安装CPU控制器并重新启动机器解决了问题

在这个过程中我学到了一件非常重要的事情,默认情况下Flink不会发现Kafka分区。如果要添加,只需添加到属性中:

“flink.分区发现.间隔毫秒”,“时间间隔”

我在属性中添加了分区发现,作业抛出一个NPE。这是设置分区发现属性的正确方法吗

java.lang.NullPointerException: null
        at org.apache.flink.streaming.connectors.kafka.internal.Kafka09PartitionDiscoverer.getAllPartitionsForTopics(Kafka09PartitionDiscoverer.java:77)

分区本身是否平衡?例如,分区之间的数据是如何分割的?是的,分区的传入速率看起来正常且均匀。我有500个分区。在默认情况下,分区发现被禁用(我不知道),所以我没有使用它。我添加了props.setProperty(“flink.partition discovery.interval milis”,“60000”);跳它会有帮助的好吧,它没有帮助。我很乐意听到其他建议。你有没有尝试过在整个工作中使用250的并行性?这似乎是一个显而易见的答案,因为它将为每个任务槽提供2个kafka分区。有了260,每个分区有240个,每个分区有2个,每个分区有20个,这似乎不是很有帮助。我从1:1的比率开始(260个内核对260个分区),这没有帮助。即使我将并行度级别更改为250,我也会看到相同的行为。啊哈!谢谢你的跟进。这是一个问题还是一个答案?它对我来说很有用,但是,我使用的是卡夫卡2而不是09,分区管理在2和09之间是不同的。第二部分由经纪人管理,第九部分由zk管理。我想这就是你遇到问题的原因。
java.lang.NullPointerException: null
        at org.apache.flink.streaming.connectors.kafka.internal.Kafka09PartitionDiscoverer.getAllPartitionsForTopics(Kafka09PartitionDiscoverer.java:77)