文章目录
在TaskManager中启动Task线程后,会调用StreamTask.invoke()方法触发当前Task中算子的执行,在invoke()方法中会调用restoreInternal()方法,这中间包括创建和初始化算子中的状态数据。
另外在invoke中,可以通过判断任务状态来判断是否需要初始化状态。
// Allow invoking method 'invoke' without having to call 'restore' before it.
if (!isRunning) {
LOG.debug("Restoring during invoke will be called.");
restoreInternal();
}
StreamTask调用initializeStateAndOpenOperators()方法对当前Task中所有算子的状态数据进行初始化。
RegularOperatorChain.
public void initializeStateAndOpenOperators(StreamTaskStateInitializer streamTaskStateInitializer) throws Exception {
Iterator var2 = this.getAllOperators(true).iterator();
while(var2.hasNext()) {
StreamOperatorWrapper<?, ?> operatorWrapper = (StreamOperatorWrapper)var2.next();
StreamOperator<?> operator = operatorWrapper.getStreamOperator();
operator.initializeState(streamTaskStateInitializer);
operator.open();
}
}
找到了算子状态初始化的位置,我们继续了解状态是如何初始化的。
1. 状态初始化总流程梳理
AbstractStreamOperator.initializeState中描述了状态初始化的总体流程,如下代码以及注释:
# AbstractStreamOperator.initializeState
public final void initializeState(StreamTaskStateInitializer streamTaskStateManager)
throws Exception {
//1. 获取类型序列化器
final TypeSerializer<?> keySerializer =
config.getStateKeySerializer(getUserCodeClassloader());
//2. get containingTask
final StreamTask<?,