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

最低0.47元/天 解锁文章
856

被折叠的 条评论
为什么被折叠?



