try catch不要写的范围太大,范围太大会造成捕获之后都不处理了,程序一直处理异常情况。
比如Redis的捕获处理,就在Redis附近捕获,然后在catch中处理异常。
增加重启策略是十分必要的,增加之后如果程序有遇到错误会在不被kill的状况下在已有的资源下重新启动,相应的applicationId也是没有变的。
如下固定时间间隔重启策略:
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3, 10));
表示一共重启3次,每次重启间隔10秒钟。
重启策略还有失败率策略,即在一定的时间内失败了多少次,达到阈值次数即是失败了。
env.setRestartStrategy(RestartStrategies.failureRateRestart( 3, //一个时间段内的最大失败次数 Time.of(5, TimeUnit.MINUTES), // 衡量失败次数的是时间段 Time.of(10, TimeUnit.SECONDS)) // 间隔
);
表示5分钟失败三次(每次启动间隔时间是10s)即算是程序失败,要被kill掉。
错误形式
Caused by: java.util.concurrent.TimeoutException: Heartbeat of TaskManager with id container_e26_164612060_85_01_000010(x946.hadoop.data.sooa.com.cn:4554) timed out.at org.apache.flink.runtime.jobmaster.JobMaster$TaskManagerHeartbeatListener.notifyHeartbeatTimeout(JobMaster.java:1299) ~[flink-dist_2.11-1.13.5.jar:1.13.5]... 25 more
上面报错说明是tm跟jm的心跳超时,心跳超时原因很多,比如JM内存不足/TM内存不足导致的FGC。
把心跳时间设置长一些
-yD heartbeat.timeout=500000
flink重启策略:https://www.cnblogs.com/xyniu/p/15130566.html
心跳超时: http://www.kuazhi.com/post/314144.html
上一篇:五分钟搞懂 POM 设计模式
下一篇:【MySQL】创建数据库表