【问题标题】:Memory is not coming down after data processing in Apache Flink在 Apache Flink 中处理数据后内存没有下降
【发布时间】:2021-03-25 18:25:11
【问题描述】:

我正在使用广播处理函数来执行简单的模式匹配。我正在广播大约 60 种模式。一旦进程完成,内存不会下降,我在我的 flink 配置文件env.java.opts = "-XX:+UseG1GC" 中使用垃圾收集设置来执行 GC,但它也不起作用。但是在完成数据处理后会出现 CPU 百分比。我每 2 分钟进行一次检查点,我的 statebackend 是文件系统。下面是内存和CPU使用率的截图

【问题讨论】:

  • 澄清一下:图表显示了唯一的任务管理器的资源利用率?有问题的作业是已停止或取消的流式作业,还是仍在运行?
  • @DavidAnderson 感谢您的回复,该图是整个集群资源,但如果您看到 50-75% 之后的内存利用率,则它正被模式匹配资源使用。这里的问题是它接收内存的每一轮数据都在增加,最终它达到 100% 并且 pod 会崩溃。处理数据后,内存不会下降。该图是一个正在运行的流式作业。

标签: apache-flink flink-streaming


【解决方案1】:

在您分享的图表中,我没有看到任何令人惊讶或有问题的地方。摄取模式后,BroadcastProcessFunction 的每个实例都将保存所有模式的副本——这样会消耗一些内存。

如果我理解正确,听起来情况是,当处理数据以匹配这些模式时,内存会继续增加,直到 pod 因内存不足错误而崩溃。多种因素可能会解释这一点:

  • 如果您的模式涉及随着时间的推移匹配一系列事件,那么您的模式匹配引擎必须为每个部分匹配保留状态。如果没有超时子句来确保最终清除部分匹配,这可能会导致组合爆炸。

  • 如果您正在执行密钥分区处理并且您的密钥空间是无限的,那么您可能会保留陈旧密钥的状态。

  • 文件系统状态后端有相当大的开销。您可能低估了它需要多少内存。

【讨论】:

  • 我没有在内存中保存事件,或者我没有在我的用例中使用键分区处理。我正在接收简单的 json 对象,我在其中寻找一个特定的对象是否满足我的条件。我需要检查文件系统状态后端。
  • 如果你没有做任何关键的事情,那么状态后端可能不是问题。这是什么版本的 Flink?
  • 我使用的是flink 1.10.0版
  • 在错误修复版本 1.10.1、1.10.2 和 1.10.3 之间,总共修复了 267 个错误。我建议升级看看是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多