Flink集群运行5个小时候后down掉

1 现象:flink集群执行job,运行5个小时后,jobmanager报:

2018-03-29 15:25:39,311 INFO  org.apache.flink.runtime.jobmanager.JobManager                - RECEIVED SIGNAL 1: SIGHUP. Shutting down as requested.
2018-03-29 15:25:39,312 INFO  org.apache.flink.runtime.jobmanager.JobManager                - RECEIVED SIGNAL 1: SIGHUP. Shutting down as requested.
2018-03-29 15:25:39,324 INFO  org.apache.flink.runtime.webmonitor.WebRuntimeMonitor         - Removing web dashboard root cache directory /tmp/flink-web-1abed217-bd39-4145-a9df-c9507889352e
2018-03-29 15:25:39,332 INFO  org.apache.flink.runtime.webmonitor.WebRuntimeMonitor         - Removing web dashboard jar upload directory /tmp/flink-web-b5e3001f-e05c-487e-bea1-47c757372b65

2018-03-29 15:25:39,348 INFO  org.apache.flink.runtime.blob.BlobServer                      - Stopped BLOB server at 0.0.0.0:46493

其它taskmanager则因找不到jobmanager而取消了task,所以整个集群工作终止,并宕掉。


2 问题原因:

通过自己编写的shell脚本启动flink集群后,将运行该脚本的shell窗口暴力关闭所致。

SIGHUP 会在以下 3 种情况下被发送给相应的进程: 

  1. 终端关闭时,该信号被发送到 session 首进程以及作为 job 提交的(后台)进程(即用 & 符号提交的进程)
  2. session 首进程退出时,该信号被发送到该 session 中的前台进程组中的每一个进程
  3. 若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到 SIGSTOP 或 SIGTSTP 信号后被挂起),该信号会被发送到该进程组中的每一个进程(这里说的有问题,应该是发送给被挂起的进程)。

系统对 SIGHUP 信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

在这个环境下 GNU bash, version 3.2.25 ,前台进程,终端关闭后,进程会收到 2 次 SIGHUP 信号,一次为 bash 退出前由 bash 自己发送,一次为会话首进程(同样是 bash)退出后由 kernel 发送。

当lonin shell被关闭后,flink集群进程组成为孤儿进程组,运行一段时间后,jobManager进程处于停止状态,就收到了SIGHUP信号。


3 解决办法:1)集群启动命令前加 nohup,即:nohup  $FLINK_HOME/bin/start-cluster.sh &

保证该shell脚本被关闭时,集群启动命令运行后不会被中断

2)启动脚本加 trap “”SINGHUP #屏蔽SIGHUP信号,保证当前脚本被关闭时,不影响已启动的命令


有待进一步验证


你可能感兴趣的:(flink)