我在Flink上运行实时流媒体程序,有1名主人和2名 Worker . 一个工作程序在单独的计算机上运行,而另一个工作程序在主计算机上运行 . 我正在使用我的程序的JAR,其中 Parallelism
设置为2.此外,我从Kafka读取了2个代理和2个分区的数据 .
在这种情况下,当我将作业提交到Flink集群时,它将运行一段时间并因错误 java.lang.Exception: The slot in which the task was executed has been released. Probably loss of TaskManager 82f8941ff339603995e37c453f8ff401
而失败 . 失去任务管理员的可能原因是什么? (主机上只有一个任务管理器丢失,另一个仍在那里并在Flink Web界面显示 . )
2 回答
我也遇到了这个问题 . 我发现了这个 .
如果您看到java.lang.Exception:已执行任务执行的插槽已被释放 . 即使TaskManager确实没有崩溃,可能会丢失TaskManager,这意味着TaskManager一段时间没有响应 . 这可能是由于网络问题,但通常是由于长时间的垃圾收集停顿 . 在这种情况下,快速修复将使用增量垃圾收集器,如G1垃圾收集器 . 它通常会导致更短的暂停 . 此外,您可以通过减少Flink为其内部操作获取的内存量来为用户代码提供更多内存(请参阅TaskManager托管内存的配置) . 如果这两种方法都失败并且错误仍然存在,只需通过以下方式增加TaskManager的心跳暂停时间:将AKKA_WATCH_HEARTBEAT_PAUSE(akka.watch.heartbeat.pause)设置为更大的值(例如600s) . 这将导致JobManager在考虑TaskManager丢失之前等待较长时间间隔的心跳 .
解决方案由https://flink.apache.org/faq.html给出
我希望它可以帮到你 .
正如ulysses在他的anwer中所说的那样,你可以增加用于心跳的时间或使用增量垃圾收集器,如G1GC(Flink 's docker images already use this garbage collector if it'可用) .
要启用G1GC,您必须将以下参数添加到启动flink任务管理器的java命令中:
-XX:+UseG1GC
您可以在以下链接中找到有关此增量垃圾收集器的更多信息:
Getting Started with the G1 Garbage Collector
Garbage First Garbage Collector Tuning