大数据技术之flink(5)

本文详细介绍了Apache Flink的状态管理和容错机制,包括算子状态和键控状态,以及Flink如何通过检查点实现exactly-once语义。此外,还讨论了状态一致性级别和端到端一致性,以及Flink如何与Kafka配合实现数据源和数据接收的exactly-once。最后,提到了不同状态后端的选择,如MemoryStateBackend、FsStateBackend和RocksDBStateBackend。
摘要由CSDN通过智能技术生成

前言

你们好我是啊晨
继续更新Flink技术。
废话不多说,内容很多选择阅读,详细。
请:

第九章 状态编程和容错机制

流式计算分为无状态有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过 90 度时发出警告。有状态的计算则会基于多个事件输出结果。以下是一些例子。
所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算。
所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差 20 度以上的温度读数,则发出警告,这是有状态的计算。
流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作,都是有状态的计算。
下图展示了无状态流处理和有状态流处理的主要区别。无状态流处理分别接收每条数据记录(图中的黑条),然后根据最新输入的数据生成输出数据(白条)。有状态流处理会维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的状态值生成输出记录(灰条)。
在这里插入图片描述
上图中输入数据由黑条表示。无状态流处理每次只转换一条输入记录,并且仅根据最新的输入记录输出结果(白条)。有状态 流处理维护所有已处理记录的状态值,并根据每条新输入的记录更新状态,因此输出记录(灰条)反映的是综合考虑多个事件之后的结果。
尽管无状态的计算很重要,但是流处理对有状态的计算更感兴趣。事实上,正确地实现有状态的计算比实现无状态的计算难得多。旧的流处理系统并不支持有状态的计算,而新一代的流处理系统则将状态及其正确性视为重中之重,SparkStreaming flink

状态:由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态。
可以认为状态是一个本地变量,可以被任务的业务逻辑访问,获取值更新值。
Flink会进行状态管理,包括状态的一致性、故障的处理以及高效的存储和访问,以及便于程序开发人员可以专注的处理应用程序的业务逻辑
状态始终与特定的算子相关联 为了运行时的Flink了解算子的状态,算子需要先注册状态

9.1 有状态的算子和应用程序

Flink 内置的很多算子,数据源 source,数据存储 sink 都是有状态的,流中的数据都是 buffer records(缓冲区记录),会保存一定的元素或者元数据。例如: ProcessWindowFunction会缓存输入流的数据,ProcessFunction 会保存设置的定时器信息等等。
在 Flink 中,状态始终与特定算子相关联。总的来说,有两种类型的状态:

算子状态(operator state)也叫none key状态,算子的状态作用范围限定为算子任务
键控状态(keyedstate)根据输入流数据中定义的key维护和访问

9.3.1 算子状态(operator state)

算子状态(None key状态)的作用范围限定为算子任务。这意味着由同一并行任务所处理的所有数据都可以访问到相同的状态,状态对于同一任务而言是共享的。算子状态不能由相同或不同算子的另一个任务访问。
在这里插入图片描述

算子状态作用范围限定的任务,由同一并行任务所处理的所有数据都可以访问到相同的状态
状态对于同一任务而言是共享的
算子状态不能由相同或者不同算子的另一个任务访问

Flink 为算子状态提供三种基本数据结构:

状态数据结构
列表状态List state 将状态表示为一组数据的列表。
联合列表状态Union list state 也将状态表示为数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复,如果有多并行度的时候怎么去分发怎么去恢复。列表状态会根据并行度的调整,直接把之前状态重新分组重新分配。联合列表状态相当于会把之前每一个的状态广播到每一个算子中去。
广播状态Broadcast state 如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态。 把同一状态广播到所有的子任务中去。

9.3.2 键控状态(keyed state)

键控状态是根据输入数据流中定义的键(key)来维护和访问的。Flink 为每个键值维护
一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护
和处理这个 key 对应的状态。当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的 key。因此,具有相同 key 的所有数据都会访问相同的状态。Keyed State 很类似于一个分布式的 key-value map 数据结构,只能用于 KeyedStream(keyBy 算子处理之后)。
在这里插入图片描述
建控状态是根据输入数据流中定义的Key来维护和访问
为每一个key维护一个状态实例,并且将具有相同key的所有数据都分区到同一个算子任务中,这个任务会维护处理这个key对应的状态
当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的key值状态
Flink 为keyedstate 键控状态提供四种基本数据结构:
在这里插入图片描述

Flink 的 Keyed State 支持以下数据类型:

值状态(value state):ValueState[T]保存单个的值,值的类型为 T。 valueState.update()
valueState.value()

ListState[T]保存一个列表,列表里的元素的数据类型为 T。基本操作如下:

ListState.add(value: T)
ListState.addAll(values: java.util.List[T])
ListState.get()返回 Iterable[T]
ListState.update(values:
java.util.List[T])

MapState[K, V]保存 Key-Value 对。

MapState.get(key: K)
MapState.put(key: K, value: V)
MapState.contains(key: K)//判断是否包含指定的key MapState.remove(key: K)

ReducingState[T]
AggregatingState[I, O]

State.clear()是清空操作。

val sensorData: DataStream[SensorReading] =...
val keyedData: KeyedStream[SensorReading, String] = sensorData.keyBy(_.id)
val alerts: DataStream[(String, Double, Double)] = keyedData
  .flatMap(new TemperatureAlertFunction(1.7))

class TemperatureAlertFunction(val threshold: Double) extends
  RichFlatMapFunction[SensorReading, (String, Double, Double)] {
  private var lastTempState: ValueState[Double] = _

  override def open(parameters: Configuration): Unit = {
    val lastTempDescriptor = new ValueStateDescriptor[Double]("lastTemp",
      classOf[Double])
    lastTempState = getRuntimeContext.getState[Double](lastTempDescriptor)
  }

  override def flatMap(reading: SensorReading,
                       out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值