起源
事情的起源是在1.6.2的版本上,钉友发现了一个Bug,在TTL state snapshot的时,此处会抛IllegalArgumentException:
protected CompositeSerializer<TtlValue<T>> createSerializerInstance(
PrecomputedParameters precomputed,
TypeSerializer<?> ... originalSerializers) {
Preconditions.checkNotNull(originalSerializers);
//异常,length为1,原因在紧接的一行中
Preconditions.checkArgument(originalSerializers.length == 2);
//duplicate的时候只取了fieldSerializer,丢弃了TTL中timestamp的LongSerializer
return new TtlSerializer<>(precomputed, (TypeSerializer<T>) originalSerializers[1]);
}
上述BUG已经在Flink 1.6.3版本修复,在定位过程中反复跟踪和阅读了State的注册和使用源码,在此进行记录。
State 存储结构
存储结构层次如下:
- 在AbstractKeyedStateBackend中以StateDescriptor name为key存储State
// From AbstractKeyedStateBackend.java private final HashMap<String, InternalKvState<K, ?, ?>> keyValueStatesByName;
- InternalKvState中以三元组的形式存储保存数据,具体保存方式和store的类型相关,以heap方式为例:
//From AbstractHeapState.java protected final StateTable<K, N, SV> stateTable;
- StateTable的具体实现方式有两种,CopyOnWriteStateTable和NestedMapsStateTable,两者的主要区别是一种是flat的方式存储,一种是嵌套map的方式存储。重点看看CopyOnWriteStateTable的数据保存方式:
此处有两个StateTableEntry的数据,和CopyOnWriteTable的实现相关,不用太关注。// From CopyOnWriteStateTable.java /** * This is the primary entry array (hash directory) of the state table. If no incremental rehash is ongoing, this * is the only used table. **/ private StateTableEntry<K, N, S>[] primaryTable; /** * We maintain a secondary entry array while performing an incremental rehash. The purpose is to slowly migrate * entries from the primary table to this resized table array. When all entries are migrated, this becomes the new * primary table. */ private StateTableEntry<K, N, S>[] incrementalRehashTable;
- StateTableEntry就是state的封装类了,其中还包括一些hash、冲突链next指针等信息,和CopyOnWriteTable的实现强相关,是一种类hashMap的处理。
需要强调的是不同的State在具体的实现上有些差异。
State 注册过程
1. 注册时机
StreamTask在run前会先open所有的operator,operator的open方法中,我们通常会通过StateDescription 来初始化State。没错,就在此时注册。一个MapState注册的调用栈:
2. 关键过程
-
静态注册StateFactory
//From TtlStateFactory @SuppressWarnings("deprecation") private Map<Class<? extends StateDescriptor>, SupplierWithException