之前介绍了Checkpoint的组成之一Barrier,本文主要介绍State。
当operator包含一些状态数据的时候,这些状态同样也是快照的一部分。Operator的状态主要有以下两种形式:
- 用户自定义状态 这种类型的状态是通过一些转化函数(map,filter)创建和修改的。
- 系统状态 这种状态是指数据缓冲,是operator计算的一部分。一个典型的例子就是窗口缓冲,这个缓存区域用于为窗口操作收集和聚合数据,直到窗口计算完成并被清除。
Operator会在接收到所有输入数据的的屏障后,在发送自己的屏障之前为自己的状态数据做快照。在屏障之前的所有的数据状态更改都已经产生,所有屏障之后的数据的修改都未应用。因为一个快照的状态数据可能很大,所以会存储在一个可以配置的状态后台(stage backend)。默认情况下是存储在JobManager的内存中,但是在生产环境下,我们都是配置在一个分布式的可靠的可配置存储系统(比如HDFS)。当状态存储之后,operator会确认这个检查点,并将快照的屏障发出到输出数据流中,然后继续处理。
快照之中现在包含: - 对并行的每一个数据源,它们每个快照开始的offset/position
-
对每个operator,一个状态的指针,作为快照的一部分。
下面我们对图中四个步骤进行解释:
- Master发出Checkpoint的消息,所有的Source接收到信息后将产生一个屏障,并将屏障插入到数据流中。这里是四个Source,分别Source1,Source2,Source3,Source4.
- 屏障发出后,所有的source将当前的数据的offset上报给Master。Master将offset数据存储下来(留作后续的确认)。当operator收到快照的所有屏障后,则将状态的快照数据写入到StateBackend
- 快照数据写入成功后,将快照的指针上报给Master。然后向下游发出Operator自己的屏障。
- 当Sink收到这个快照的所用屏障后,向Master发送屏障确认消息。这里我们看到有两个Sink,所以存储了两个的ack信息。最后Master接收到所有的确认信息后,才会认为这个快照完成。