默认重启策略
详见:
https://www.malaoshi.top/show_1IX22HJXWTFE.html
演示
nc启动
执行下面命令:
nc -lk 9999
java
不需要额外编写代码
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);//自动模式,根据数据源自行判断]
// 必设置,每隔 1000 ms 执行一次checkpoint。
env.enableCheckpointing(5000);//一般秒级、分钟级
//设置RocksDB
env.setStateBackend(new FsStateBackend("file:///D:/bigdata/flink_java/state/fs"));
// env.setStateBackend(new RocksDBStateBackend("file:///D:/bigdata/flink_java/state/RocksDB",true));
// 设置2个checkpoint之间最少等待时间
// 这里至少要等到500ms
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
//checkpoint容忍的错误数量,达到此数量,就让该任务失败,默认值是:0
//这里容忍10个错误
env.getCheckpointConfig().setTolerableCheckpointFailureNumber(10);
//取消任务时,是否清理checkpoint
// true:取消任务时,会删除外部checkpoint,默认值
// false:取消任务时,保留外部checkpoint
//这里设置不删除
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
//设置checkpoint的执行模式:EXACTLY_ONCE,默认
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 设置checkpoint的超时时间,如果在60s内尚未完成说明本次checkpoint失败,则丢弃
env.getCheckpointConfig().setCheckpointTimeout(60000);//这里设置10分钟
// 设置同一时间有多少个checkpoint可以同时执行。与 env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500); 可能冲突
//env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);//默认为1
DataStream<String> dataStream = env.socketTextStream("hadoop1", 9999);
SingleOutputStreamOperator<Tuple2<String, Integer>> soso=dataStream.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String s) throws Exception {
Tuple2<String, Integer> res=null;
try {
String[] arr = s.split(",");
res=Tuple2.of(arr[0], Integer.parseInt(arr[2]));
}catch (Exception e){
System.out.println("发生错误::"+e.toString());
throw e;//抛出的异常不会打印
}
return res;
}
});
KeyedStream<Tuple2<String, Integer>,String> ks=soso.keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
@Override
public String getKey(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
return stringIntegerTuple2.f0;
}
});//流处理中的分组
SingleOutputStreamOperator<Tuple2<String, Integer>> soso2=ks.sum(1);
soso2.print();
env.execute();
}
测试
启动java
在 nc 命令下执行:
20211001,09:30:00,60
20211001,09:33:00,80
故意输入错误格式的数据:
abc
打印 catch 中的错误信息,但 抛出的异常不会打印
然后继续输入正确格式的数据:
20211001,09:53:00,40
程序还会继续执行
反复输入错误格式的数据,程序都可以重复启动,继续执行