Flink 检查点失败

4
我们正在尝试使用RocksDB后端设置Flink有状态作业。我们使用30分钟的会话窗口,并使用聚合函数,因此不使用任何Flink状态变量。通过采样,我们每秒少于20k个事件,有20-30个新会话/秒。我们的会话基本上收集所有事件。随着时间的推移,会话累加器的大小会增加。我们在Flink 1.9中使用了总共10G内存,128个容器。以下是设置:
state.backend: rocksdb
state.checkpoints.dir: hdfs://nameservice0/myjob/path
state.backend.rocksdb.memory.managed: true
state.backend.incremental: true
state.backend.rocksdb.memory.write-buffer-ratio: 0.4
state.backend.rocksdb.memory.high-prio-pool-ratio: 0.1

containerized.heap-cutoff-ratio: 0.45
taskmanager.network.memory.fraction: 0.5
taskmanager.network.memory.min: 512mb
taskmanager.network.memory.max: 2560mb

在我们对一段时间的监控中,rocksdb内存表的大小小于10m,我们的堆使用量小于1G,但是我们的直接内存使用量(网络缓冲区)达到了2.5G。缓冲池/缓冲区使用度量都为1(满)。我们的检查点一直失败,我想知道网络缓冲区部分使用这么多内存是否正常?如果您能提出一些建议,我将不胜感激:)谢谢!enter image description hereenter image description hereenter image description here
1个回答

4
就技术而言,会话窗口确实在内部使用Flink状态。(大多数来源和汇聚都是如此。)根据您将会话事件收集到会话累加器的方式,这可能是性能问题。如果您需要将所有事件汇总在一起,为什么不使用AggregateFunction让Flink代替您完成呢?
为获得最佳的窗口性能,您要使用ReduceFunction或AggregateFunction来逐渐减少/聚合窗口,仅保留最终成为窗口结果的一小部分状态。另一方面,如果您仅使用ProcessWindowFunction没有进行预聚合,那么Flink将在内部使用追加列表状态对象。当与RocksDB一起使用时,它非常高效,只需将每个事件序列化以将其附加到列表末尾。当最终触发窗口时,列表将作为可迭代对象传递给您,并被划分成块进行反序列化。另一方面,如果您使用AggregateFunction自己的解决方案,则可能导致RocksDB在每次访问/更新时进行反序列化和重新序列化。这可能非常昂贵,并且可能解释了检查点失败的原因。
您分享的另一个有趣事实是缓冲池/缓冲使用情况指标显示它们已完全利用。这表明存在显着的背压,这反过来将解释为什么检查点失败。检查点依赖于检查点障碍能够遍历整个执行图,检查点每个运算符,并在完成作业的完整扫描之前计时超时。有了背压,这可能会失败。
背压最常见的原因是低配-换句话说,集群被压垮了。网络缓冲池变得完全利用,因为运算符跟不上。答案不是增加缓冲区,而是去除/修复瓶颈。

非常感谢David,我已经切换到ProcessWindowFunction了,现在所有的检查点都成功了 :) 但是网络缓冲区使用仍然相当高(比以前好),我将在问题本身中更新图表。我检查了我们的作业,在Flink UI上没有显示任何背压。 对于RocksDB的使用情况,指标显示使用的内存比我在Flink UI上看到的状态大小要少得多。你能给些建议吗? - lucky_start_izumi
理想情况下,您应该为作业提供资源,以便它可以处理正常负载并偶尔出现背压,这样您就有能力处理典型的负载峰值而不会落后(假设您的目标是“跟上实时”场景)。 (顺便说一句,低CPU可能会误导 - 如果数据倾斜,您可能会发现一个热键压倒一个核心,而其余核心则无事可做。) - David Anderson
有很多因素会导致背压(backpressure),因此增加并行度可能不是正确的答案。换句话说,滥用Flink并创建性能问题的方法有很多。如果您想分享作业拓扑结构,这可能会允许一些更具体的建议。但常见错误包括过度使用keyBy、低效的序列化程序、防止操作链、未启用对象重用等... - David Anderson
澄清一下,我不会太关注那些图表。只有在您有持续的背压时才需要采取行动。如果延迟和检查点时间正常,则您可能没问题。Flink并不使用太多网络缓冲区,因此您应该预期它们有时会被充分利用。 - David Anderson
1
通过SO提供好的建议很难;通常只能回答直截了当的问题。但我们有时会实现一个参数化数据生成器,以近似生产数据的显著特征,然后使用它来查看管道在不同负载下的反应情况。请参见https://flink.apache.org/news/2019/02/25/monitoring-best-practices.html,了解如何检查作业是否健康的一些建议。 - David Anderson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接