在大数据技术发展历程当中,Flink框架可以说是新一轮的热点技术框架,主打流批一体的计算模式,成为更适应当下需求的技术框架,因此再也技术领域得到更多的重视。今天的大数据入门分享,我们主要来讲讲Flink框架的状态编程与容错机制。
流式计算,通常分为有状态和无状态两种情况:
无状态:无状态的计算观察每个独立事件,并根据最后一个事件输出结果。
有状态:有状态的计算则会基于多个事件输出结果。
Flink流计算理念,官方说法叫做有状态的流计算,将批处理也看作是一种特殊的“流”,即有界的流,在这样的指导思想下,实现了批处理和流计算。
Flink状态编程
Flink有很多算子,数据源source,数据存储sink都是有状态的,流中数据都是buffer records,会保存一定的元素或者元数据。如:ProcessWindowFunction会缓存输入流的数据,ProcessFunction会保存设置的定时器信息等。
Flink中,状态始终与特定算子相关,总的来说有两种类型的状态:算子状态(operator state)和键控状态(keyed state)。
算子状态(operator state)
算子状态的作用范围限定在算子任务。也就是说同一并行任务所处理的所有数据都可以访问到相同的状态,状态对于统一任务而言是共享的。算子不能由相同或不同算子的另一个任务访问。
Flink算子状态的三种基本数据结构——
列表状态(List state):将状态表示为一组数据的列表。
联合列表状态(Union list state):将状态表示为一组数据的列表,它与常规列表的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复。
广播状态(Broadcast state):如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种情况最适合光爆状态
键控状态(keyed state)
键控状态是根据输入数据流中定义的键(key)来维护和访问的。
Flink为每个键值维护一个状态实例,并将具有相同键的所有数据,都分区到一个算子任务中,这个任务会维护和处理这个key对应的状态。
当任务处理处理一条数据时,它会自动将状态的访问范围限定为当前输的key。因此,具有相同key的所有数据都会访问相同的状态。
Keyed State类似于一个分布式的k-v的map数据结构,只能用于KeyedStream(keyby算子处理之后)。
Flink的Keyed State支持的数据类型:
ValueState[T]保存单个值,值得类型为T
get操作:ValueState.value()
set操作:ValueState.update(value:T)
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)
MapState.remove(key:K)
ReducingState[T]
AggregatingState[I,O]
Flink容错机制
1、状态一致
当在分布式系统中引入状态时,自然也引入了一致性问题。一致性实际上是“正确性级别”的另一种说法,也就是说在成功处理故障并恢复之后得到的结果,与没有发生任何故障时得到的结果相比,前者到底有多正确。
Flink的一个重大价值在于,它既保证了exactly-once,也具有低延迟和高吞吐的处理能力。
2、端到端(end-to-end)状态一致性
端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一致性,整个端到端一致性级别取决于所有组件中一致性最弱的组件。
3、检查点(Checkpoint)
Flink检查点算法的正式名称是异步分界线快照(Asynchronous barrier snapshotting)。该算法大致基于Chandy-Lamport分布式快照算法。
检查点是Flink最有价值的创新之一,因为它使得Flink可以保证exactly-once,并且不需要牺牲性能。
关于大数据入门,Flink状态编程与容错机制,以上就为大家做了简单的介绍了。Flink框架在当前的大数据技术生态当中,热度持续上升,作为大数据开发者,掌握Flink势在必行。