Apache Flink 进阶(一):Runtime 核心机制剖析( 八 )

图4. Flink 中资源管理功能各模块交互关系 。

当 Task 结束之后 , 无论是正常结束还是异常结束 , 都会通知 JobManager 相应的结束状态 , 然后在 TaskManager 端将 Slot 标记为已占用但未执行任务的状态 。 JobManager 会首先将相应的 Slot 缓存到 SlotPool 中 , 但不会立即释放 。 这种方式避免了如果将 Slot 直接还给 ResourceManager , 在任务异常结束之后需要重启时 , 需要立刻重新申请 Slot 的问题 。 通过延时释放 , Failover 的 Task 可以尽快调度回原来的 TaskManager , 从而加快 Failover 的速度 。 当 SlotPool 中缓存的 Slot 超过指定的时间仍未使用时 , SlotPool 就会发起释放该 Slot 的过程 。 与申请 Slot 的过程对应 , SlotPool 会首先通知 TaskManager 来释放该 Slot , 然后 TaskExecutor 通知 ResourceManager 该 Slot 已经被释放 , 从而最终完成释放的逻辑 。

除了正常的通信逻辑外 , 在 ResourceManager 和 TaskExecutor 之间还存在定时的心跳消息来同步 Slot 的状态 。 在分布式系统中 , 消息的丢失、错乱不可避免 , 这些问题会在分布式系统的组件中引入不一致状态 , 如果没有定时消息 , 那么组件无法从这些不一致状态中恢复 。 此外 , 当组件之间长时间未收到对方的心跳时 , 就会认为对应的组件已经失效 , 并进入到 Failover 的流程 。

推荐阅读