Java 弗林克读卡夫卡时,速度在某些情况下会急剧下降

Java 弗林克读卡夫卡时,速度在某些情况下会急剧下降,java,apache-kafka,apache-flink,Java,Apache Kafka,Apache Flink,我们有一个Flink作业(Flink版本:1.9),它通过键连接两个kafka源,对于每个键,启动一个5分钟计时器,消息缓存在Flink状态,当计时器结束时,将具有相同键的消息(通常每个键有1~5条消息)合并成一个胖消息,并将其发送给kafka 卡夫卡的两个消息来源: source1(160个分区,每分钟2000~3000万条消息) source2(30个分区,每分钟1~3百万条消息) 平面图只是反序列化卡夫卡消息 KeyedProcess是计时器和Flink状态发挥作用的地方 我尝试了一些改

我们有一个Flink作业(Flink版本:1.9),它通过键连接两个kafka源,对于每个键,启动一个5分钟计时器,消息缓存在Flink状态,当计时器结束时,将具有相同键的消息(通常每个键有1~5条消息)合并成一个胖消息,并将其发送给kafka

卡夫卡的两个消息来源:

  • source1(160个分区,每分钟2000~3000万条消息)
  • source2(30个分区,每分钟1~3百万条消息)
  • 平面图只是反序列化卡夫卡消息

    KeyedProcess是计时器和Flink状态发挥作用的地方

    我尝试了一些改进性能的方法,例如对键进行模化以减少计时器的数量,或者增加硬件(目前为2000c 4000gb),或者调整操作符的并行度

    目前的问题是,当source1超过每分钟2500万条消息时,消耗速度会急剧下降,并且永远无法恢复。但如果每分钟少于2500万条消息,它就可以正常工作

    卡夫卡集群本身似乎没有问题,因为有另一个系统从中读取数据,并且该系统没有任何消耗速度问题


    谁能给我点启示吗?如何解决原因?或者任何我能试试的东西?增加更多硬件是个好主意吗(我认为2000c&4000gb是一个巨大的资源)?非常感谢。

    您可以先附加一个探查器来查看瓶颈在哪里。(可能是磁盘?)

    在某种程度上,RocksDB的表现似乎不再良好。 可能需要进行一些调整。您应该能够通过查看各种RocksDB指标在问题发生时的变化来获得一些见解

    以下是一些更有用的指标:

    estimate-live-data-size
    estimate-num-keys
    num-running-compactions
    num-live-versions
    estimate-pending-compaction-bytes
    num-running-flushes
    size-all-mem-tables
    block-cache-usage
    

    根据此工作负载运行的位置和方式,可能会遇到某种速率限制或节流。有关一个有趣的示例,请参阅。

    状态后端是如何配置的?@DavidAnderson嗨,大卫,我使用rocksdb状态后端。顺便说一句,检查点被禁用。