Flink-状态之checkpointing与State Backend

在flink里,算法基本上带有状态的,而在我们处理元素或事件时状态会存储数据。为了让大烽据框架的状态有容错功能,flink提出checkpointing机制。

一、checkpointing 与 flink容错机制

当错误或异常发生时,checkpointing允许flink去恢复状态以及流所在的位置。

Flink's checkpointing实现机制是将数据流与状态永久存储在某一个地方,因此让flink拥有容错机制,需要有两个前置条件:

  • 1.必须拥有持久化或可靠的数据源,该数据源可以在一定的时间范围内提供回放记录的功能(replay records for certian of time);比例:kafka、rabbitmq、amazon kinese、google pubsub 或 分布式文件系统 hdfs、s3、gfs、nfs、ceph...等
  • 2.状态的持久化存储,典型的是使用分布式文件存储;比如hdfs、s3、gfs、nfs、ceph...等

如何开启及配置checkpointing功能

默认情况下,flink在checkpointing是disabled(禁用)的,开启方法:enableCheckpointing(n)) on StreamExecutionEnvironment。

n代表时间

checkpointing相关参数

  • exactly-once vs at-least-once:精准消费一次/至少消费一次。配置方法是通过enableCheckpointing(n)相关操作选择两种模式之一。在大部份情况下,exactly-once是比较好的一个选择。 at-least-once用在对于低延迟只有的环情况(比如只可延迟几毫秒)。
  • checkpoint timeout: checkpoint过程当中所消耗时间的设置,保存不超时或超时中断
  • minimum time between checkpoints:最小时间,在两个checkpointing之间。如果该值设定为5000,而下一个checkpoint一般会上一个checkpoint结束后5秒开始。
  • number of cocurrent checkpoints:并发checkpoint的数量。默认只要有一个checkpoint进程正在运行另外一个不会触发。
  • externalized checkpoints:可配置一个周期性的外部持久化的checkpoints。通过该功能可以将元数据信息等写到外部的存储中,此种方式下当job运行过程中出现异常,flink不会自动删除这些外部存储的checkpoint数据或信息。该模式中以让flink出现异常或操作中断时从外部存储的数据点中恢复数据。
  • fail/continue task on checkpoint erros: 当失败发生时,是继续执行还是中断操作。默认为中断执行。
  • prefer checkpoint for recovery:优先从checkpoints点中恢复数据
  • unaliged checkpoints:

代码

ini 复制代码
package com.flink.state;

import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class CheckpointApp {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //env.enableCheckpointing(5000, CheckpointingMode.EXACTLY_ONCE);
        env.enableCheckpointing(5000);
        DataStreamSource<String> source = env.socketTextStream("localhost",9527);

        source.print();

        env.execute("CheckPointApp");
    }

}

checkpoint重启策略

重启策略与故障恢复策略,来控制任务的重启。重启策略决定了(是否或什么时候)以什么方式重启。故障恢复策略决定任务恢复的点。

策略清单

设定重启策略

重启策略片段

详情看官网

重启策略举例

java 复制代码
package com.flink.state;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class CheckpointApp {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //env.enableCheckpointing(5000, CheckpointingMode.EXACTLY_ONCE);
        /**
         * 不开启checkpoint:不重启
         * 开启了checkpoint:
         * 1) 没有配置重启策略: Integer。MAX_VALUE
         * 2) 如果配置了重启策略,就使用我们配置的重启策略覆盖默认的
         *
         * 重启策略的配置
         * 1) code
         * 2) yaml
         */
        env.enableCheckpointing(5000);
        env.setRestartStrategy(
                //偿试3次,间隔5秒。
                RestartStrategies.fixedDelayRestart(3, Time.of(5, TimeUnit.SECONDS))
        );
        DataStreamSource<String> source = env.socketTextStream("localhost",9527);
        source.map(new MapFunction<String, String>() {
            @Override
            public String map(String value) throws Exception {
                if (value.contains("pk")){
                    throw new RuntimeException("PK哥来了,快跑..!");
                }else{
                    return value.toLowerCase(Locale.ROOT);
                }
            }
        }).flatMap(new FlatMapFunction<String, String>() {
            @Override
            public void flatMap(String value, Collector<String> out) throws Exception {
                String[] splits =  value.split(",");
                for (String split : splits) {
                    out.collect(split);
                }
            }
        }).map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String value) throws Exception {
                return Tuple2.of(value,1);
            }
        }).keyBy(x -> x.f0).sum(1).print();

        //source.print();

        env.execute("CheckPointApp");
    }

}

ExternalizedCheckpointsCleanUp

当作业失败或人工取消息时,是否可留之前的checkpoint记录

scss 复制代码
 //当job取消以后,是否清楚外部的checkpoint记录
//是否保留       

env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

在文件模式中:即便用了,保要指定checkpoint路径,照样可以重复恢复。

相关推荐
canonical_entropy5 分钟前
API无缝升级方案:从推模式到拉模式的架构演进
后端·restful·graphql
源码之家5 分钟前
基于python租房大数据分析系统 房屋数据分析推荐 scrapy爬虫+可视化大屏 贝壳租房网 计算机毕业设计 推荐系统(源码+文档)✅
大数据·爬虫·python·scrapy·数据分析·推荐算法·租房
源码之家10 分钟前
机器学习:基于python租房推荐系统 预测算法 协同过滤推荐算法 房源信息 可视化 机器学习-线性回归预测模型 Flask框架(源码+文档)✅
大数据·python·算法·机器学习·数据分析·线性回归·推荐算法
摆烂工程师12 分钟前
今天 Cloudflare 全球事故,连 GPT 和你的网站都一起“掉线”了
前端·后端·程序员
llilian_1612 分钟前
智能数字式毫秒计在实际生活场景中的应用 数字式毫秒计 智能毫秒计
大数据·网络·人工智能
追逐时光者40 分钟前
快速构建一个基础、现代化的 WinForm 管理系统
后端·.net
打码人的日常分享42 分钟前
基于信创体系政务服务信息化建设方案(PPT)
大数据·服务器·人工智能·信息可视化·架构·政务
搞科研的小刘选手2 小时前
【EI稳定】检索第六届大数据经济与信息化管理国际学术会议(BDEIM 2025)
大数据·人工智能·经济
在人间负债^2 小时前
Rust 实战项目:TODO 管理器
开发语言·后端·rust
一水鉴天2 小时前
整体设计 全面梳理复盘 之39 生态工具链 到顶级表征及其完全公理化
大数据·人工智能·算法