Flink_状态管理

Flink状态
算子状态Opertaion
键控状态KeyedState ***********
状态后端

一:状态就是本地变量(分布式系统):Flink中的状态:为了得到最新输出(reduce |window) 依赖另外的数据。这些数据就叫做状态。本地变量。
二:状态的类型
1.算子状态(Operator State) 当前算子任务都能访问到
a:List state 将状态表示为一组数据的列表
Union State
c:广播状态 broadcast state`

	2.键控状态(Keyed State) 不同的key访问不同状态 更常用。 key by 之后。
			键控状态 对每一个key都保存了自己的状态
			       value state
			       list state`
			  	Map state
			  	Reducing state & Aggregating State 将状态表示为一个用于聚合操作的列表

三:状态编程
//状态必须用RichFunction
class MyRichMapper extends RichMapFunction[SensorReading,String]{
var valueState: ValueState[Double]=_
lazy val listState: ListState[Int] = getRuntimeContext.getListState(new ListStateDescriptor[Int](“liststate”, classOf[Int]))
lazy val mapState: MapState[String, Double] = getRuntimeContext.getMapState(new MapStateDescriptorString,Double)
lazy val reduceState: ReducingState[SensorReading] = getRuntimeContext.getReducingState(new ReducingStateDescriptor[SensorReading](“reducestate”,new MyReduce,classOf[SensorReading]))
override def open(parameters: Configuration): Unit = {
//获取状态 直接得到value state
valueState= getRuntimeContext.getState(new ValueStateDescriptorDouble)
}
override def map(value: SensorReading): String = {
//使用valuestate
val myValue: Double = valueState.value()
val list = new util.ArrayListInt
listState.addAll(list)
mapState.contains(“sensor_1”)
val vl: Double = mapState.get(“sensor_1”)
mapState.put(“sensor_1”,value.temperature)
val lists: lang.Iterable[Int] = listState.get()
val sensoreading: SensorReading = reduceState.get()
reduceState.add(value)
//状态读写操作
valueState.update(value.temperature)
value.id
}
}
四:案例 要求传感器如果跳变超过10度输出报警信息。温度跳变
Bug :第一次温度未做判断
package com.atguigu.state

import java.{lang, util}

import com.atguigu.sourceandsink.SensorReading
import com.atguigu.window.MyReduce
import org.apache.flink.api.common.functions.{RichFlatMapFunction, RichMapFunction}
import org.apache.flink.api.common.state._
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

object StateTest {
def main(args: Array[String]): Unit = {
//设置时间语义 默认
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.getConfig.setAutoWatermarkInterval(50)
val inputStream: DataStream[String] = env.socketTextStream(“localhost”,7777)

//提取eventtime
val dataStream: DataStream[SensorReading] = inputStream.map(data => {
  val strings: Array[String] = data.split(",")
  SensorReading(strings(0), strings(1).toLong, strings(2).toDouble)
})
val alertStream: DataStream[(String, Double, Double)] = dataStream
  .keyBy(_.id)
  .flatMap(new TempChangeAlert(10.0))
alertStream.print("alertStream")
//状态编程

env.execute("state test")

}
}
//实现自定义RichFlatmapFunction
class TempChangeAlert(threshold:Double) extends RichFlatMapFunction[SensorReading,(String,Double,Double)]{
//定义状态
lazy val lastTempState: ValueState[Double] = getRuntimeContext.getState(new ValueStateDescriptorDouble)

//每一个数据都调用这里

override def flatMap(value: SensorReading, out: Collector[(String, Double, Double)]): Unit = {
//flatmap用collect输出
val lastTemp: Double = lastTempState.value()
val diff: Double = (value.temperature-lastTemp).abs
if(diff>threshold){ //如果温差大于10度 输出温度
out.collect((value.id,lastTemp,value.temperature))
}
//更新状态
lastTempState.update(value.temperature)
}

}
//状态必须用RichFunction
class MyRichMapper extends RichMapFunction[SensorReading,String]{
var valueState: ValueState[Double]=_
lazy val listState: ListState[Int] = getRuntimeContext.getListState(new ListStateDescriptor[Int](“liststate”, classOf[Int]))
lazy val mapState: MapState[String, Double] = getRuntimeContext.getMapState(new MapStateDescriptorString,Double)
lazy val reduceState: ReducingState[SensorReading] = getRuntimeContext.getReducingState(new ReducingStateDescriptor[SensorReading](“reducestate”,new MyReduce,classOf[SensorReading]))
override def open(parameters: Configuration): Unit = {
//获取状态 直接得到value state
valueState= getRuntimeContext.getState(new ValueStateDescriptorDouble)
}
override def map(value: SensorReading): String = {
//使用valuestate
val myValue: Double = valueState.value()
val list = new util.ArrayListInt
listState.addAll(list)
mapState.contains(“sensor_1”)
val vl: Double = mapState.get(“sensor_1”)
mapState.put(“sensor_1”,value.temperature)
val lists: lang.Iterable[Int] = listState.get()
val sensoreading: SensorReading = reduceState.get()
reduceState.add(value)
//状态读写操作
valueState.update(value.temperature)
value.id
}
}

