文章目录

  • state含义+state作用
  • state参数
  • 参数实践代码
  • state重点概念


state含义+state作用

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

state参数

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

public enum TtlTimeCharacteristic { ProcessingTime }

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

public enum UpdateType { Disabled, OnCreateAndWrite, OnReadAndWrite }

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

  1. 状态可见性
    StateVisibility 表示状态可见性,在读取状态时是否返回过期值:

public enum StateVisibility { ReturnExpiredIfNotCleanedUp, NeverReturnExpired }

如果设置为 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的获得和更改

state重点概念

  1. state是基于本地的,而且state其实是针对不同子任务的,即针对slot的!!!!!!
  2. 一个算子子任务可以对应多个state,并非一对一,具体如key state