检查点分界线
- FLink的检查点算法用到了一种称为分界线(barrier)的特殊数据形式, 用来把一条流上数据按照不同的检查点分开
- 分界线之前到来的数据导致的状态更改, 都会被包含在当前分界线所属的检查点中; 而基于分界线之后的数据导致的所有更改, 就会被包含在之后的检查点中
检查点运行过程
1, JobManager会向每个source任务发送一条带有新检查点ID的消息, 通过这种方式来启动检查点
(比如有两个source现在source-1处理到2了, source-2处理到3了, 这个时候source接收到检查点消息就是source-1中的数据2以前的数据包括2, source-2中的3以前的数据包括3在上一个检查点和这次barrier之间)
2, 数据源将它们的状态写入检查点, 并发出一个检查点barrier
3, 状态后端在状态存入检查点之后, 会返回通知给source任务, source任务就会向JobManager确认检查点完成, 英文是Acknowledge completion of task checkpoint 2 (这只是source的确认检查点)
4, 分界线对齐: barrier向下游传递, 如果下游有另外一个算子, 比如sum, 那么sum任务会等待所有输入分区的barrier到达, 这个是考虑可能有keyby等分区操作, 所以要等所有分区
5, 对于barrier已经到达的分区, 继续到达的数据会被缓存, 而barrier尚未到达的分区, 数据会被正常处理
6, 当收到所有输入分区的barrier时, 任务就将其状态保存到状态后端的检查点中, 然后同样确认检查点完成, 然后将barrier继续向下游转发
7, 向下游转发检查点barrier后, 任务继续正常地数据处理
8, 当最后所有任务都确认已成功将状态保存到检查点时, 检查点就真正完成了, 并且此时检查点也保存着每个任务地state
其实就是把每个任务在检查点这一时刻对应地state拼成一整个状态拼图