Flink之State状态编程

Flink中的状态State

State分类

在这里插入图片描述

State[ValueState、ReadOnlyBroadcastState、MapStateAppendingState]
AppendingState[FoldingState、MergingState]
FoldingState在flink1.4之后就弃用了,官方建议用AggregatingState代替
MergingState[ListStateAggregatingStateReducingState]


在flink中,状态始终与特定算子相关联,像reduce、sum等算子都是默认带状态的,而map、flatmap本身时不带状态的,如果需要用到状态,可以自定义

为了使运行的flink了解算子的状态,算子需要预先注册其状态

总的来说,有2种类型的状态

  • 算子状态(Operator State)

    算子状态的作用范围限定为算子任务

  • 键控状态(keyed State):生产中应用案例较多

    根据输入数据流中定义的key来维护和访问
    不管是哪种类型的State,都有2种不同的状态,raw(原生状态)、managed(Flink设定好的状态)

managed状态由Flink-runtime控制,类似于RocksDB、HashTable、Fs;类似于ValueState、ListState,Flink-runtime能将状态进行特定的编码,然后写入到检查点,所有的算子都能使用managed-state

raw状态而是将state维护在自己的数据结构,当checkpoint的时候,只会将state以序列化的形式写进checkpoint,flink只能看到原生的字节,而对state的数据结构一无所知

所以官方建议:统一使用Managed State

All datastream functions can use managed state, but the raw state interfaces can only be used when implementing operators. Using managed state (rather than raw state) is recommended, since with managed state Flink is able to automatically redistribute state when the parallelism is changed, and also do better memory management.

算子状态(Operator State)

算子作用图

在这里插入图片描述

算子状态的数据结构(non-keyed state)

1、列表状态(list state)

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

2、联合列表状态(union list state)

将状态表示成一组数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)进行启动应用程序时如何恢复

3、广播状态(broadcast state)

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

键控状态(keyed State)

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

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

键控状态图

在这里插入图片描述

键控状态的数据结构

1、值状态(value state)

将状态表示单个的值,通过getState()获取状态值

2、列表状态(list state)

将状态表示为一组数据的列表,通过getListState()获取状态值

3、映射状态(map state)

将状态表示成一组key-value对,通过getMapState()获取状态值

4、聚合状态(reducing state & aggregating state)

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

键控状态的使用(值状态示例)
//1.声明一个键控状态
lazy val lastTemp: state.ValueState[Double] = getRuntimeContext.getState(new ValueStateDescriptor[Double]("lastTemp", classOf[Double]))
//2.读取状态
lastTemp.value()
//3.更新状态值
lastTemp.update(newTemp)
状态后端(state backends)

MemoryStateBackend(一般用于测试环境)

FsStateBackend(将checkpoint存在文件系统中,本地状态还是存在taskmanager本地内存中,不适合超大状态的存储)

RocksDBStateBackend(将所有状态序列化后,存入本地RocksDB(kv存储介质)中存储)
rocksDBStateBackend需要引入相应的maven依赖
摸摸哒摸摸哒摸摸哒wwwwwwwwwwwww

状态编程的简单示例

package com.shufang.flink.state

import com.shufang.flink.bean.SensorReading
import org.apache.flink.api.common.functions.RichFlatMapFunction
import org.apache.flink.api.common
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值