我有一个基于 Kafka 的 Spark Streaming 应用程序,每 5 分钟运行一次。在运行了 5 天后查看统计数据,发现以下几点观察结果: 处理时间逐渐从 30 秒增加到 50 秒。下面的快照图表突出了处理时间变化情况: 出现了大量的 Garbage Collection 日志,如下所示: 问题: 为什么即使事件数量大致相同(在最后一个周期期间),处理时间 显著增加,是否有合理的解释? 我在每个处理周期结束时收到近70个GC日志,这正常吗? 有没有更好的策略来确保处理时间保持在可接受的延迟范围内?
这真的取决于应用程序。我在调试此问题时的方法如下: 在存储选项卡下查看存储大小是否不断增长。如果有增长,这可能表明存在某种缓存资源泄漏。检查 spark.cleaner.ttl 的值,但最好确保在不再需要资源时取消缓存所有资源。 检查正在运行的作业的DAG可视化,并查看谱系是否不断增长。如果是这种情况,请确保执行检查点以削减谱系。 减少UI中保留的批次数量(spark.streaming.ui.retainedBatches参数)。 即使事件数相同,请查看任务处理的数据量是否随时间增长(Stages标签 -> 输入列)。这可能指向应用程序级别的问题。 我有相对复杂的Spark Streaming应用程序(Spark v1.6、v2.1.1、v2.2.0)在运行多天而没有性能下降,所以一定有一些可解决的问题。