我在flink上运行实时流程序,有1个主程序和2个工作程序。一个工人在单独的机器上运行,而另一个工人在主机器上运行。我正在使用程序的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
. 失去taskmanager的可能原因是什么(主计算机上只有一个任务管理器丢失,另一个任务管理器仍在那里并显示在flink web界面上。)
3条答案
按热度按时间ttisahbt1#
正如尤利西斯在他的回答中所说,你可以增加心跳所用的时间,或者使用像g1gc这样的增量垃圾收集器(flink's docker images已经使用了这个垃圾收集器,如果它可用的话)。
要启用g1gc,必须在启动flink任务管理器的java命令中添加以下参数:
-XX:+UseG1GC
您可以在以下链接中找到有关此增量垃圾收集器的更多信息:g1垃圾收集器入门
垃圾第一垃圾收集器调整
cgh8pdjw2#
当用于此任务管理器的节点缺少可用空间时,我们观察到此错误。
目前正在使用Flink3.7.1,但早期版本也受到影响。
这被认为是一个错误https://issues.apache.org/jira/browse/flink-5844 但是因为记者没有回应,所以被关闭了。
fruv7luv3#
我也遇到了这个问题。我发现了这个。
如果您看到java.lang.exception:执行任务的插槽已被释放。可能是taskmanager丢失,即使taskmanager实际上没有崩溃,这意味着taskmanager有一段时间没有响应。这可能是由于网络问题造成的,但通常是由于长时间的垃圾收集暂停。在这种情况下,一个快速修复方法是使用增量垃圾收集器,如g1垃圾收集器。它通常会导致较短的停顿。此外,您还可以通过减少flink为其内部操作获取的内存量(请参阅taskmanager托管内存的配置),为用户代码分配更多内存。如果这两种方法都失败并且错误仍然存在,只需将akka\u watch\u heartbeat\u pause(akka.watch.heartbeat.pause)设置为更大的值(例如600s),即可增加taskmanager的心跳暂停。这将导致jobmanager在考虑taskmanager丢失之前等待心跳更长的时间间隔。
解决方案如下:https://flink.apache.org/faq.html
我希望它能帮助你。