flink遇到的错误以及处理

  • Post author:
  • Post category:其他




一,减少出错tips



1,增加try catch

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住,导致程序看着是正常的,但其实数据有问题。



2,增加重启策略env.setRestartStrategy

增加重启策略是十分必要的,增加之后如果程序有遇到错误会在不被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掉。



二,java.util.concurrent.TimeoutException: Heartbeat of TaskManager with id container_



1,心跳超时

错误形式

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



2,错误分析

上面报错说明是tm跟jm的心跳超时,心跳超时原因很多,比如JM内存不足/TM内存不足导致的FGC。



3,处理方式

把心跳时间设置长一些

-yD heartbeat.timeout=500000

flink重启策略:https://www.cnblogs.com/xyniu/p/15130566.html

心跳超时: http://www.kuazhi.com/post/314144.html



版权声明:本文为w417950004原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。