我在会话模式中使用FLink1.15Docker图像,与撰写文件几乎一样。我有一个任务经理。在启动流作业几分钟后,我从job收到一条堆栈转储日志消息,该消息指出任务管理器已不可达,并且我看到我的容器已退出代码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容器,并查看/opt/flink/logs/
中的日志文件,那么最后一条消息指出,我管道中的各个组件已经从初始化切换到运行。
如果我的状态变得太大,我就会期望任务管理器会产生内存堆栈转储。docker inspect
还显示,由于内存不足,容器没有退出。
我不知道是什么导致我的任务经理死了。我有什么办法找出是什么引起了这个问题吗?(这发生在1.15.1和1.15.2。我没有使用过任何其他版本的Flink。
发布于 2022-09-28 09:09:34
最后,我没有比尝试和错误更复杂的方法来做各种不同的测试工作。我不能100%肯定我修复了这个问题,因为任务管理器在没有堆栈转储的情况下崩溃的问题是偶然发生的。然而,任务管理器已经有几天没有崩溃了。
重新创建我的问题的最简单的工作是,一个SourceFunction
输出一个连续的增量Long
流到一个DiscardingSink
。有了这个设置,任务管理器就会在我的Linux机器上偶尔崩溃,但不会在我的Mac上崩溃。
如果我将一个Thread.sleep
添加到SourceFunction
的run循环中,那么最终会发生崩溃,但要花费更长的时间。
我尝试了Source
框架,而不是SourceFunction
,SingleThreadMultiplexSourceReaderBase
在SplitReader
上反复调用fetch
来输出Long
。自从我这样做之后,崩溃次数减少了,所以不能100%工作。
我猜想我的SourceFunction
是在填充某种缓冲区或使任务时隙没有响应性,因为一旦它启动,它就不会放弃一个时隙。(或者其他完全不同的解释。)
我希望任务管理器给出一些为什么停止运行的指示。
发布于 2022-09-21 09:59:27
当任务管理器耗尽内存时,当GC花费了太多时间试图释放一些内存时,我就遇到了这个问题。
我知道您说过,docker检查并不显示它由于内存问题而关闭,但是仍然尝试使用更多的RAM或减少任务的内存需求,看看它是否仍然崩溃。
https://stackoverflow.com/questions/73646443
复制相似问题