streamTask的invoke方法中,会循环去调用task上的每个operator的initializeState方法,在这个方法中,会真正创建除了savepointStream的其他三个对象,
而savepointStream会lazy到做savepoint的时候才创建对象,这个也可以理解,毕竟savepoint不是必须的。
那么,三个对象创建了之后,就可以发挥作用了吗?不是。KeyedStateBackend和OperatorStateBackend创建之后立刻就会发生作用,因为用户的代码需要获取和操作state,都会和这两个对象打交道,而checkpointStream要发挥作用就必须等到系统发出做checkpoint的指示之后,也就是开始做snapshot之后,这个checkpointStream作为管道将KeyedStateBackend和OperatorStateBackend中的state进行持久化。
内存模型
调用关系:
其中task持有processor对象和operator对象,operator对象持有runtime对象,processor和runtime都持有operator对象,大量的这种对象之间的相互引用关系。