- 编写Flink入门案例程序,词频统计WordCount,自定义数据源,产生数据:
spark flink
,设置Checkpoint,运行程序,查看Checkpoint检查点数据存储。
代码:
// TODO: ================= 建议必须设置 ===================
// a. 设置Checkpoint-State的状态后端为FsStateBackend,本地测试时使用本地路径,集群测试时使用传入的HDFS的路径
if (args.length < 1) {
env.setStateBackend(new FsStateBackend("file:///D:/datas/ckpt"));
//env.setStateBackend(new FsStateBackend("hdfs://node1.itcast.cn:8020/flink-checkpoints/checkpoint"));
} else {
// 后续集群测试时,传入参数:hdfs://node1.itcast.cn:8020/flink-checkpoints/checkpoint
env.setStateBackend(new FsStateBackend(args[0]));
}
/*
b. 设置Checkpoint时间间隔为1000ms,意思是做 2 个 Checkpoint 的间隔为1000ms。
Checkpoint 做的越频繁,恢复数据时就越简单,同时 Checkpoint 相应的也会有一些IO消耗。
*/
env.enableCheckpointing(1000);// 默认情况下如果不设置时间checkpoint是没有开启的
/*
c. 设置两个Checkpoint 之间最少等待时间,如设置Checkpoint之间最少是要等 500ms
为了避免每隔1000ms做一次Checkpoint的时候,前一次太慢和后一次重叠到一起去了
如:高速公路上,每隔1s关口放行一辆车,但是规定了两车之前的最小车距为500m
*/
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// d. 设置如果在做Checkpoint过程中出现错误,是否让整体任务失败:true是 false不是
env.getCheckpointConfig().setFailOnCheckpointingErrors(false); // 默认为true
// 设置Checkpoint时失败次数,允许失败几次
env.getCheckpointConfig().setTolerableCheckpointFailureNumber(3); //
/*
e. 设置是否清理检查点,表示 Cancel 时是否需要保留当前的 Checkpoint,默认 Checkpoint会在作业被Cancel时被删除
ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION:false,当作业被取消时,保留外部的checkpoint
ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION:true,当作业被取消时,删除外部的checkpoint(默认值)
*/
env.getCheckpointConfig().enableExternalizedCheckpoints(
CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
);
// ================= 直接使用默认的即可 ===============
// a. 设置checkpoint的执行模式为EXACTLY_ONCE(默认),注意:需要外部支持,如Source和Sink的支持
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// b. 设置checkpoint的超时时间,如果 Checkpoint在 60s内尚未完成说明该次Checkpoint失败,则丢弃。
env.getCheckpointConfig().setCheckpointTimeout(60000);
// c. 设置同一时间有多少个checkpoint可以同时执行
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 默认为1
// ===========================================================================================
代码中加上上述针对Checkpoint设置代码,完整代码如下:
/**
* @author liu a fu
* @version 1.0
* @date 2021/3/9 0009
* @DESC 针对前面Checkpoint程序,设置自动重启策略,运行程序。 Flink Checkpoint定时保存状态State,演示案例
*/
public class StreamRestartStrategyDemo {
public static void main(String[] args) throws Exception {
// 1. 执行环境-env
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1) ;
// TODO: ================= 建议必须设置 ===================
// a. 设置Checkpoint-State的状态后端为FsStateBackend,本地测试时使用本地路径,集群测试时使用传入的HDFS的路径
if (args.length < 1) {
env.setStateBackend(new FsStateBackend("file:///D:/datas/ckpt"));
//env.setStateBackend(new FsStateBackend("hdfs://node1.itcast.cn:8020/flink-checkpoints/checkpoint"));
} else {
// 后续集群测试时,传入参数:hdfs://node1.itcast.cn:8020/flink-checkpoints/checkpoint
env.setStateBackend(new FsStateBackend(args[0]));
}
/*
b. 设置Checkpoint时间间隔为1000ms,意思是做 2 个 Checkpoint 的间隔为1000ms。
Checkpoint 做的越频繁,恢复数据时就越简单,同时 Checkpoint 相应的也会有一些IO消耗。
*/
env.enableCheckpointing(1000);// 默认情况下如果不设置时间checkpoint是没有开启的
/*
c. 设置两个Checkpoint 之间最少等待时间,如设置Checkpoint之间最少是要等 500ms
为了避免每隔1000ms做一次Checkpoint的时候,前一次太慢和后一次重叠到一起去了
如:高速公路上,每隔1s关口放行一辆车,但是规定了两车之前的最小车距为500m
*/
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// d. 设置如果在做Checkpoint过程中出现错误,是否让整体任务失败:true是 false不是
env.getCheckpointConfig().setFailOnCheckpointingErrors(false); // 默认为true
// 设置Checkpoint时失败次数,允许失败几次
env.getCheckpointConfig().setTolerableCheckpointFailureNumber(3); //
/*
e. 设置是否清理检查点,表示 Cancel 时是否需要保留当前的 Checkpoint,默认 Checkpoint会在作业被Cancel时被删除
ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION:false,当作业被取消时,保留外部的checkpoint
ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION:true,当作业被取消时,删除外部的checkpoint(默认值)
*/
env.getCheckpointConfig().enableExternalizedCheckpoints(
CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
);
// ================= 直接使用默认的即可 ===============
// a. 设置checkpoint的执行模式为EXACTLY_ONCE(默认),注意:需要外部支持,如Source和Sink的支持
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// b. 设置checkpoint的超时时间,如果 Checkpoint在 60s内尚未完成说明该次Checkpoint失败,则丢弃。
env.getCheckpointConfig().setCheckpointTimeout(60000);
// c. 设置同一时间有多少个checkpoint可以同时执行
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 默认为1
// ===========================================================================================
// TODO:设置应用程序重启策略
env.setRestartStrategy(
// 重启3次,时间间隔为5s
RestartStrategies.fixedDelayRestart(3, 5000)
);
// 2. 数据源-source
DataStreamSource<String> inputDataStream = env.addSource(new RichParallelSourceFunction<String>() {
private boolean isRunning = true ;
private int counter = 0 ;
@Override
public void run(SourceContext<String> ctx) throws Exception {
while (isRunning){
// 发送数据
ctx.collect("spark flink");
counter += 1 ;
// 每隔1秒产生一条数据
TimeUnit.SECONDS.sleep(1);
if(counter % 5 == 0){
throw new RuntimeException("程序异常啦啦啦啦啦.................") ;
}
}
}
@Override
public void cancel() {
isRunning = false ;
}
});
// 3. 数据转换-transformation
SingleOutputStreamOperator<Tuple2<String, Integer>> resultDataStream = inputDataStream
.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String value, Collector<String> out) throws Exception {
for (String word : value.split("\\s+")) {
out.collect(word);
}
}
})
.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String value) throws Exception {
return Tuple2.of(value, 1);
}
})
.keyBy(0).sum(1);
// 4. 数据终端-sink
resultDataStream.printToErr();
// 5. 触发执行-execute
env.execute(StreamRestartStrategyDemo.class.getSimpleName()) ;
}
}
手动重启checkpoint及状态恢复
在Flink流式计算程序中,如果设置Checkpoint检查点以后,当应用程序运行失败,可以从检查点恢复:
- 1)、
手动重启
应用,从Checkpoint恢复状态
- 程序升级(人为停止程序)等
- 2)、
自动重启
应用,从Checkpoint恢复状态
- 程序异常时,自动重启,继续运行处理数据,比如出现“脏数据”
- 自动重启,设置最大重启次数,如果重启超过设置次数,需要人为干预,进行手动重启
将上述Flink程序,打成jar包,在Flink Cluster上提交运行
- step1、把程序打包
- step2、启动Flink集群(本地单机版,集群版都可以)
/export/server/flink/bin/start-cluster.sh
- step3、访问webUI
http://node1:8081/#/overview
- step4、使用FlinkWebUI提交
cn.itcast.flink.checkpoint.StreamCheckpointDemo
hdfs://node1.itcast.cn:8020/flink-checkpoint/checkpoint
- step5、取消任务
查看HDFS目录,Checkpoint存文件 - step6、重新启动任务并指定从哪恢复
cn.itcast.flink.checkpoint.StreamCheckpointDemo
hdfs://node1.itcast.cn:8020/flink-checkpoint/checkpoint
hdfs://node1.itcast.cn:8020/flinkcheckpoint/checkpoint/8b27ed9cfa0eb158423370f3cca3496b/chk-31
Checkpoint自动重启恢复案例