我正在会话模式下使用Flink 1.15 Docker图像,与Compose文档几乎相同。我有一个任务管理器。启动流作业几分钟后,我从任务管理器收到一条堆栈转储日志消息,说明任务管理器不再可用,我看到任务管理器Docker容器已退出,代码为137-这可能表示内存不足错误。尽管docker inspect
将OOMKilled
标志显示为false
,表示存在某种其他问题。
作业管理器日志中的堆栈跟踪结尾:
Caused by: org.apache.flink.runtime.jobmaster.JobMasterException: TaskManager with id 172.18.0.5:44333-7c7193 is no longer reachable.
TaskManager Docker日志在退出之前不会产生任何错误。如果我重新启动已死亡的Task Manager Docker容器并查看/opt/flink/logs/
中的日志文件,则最后的消息会指出管道中的各个组件已从INITIALIZING切换到RUNNING。
如果我的状态变得太大,我会期望任务管理器发出内存不足的堆栈转储。另外,docker inspect
显示容器没有退出,因为内存不足错误。
我不知道是什么原因导致我的任务管理器死机。有什么办法可以找出是什么原因导致这个问题吗?(这种情况发生在1.15.1和1.15.2。我没有使用任何其他版本的Flink。)
2条答案
按热度按时间zkure5ic1#
当任务管理器耗尽内存,GC花费太多时间试图释放一些内存时,我就遇到了这个问题。
我知道你说过docker inspect不会显示它是因为内存问题而关闭的,但是仍然尝试使用更多的RAM或者减少任务的内存需求,看看它是否仍然崩溃。
beq87vna2#
最后,我使用了一系列不同的测试任务,没有比试错更复杂的方法。我不能100%确定我修复了这个问题,因为偶尔会出现任务管理器在没有堆栈转储的情况下崩溃的问题。但是,任务管理器已经好几天没有崩溃了。
重现我的问题的最简单的工作是用
SourceFunction
输出一个连续的递增Long
流直接到DiscardingSink
。使用这种设置,任务管理器会在我的Linux机器上偶尔崩溃,但在我的Mac上从来没有崩溃过。如果我在
SourceFunction
s运行循环中添加了一个Thread.sleep
,那么崩溃最终会发生,但需要更长的时间。我尝试了
Source
框架,而不是SourceFunction
,SingleThreadMultiplexSourceReaderBase
在SplitReader
上重复调用fetch
,以输出Long
。自从我这样做以来,崩溃次数减少了,所以它不是100%有效。我认为我的
SourceFunction
是溢出了某种缓冲区,或者使一个任务槽没有响应,因为它一旦开始就不会放弃一个槽。(或者其他一些完全不同的解释。)我希望任务管理器能给出某种指示,说明它为什么停止运行。