Apache flink Flink网络缓冲区使用率高,导致Kafka滞后

Apache flink Flink网络缓冲区使用率高,导致Kafka滞后,apache-flink,rocksdb,flink-cep,flink-statefun,Apache Flink,Rocksdb,Flink Cep,Flink Statefun,我们的Flink作业包含一个过滤器,按会话id键,然后是间隔30分钟的会话窗口。会话窗口需要累积会话的所有事件,并使用ProcessWindowFunction处理它们 我们使用Flink 1.9128个容器和20G内存来运行我们的作业,截止比是0.3。 我们正在进行增量检查点 当会话窗口开始触发进程功能时,网络缓冲区使用率开始变得相当高,然后我们开始获得Kafka输入滞后。 我们的环境: state.backend: rocksdb state.checkpoints.dir: hdfs://

我们的Flink作业包含一个过滤器,按会话id键,然后是间隔30分钟的会话窗口。会话窗口需要累积会话的所有事件,并使用
ProcessWindowFunction
处理它们

我们使用Flink 1.9128个容器和20G内存来运行我们的作业,截止比是0.3。 我们正在进行增量检查点

当会话窗口开始触发
进程
功能时,网络缓冲区使用率开始变得相当高,然后我们开始获得Kafka输入滞后。 我们的环境:

state.backend: rocksdb
state.checkpoints.dir: hdfs://nameservice0/service
state.backend.rocksdb.memory.managed: true
state.backend.incremental: true
#https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB
state.backend.rocksdb.memory.write-buffer-ratio: 0.6
state.backend.rocksdb.memory.high-prio-pool-ratio: 0.1
state.backend.rocksdb.block.blocksize: 16mb
state.backend.rocksdb.writebuffer.count: 8
state.backend.rocksdb.writebuffer.size: 256mb
state.backend.rocksdb.timer-service.factory: heap

containerized.heap-cutoff-ratio: 0.25
taskmanager.network.memory.fraction: 0.85
taskmanager.network.memory.min: 512mb
taskmanager.network.memory.max: 7168mb
taskmanager.network.memory.buffers-per-channel: 8
taskmanager.memory.segment-size: 4mb
taskmanager.network.memory.floating-buffers-per-gate: 16
taskmanager.network.netty.transport: poll
一些图表:


任何建议都将不胜感激

我不知道flink的内部结构,但原因可能与会话窗口有关。
我的意思是,如果在相同的时间间隔(30分钟)内有这么多会话操作,那么所有会话操作都将在同一时间执行,这可能会造成延迟。

我不知道flink的内部结构,但原因可能与会话窗口有关。
我的意思是,如果您有如此多的会话操作,且间隔相同(30分钟),则所有会话操作都将在同一时间执行,这可能会造成延迟。

如果我可以访问详细信息,下面是我将介绍的内容,以尝试提高此应用程序的性能:

(1) 是否可以重新实现windows以进行增量聚合?目前,windows正在建立可能相当长的事件列表,并且只有在会话结束时,它们才能处理这些列表。这显然需要足够长的时间来对卡夫卡造成压力。如果您可以预先聚合会话结果,这将使处理变得均匀,问题应该会消失

不,我没有反驳我说的话。如果我不清楚,请告诉我

(2) 您已经设置了大量额外的网络缓冲。这通常适得其反;您希望背压能够迅速反弹并限制源,而不是将更多数据推入Flink的网络缓冲区

您最好减少网络缓冲,如果可能,使用可用资源提供更多插槽。当一个插槽忙于处理刚刚结束的长会话的内容时,拥有更多插槽将减少影响。给RocksDB更多的内存可能也会有所帮助

(3) 看看是否可以优化序列化。最好的序列化程序和最差的序列化程序之间的吞吐量可能相差10倍。看见如果记录中有任何字段实际上不需要,请删除它们


(4) 看看调谐RocksDB。确保为RocksDB使用最快的可用本地磁盘,如本地SSD。避免将网络连接存储(如EBS)用于
state.backend.rocksdb.localdir

如果我可以访问详细信息,下面是我将介绍的内容,以尝试提高此应用程序的性能:

(1) 是否可以重新实现windows以进行增量聚合?目前,windows正在建立可能相当长的事件列表,并且只有在会话结束时,它们才能处理这些列表。这显然需要足够长的时间来对卡夫卡造成压力。如果您可以预先聚合会话结果,这将使处理变得均匀,问题应该会消失

不,我没有反驳我说的话。如果我不清楚,请告诉我

(2) 您已经设置了大量额外的网络缓冲。这通常适得其反;您希望背压能够迅速反弹并限制源,而不是将更多数据推入Flink的网络缓冲区

您最好减少网络缓冲,如果可能,使用可用资源提供更多插槽。当一个插槽忙于处理刚刚结束的长会话的内容时,拥有更多插槽将减少影响。给RocksDB更多的内存可能也会有所帮助

(3) 看看是否可以优化序列化。最好的序列化程序和最差的序列化程序之间的吞吐量可能相差10倍。看见如果记录中有任何字段实际上不需要,请删除它们


(4) 看看调谐RocksDB。确保为RocksDB使用最快的可用本地磁盘,如本地SSD。避免将网络连接存储(如EBS)用于
state.backend.rocksdb.localdir

如果您使用的是kafka代理,我将首先检查您的kafka源是否使用本主题开头的消息。另外,您的kafka代理可能有很多消息/事件等待使用。之后,检查检查点是有意义的metrics@Felipe非常感谢。每次开始测试之前,我都会将卡夫卡偏移量重置为您从卡夫卡代理处消费的最新版本。我会首先检查您的卡夫卡源是否消费主题开头的消息。另外,您的kafka代理可能有很多消息/事件等待使用。之后,检查检查点是有意义的metrics@Felipe非常感谢。每次开始测试之前,我都会将卡夫卡偏移重置为最新的