• flink---state详解


    state含义+state作用

    1. 在流处理过程中那些需要记住的数据,而这些数据既可以包括业务数据,也可以包括元数据。Flink 本身提供了不同的状态管理器来管理状态,并且这个状态可以非常大。
      所谓的状态,其实指的是Flink 程序的中间计算结果。Flink 支持了不同类型的状态,并且针对状态的持久化还提供了专门的机制和状态管理器。
    1. 我们知道,Flink的一个算子有多个子任务,每个子任务分布在不同实例上,我们可以把状态理解为某个算子子任务在其当前实例上的一个变量,变量记录了数据流的历史信息。当新数据流入时,我们可以结合历史信息来进行计算。实际上Flink的状态是由算子的子任务来创建和管理的。一个状态更新和获取的流程如下图所示,一个算子子任务接收输入流,获取对应的状态,根据新的计算结果更新状态。一个简单的例子是对一个时间窗口内输入流的某个整数字段求和,那么当算子子任务接收到新元素时,会获取已经存储在状态中的数值,然后将当前输入加到状态上,并将状态数据更新。
      在这里插入图片描述

    state参数

    1. state参数主要是对state的有效时间进行设置,有的state状态过大,处于无限增长,有的甚至会触发法律问题,因此需要state参数来进行ttl过期时间等的设置
    1. 过期时间
      newBuilder 方法的参数是必需的,表示状态的过期时间,是一个 org.apache.flink.api.common.time.Time 对象。可以简单的认为一旦设置了 TTL,那么如果上次访问的时间戳 + TTL 超过了当前时间,那么表明状态过期了(实际上更复杂一些)。
    1. state的时间处理语义
      TtlTimeCharacteristic 表示 State TTL 功能可以使用的时间处理语义:截止到目前 Flink 1.14,只支持 ProcessingTime 时间处理语义。EventTime 处理语义还在开发中
    public enum TtlTimeCharacteristic {
        ProcessingTime
    }
    
    • 1
    • 2
    • 3

    4.更新类型
    UpdateType 表示状态时间戳(上次访问时间戳)的更新时机:

    public enum UpdateType {
        Disabled,
        OnCreateAndWrite,
        OnReadAndWrite
    }	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果设置为 Disabled,则表示禁用 TTL 功能,状态不会过期;如果设置为 OnCreateAndWrite,那么表示在状态创建或者每次写入时都会更新时间戳;如果设置为 OnReadAndWrite,那么除了在状态创建和每次写入时更新时间戳外,读取状态也会更新状态的时间戳。如果不配置默认为 OnCreateAndWrite。

    1. 状态可见性
      StateVisibility 表示状态可见性,在读取状态时是否返回过期值:
    public enum StateVisibility {
        ReturnExpiredIfNotCleanedUp,
        NeverReturnExpired
    }
    
    • 1
    • 2
    • 3
    • 4

    如果设置为 ReturnExpiredIfNotCleanedUp,那么当状态值已经过期,但还未被真正清理掉,就会返回给调用方;如果设置为 NeverReturnExpired,那么一旦状态值过期了,就永远不会返回给调用方,只会返回空状态。

    参数实践代码

    StateTtlConfig ttlConfig = StateTtlConfig
                    .newBuilder(Time.seconds(300))    //设置具体的过期时间
                    .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) //表示state的更新时间   
    
                    .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) //状态可见性
      .setTtlTimeCharacteristic(StateTtlConfig.TtlTimeCharacteristic.ProcessingTime)  //state的时间处理语义
                    .build();    // 通过build来执行
    
            ValueStateDescriptor<Integer> stateDescriptor = new ValueStateDescriptor<>("count-state", Integer.class); 
            stateDescriptor.enableTimeToLive(ttlConfig);   //生成ValueStateDescriptor对象,并设置state参数,ValueStateDescriptor对象用于后面的state的获得和更改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    state重点概念

    1. state是基于本地的,而且state其实是针对不同子任务的,即针对slot的!!!!!!
    2. 一个算子子任务可以对应多个state,并非一对一,具体如key state
  • 相关阅读:
    推理框架概览
    分享教学项目:开源一个对象映射框架
    BGP基础
    我做了一个 VSCode 插件版的 ChatGPT
    COOIS 生产订单显示系统增强
    无线传感器网络:网络层
    【数据结构】模拟实现queue
    java计算机毕业设计专业招聘网站(附源码、数据库)
    【网页设计】期末大作业html+css+js(在线鲜花盆栽网站)
    Python低溫半导体电子束量子波算法计算
  • 原文地址:https://blog.csdn.net/qq_37296285/article/details/126841127