亲宝软件园·资讯

展开

Flink状态和容错源码解析

xiangel 人气:0

引言

Flink中提供了State(状态)这个概念来保存中间计算结果和缓存数据,按照不同的场景,Flink提供了多种不同类型的State,同时为了实现Exactly once的语义,Flink参考Chandy-Lamport算法实现了Asynchronous Barrier Snapshotting算法(简称ABS),本篇我们来了解Flink状态的底层实现及如何进行快照处理。

概述

Flink中提供了2种State,一种是Keyed State,是用在Keyed DataStream(即每条记录是有一个key)。即每个key对应有一个状态信息,用于数据处理场景中需要按key记录状态的场景,如风控场景下记录用户的状态,window操作中记录窗口的数据信息也是用keyed State来实现的。另一种是Operator State,即算子的状态,如在KafkaSource中记录消费的偏移量。本篇将从状态的管理、数据的存储和备份恢复等来介绍底层机制。

State

Keyed State

Keyed State按照存储数据类型的不同,分为如下几类

状态实例管理及数据存储

从Keyed State的定义来看,这里的关系应该是一个key到State的映射,而在使用时却没有看到这个key,另外具体的状态是如何保存的,本节我们来深入分析

从上图可以看出,各种不同的State,是通过KeyedStateStore来获取到的,KeyedStateStore只是一个代理类,其底层是调用KeyedStateBackend来负责具体的处理,具体的实现类有如下2个

下面我们从如下几个功能点来看具体各个StateBackend的实现

HeapKeyedStateBackend

基于内存的StateBackend,将数据保存在Java的Heap中,适合小数据状态场景

各个实例的管理

private final Map<String, StateTable<K, ?, ?>> registeredKVStates;

使用一个Map来保存各个不同的KeyedState,key为定义的名字,StateTable中存储的具体的数据。StateTable的内部在下面内部数据保存中介绍

RocksDBKeyedStateBackend

使用RocksDB来存储状态,这个State backend可以存储非常大的状态,如果超过了内存可以split到磁盘上。同样我们分如下几个阶段来了解相关具体的实现

LinkedHashMap<String, RocksDbKvStateInfo> kvStateInformation;
public static class RocksDbKvStateInfo implements AutoCloseable {
        public final ColumnFamilyHandle columnFamilyHandle;
        public final RegisteredStateMetaInfoBase metaInfo;
}

OperatorState

接下面我们深入了解下OperatorState,在实际使用中如我们消费了kafka的数据需要记录kafka消费的offset,还有一些场景需要将一些信息分发到所有的任务。这里需要使用到一类新的状态处理,这种状态是与每个算子绑定的,Flink提供了如下3个类来支持

类似KeyedState,这里也是通过一个Backend来管理对应的状态数据,其接口定义为:OperatorStateStore。其实现类目前只有一个:DefaultOperatorStateBackend,我们也通过以下几个部分来分别了解DefaultOperatorStateBackend的实现

private final Map<String, PartitionableListState<?>> registeredOperatorStates;
private final Map<String, BackendWritableBroadcastState<?, ?>> registeredBroadcastStates;

这里通过2个Map来分别管理ListState(含UnionListState,后面都统一使用ListState来代指)和BroadcastState。 2. 内部数据保存 ListState的实现类为PartitionableListState,底层通过一个ArrayList来保存数据。BroadcastState定义的接口是kv的,所以其实现类HeapBroadcastState使用Map来存储相应的数据。 3. 数据过期处理 operatorState不涉及到数据过期的处理 4. 数据快照处理 DefaultOperatorStateBackendSnapshotStrategy类来负责具体的快照处理,调用的方法为asyncSnapshot,分别对ListState和BroadcastState进行快照处理 5. 数据重分布 数据重分布的策略前面介绍各个State时已经介绍了,这里就不再重复介绍了。

上层封装

Flink中对状态的backend和checkpoint存储策略进行了封装定义。 StateBackend:定义一个Streaming应用的state如何在集群中的本地存储。不同的实现使用不同的数据结构来存储对应的状态。其具体实现有如下2个:

总结

本篇我们了解了Flink的相关的状态的内容和checkpoint的保存策略。

参考文档

加载全部内容

相关教程
猜你喜欢
用户评论