Apache flink Flink网络缓冲区使用率高,导致Kafka滞后
我们的Flink作业包含一个过滤器,按会话id键,然后是间隔30分钟的会话窗口。会话窗口需要累积会话的所有事件,并使用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://
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非常感谢。每次开始测试之前,我都会将卡夫卡偏移重置为最新的