try catch不要写的范围太大,范围太大会造成捕获之后都不处理了,程序一直处理异常情况。
比如Redis的捕获处理,就在Redis附近捕获,然后在catch中处理异常。
如:
try{
for (int j = 0; j < 10; j++) {
int aaa = (int) ((Math.random()*100) % 50);
System.out.println("aaa");
System.out.println(aaa);
String uid_tag_res = null;
boolean equals = uid_tag_res.equals("1");
System.out.println("flagflag");
}
} catch (Exception e) {
e.printStackTrace();
// logger.error("error:" + e.getMessage());
}
输出:
aaa
42
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
在for循环中遇到了空指针异常错误,程序就跳出for循环了,for循环就执行了一次。
而如果把异常范围缩小到for循环之中:
如下:
System.out.println("================");
for (int j = 0; j < 10; j++) {
int aaa = (int) ((Math.random()*100) % 50);
System.out.println("aaa");
try{
System.out.println(aaa);
String uid_tag_res = null;
boolean equals = uid_tag_res.equals("1");
System.out.println("flagflag");
} catch (Exception e) {
e.printStackTrace();
// logger.error("error:" + e.getMessage());
}
}
System.out.println("======end=====");
输出结果为:
================
aaa
8
aaa
29
aaa
30
aaa
43
aaa
46
aaa
43
aaa
12
aaa
42
aaa
37
aaa
40
======end=====
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at demo.check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at demo.check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
java.lang.NullPointerException
at check_blacklist.main(check_blacklist.java:291)
在try中遇到了问题之后就会将错误抛出,在错误之前的正常输出,错误之后的就不能输出。for循环中的数据都被执行了。
曾经就因为try…catch的范围太大,导致程序出了问题,却被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