//简单形式 可以避免首次输出
val alerStream: DataStream[(String, Double, Double)] = dataStream
.keyBy(_.id)
//.flatMap(new TempChangeAlert(10.0))
.flatMapWithState[(String, Double, Double), Double] {
case (data: SensorReading, None) => (List.empty, Some(data.temperature))
case (data: SensorReading, lasTemp: Some[Double]) => {
val diff: Double = (data.temperature - lasTemp.get).abs
if (diff > 10.0) { //如果温差大于10度 输出温度
(List((data.id, lasTemp.get, data.temperature)), Some(data.temperature))
}
else (List.empty, Some(data.temperature))
}
}
package com.atguigu.state

import java.{lang, util}

import com.atguigu.sourceandsink.SensorReading
import com.atguigu.window.MyReduce
import org.apache.flink.api.common.functions.{RichFlatMapFunction, RichMapFunction}
import org.apache.flink.api.common.state._
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

object StateTest {
def main(args: Array[String]): Unit = {
//设置时间语义 默认
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.getConfig.setAutoWatermarkInterval(50)
val inputStream: DataStream[String] = env.socketTextStream(“localhost”,7777)

//提取eventtime
val dataStream: DataStream[SensorReading] = inputStream.map(data => {
  val strings: Array[String] = data.split(",")
  SensorReading(strings(0), strings(1).toLong, strings(2).toDouble)
})
val alerStream: DataStream[(String, Double, Double)] = dataStream
  .keyBy(_.id)
  //.flatMap(new TempChangeAlert(10.0))
  .flatMapWithState[(String, Double, Double), Double] {
  case (data: SensorReading, None) => (List.empty, Some(data.temperature))
  case (data: SensorReading, lasTemp: Some[Double]) => {
    val diff: Double = (data.temperature - lasTemp.get).abs
    if (diff > 10.0) { //如果温差大于10度 输出温度
      (List((data.id, lasTemp.get, data.temperature)), Some(data.temperature))
    }
    else (List.empty, Some(data.temperature))
  }
}
alerStream.print("alertStream")
//状态编程

env.execute("state test")

}
}
//实现自定义RichFlatmapFunction
class TempChangeAlert(threshold:Double) extends RichFlatMapFunction[SensorReading,(String,Double,Double)]{
//定义状态
lazy val lastTempState: ValueState[Double] = getRuntimeContext.getState(new ValueStateDescriptorDouble)

//每一个数据都调用这里

override def flatMap(value: SensorReading, out: Collector[(String, Double, Double)]): Unit = {
//flatmap用collect输出
val lastTemp: Double = lastTempState.value()
val diff: Double = (value.temperature-lastTemp).abs
if(diff>threshold){ //如果温差大于10度 输出温度
out.collect((value.id,lastTemp,value.temperature))
}
//更新状态
lastTempState.update(value.temperature)
}

}
//状态必须用RichFunction
class MyRichMapper extends RichMapFunction[SensorReading,String]{
var valueState: ValueState[Double]=_
lazy val listState: ListState[Int] = getRuntimeContext.getListState(new ListStateDescriptor[Int](“liststate”, classOf[Int]))
lazy val mapState: MapState[String, Double] = getRuntimeContext.getMapState(new MapStateDescriptorString,Double)
lazy val reduceState: ReducingState[SensorReading] = getRuntimeContext.getReducingState(new ReducingStateDescriptor[SensorReading](“reducestate”,new MyReduce,classOf[SensorReading]))
override def open(parameters: Configuration): Unit = {
//获取状态 直接得到value state
valueState= getRuntimeContext.getState(new ValueStateDescriptorDouble)
}

override def map(value: SensorReading): String = {
//使用valuestate
val myValue: Double = valueState.value()
val list = new util.ArrayListInt
listState.addAll(list)
mapState.contains(“sensor_1”)
val vl: Double = mapState.get(“sensor_1”)
mapState.put(“sensor_1”,value.temperature)
val lists: lang.Iterable[Int] = listState.get()
val sensoreading: SensorReading = reduceState.get()
reduceState.add(value)
//状态读写操作
valueState.update(value.temperature)
value.id
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值