关于Flink的checkpoint的案例演示

  • 编写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自动重启恢复案例

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值