说白了就是等你要处理的这个或这波数据被所有任务(执行完所有算子)处理完了 再做检查点保存(下图就是三个数据都被map、sum处理完 就做检查点保存 source是读取数据的)
下图只是一个检查点的保存过程(拆解)这一个检查点最终保存了三个数据的偏移量和状态
就比如几个小水杯(一个小水杯代表一个数据)往大水杯里倒水(就是保存状态)小水杯灌满,意味着这个数据被所有任务(也就是所有算子)处理完 才能往大水杯里倒水 所以当你小水杯灌水的时候 挂了 不影响大水杯 你小水杯都清空 回到大水杯上次保存的内容(上次检查点的时候)
详细步骤:
处理完前三个数据以后 做了一次检查点的保存 然后第四个第五个单词是flink和hello flink处理完 处理hello的时候挂了 如下图
挂了就清空小水杯 回到上次保存检查点的内容
这里的意思是 你在source端处理数据时处理到barrier 然后把这个barrier注入数据流 barrier就在那个触发检查点的数据旁边 你后面来的数据什么的正常来 但是前面的数据都处理完了 并且伴有barrier
可以看到 上面那个分区source处理hello、world、hello
source已经读到了三个单词 然后一个hello还没map
还有一个hello map了但是没统计sum
下面只读取一个world(不是hello) 也在map后还没统计(都在路上...)
下面那个barrier还没来 说明那个触发检查点的数据还没到
背压
这样的话 因为一个barrier到了 但是另外一个分区的没到
也就是另外一个分区的数据还没到齐 就直接保存状态 不会出问题吗 不会 因为我们还保存了当前的上下文,缓冲区的数据
所以牺牲内存换低延迟