flink(8) 状态 checkpoint 状态一致性

flink中的状态

 

由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态

可以认为状态就是一个本地变量,可以背任务的业务逻辑访问

什么是状态?状态是针对每个算子而言,在每个并行任务中用于计算结果的数据

可以看作是一个本地变量:一般放在本地内存:flink会统一进行数据类型的管理,方便进行读写传输以及容错保证

flink会进行状态管理,包括状态一致性,故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑

flink 有两种类型的状态 1.算子状态(OperatorState)2.键控状态(Keyed State)

两种类型的区别在于作用域 operator state 针对当前任务所有输入的数据可见,当前任务输入的所有数据都可以访问同一份状态

keyed state 状态只针对当前key的数据可见 对每个key维护和管理一份状态实例

算子状态(OperatiorState)

算子状态的作用范围限定为算子任务,由同一并行任务所处理的所有数据都可以访问到相同的状态

状态对于同一子任务而言时共享的

算子状态不能由相同或不同算子的另一个子任务访问

算子状态数据结构

列表状态(List state)

将状态表示为一组数据的列表

联合列表状态(Union list state)

也将状态表示为数据的列表。它与常规列表的状态的区别在于,在发生故障时,或者从保存点启动应用程序是如何恢复

广播状态 (Broadcast state)

如果一个算子有多项任务,而他的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态

 

键控状态(Keyed State)

键控状态是根据输入数据流中定义的键(Key)来维护和访问的

Flink为每个Key维护一个状态实例,并将具有相同键所有的数据,都分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态

当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的key

 

键控状态数据结构

值状态(Value state)

 将状态表示为单个的值

列表状态(List state)

将状态表示为一组数据的列表

映射状态(Map state)

将状态表示为一组key value

聚合状态(Reducing state&Aggregating state)

将状态表示为一个用于聚合操作的列表

代码调用 各种类型的 state

object StateTest {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val inputDataStream: DataStream[String] = env.socketTextStream("127.0.0.1", 9436)

    val dataStream = inputDataStream.map(data => {
      val dataArray = data.split(",")
      SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
    })

    env.execute("state test job")

  }
}
//在keyedProcessFunction 中使用各种状态
class MyProcessor extends  KeyedProcessFunction[String,SensorReading,Int]{
//valuestate     liststate     mapstate  参数都是name 以及 里面的类型声明
//  lazy  val myState:ValueState[Int] = getRuntimeContext.getState(new ValueStateDescriptor[Int]("mystate",classOf[Int]))

  lazy  val myListState:ListState[String] = getRuntimeContext.getListState(new ListStateDescriptor[String]("myliststate",classOf[String]))
  lazy  val myMapState:MapState[String,Double] = getRuntimeContext.getState(new MapStateDescriptor[String,Double]("mymapstate",classOf[String],classOf[Double]))
   // reducingState 跟其他的state不同的是 需要传一个reduce函数 这里传了一个匿名类 其实也可以 自定义一个函数类实现
  lazy  val myReducingState:ReducingState[SensorReading] = getRuntimeContext.getReducingState(new ReducingStateDescriptor[SensorReading]("myreducing_state",new ReduceFunction[SensorReading] {
    override def reduce(t: SensorReading, t1: SensorReading): SensorReading = {
      SensorReading(t.id,t1.timestamp.max(t.timestamp),t.temperature.min(t1.temperature))
    }
  },classOf[SensorReading]))

  var myState:ValueState[Int] =_
  override def open(parameters: Configuration): Unit = {
    myState= getRuntimeContext.getState(new ValueStateDescriptor[Int]("mys
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值