【Flink状态管理(六)】Checkpoint的触发方式(1)通过CheckpointCoordinator触发算子的Checkpoint操作

Checkpoint的触发方式有两种

  • 一种是数据源节点中的Checkpoint操作触发,通过CheckpointCoordinator组件进行协调和控制。 CheckpointCoordinator通过注册定时器的方式按照配置的时间间隔触发数据源节点的Checkpoint操作。数据源节点会向下游算子发出Checkpoint Barrier事件,供下游节点使用。
  • 另一种是下游算子节点根据上游发送的Checkpoint Barrier事件控制算子中Checkpoint操作的触发时机,即只有接收到所有上游Barrier事件后,才会触发本节点的Checkpoint操作。

本文先介绍通过CheckpointCoordinator触发算子的Checkpoint操作

CheckpointCoordinator在整个作业中扮演了Checkpoint协调者的角色,负责在数据源节点触发Checkpoint以及整个作业的Checkpoint管理,并且CheckpointCoordinator组件会接收TaskMananger在Checkpoint执行完成后返回的Ack消息。

 

一. 启动CheckpointCoordinator

当作业的JobStatus转换为Running时,通知CheckpointCoordinatorDeActivator监听器启动CheckpointCoordinator服务。

如代码CheckpointCoordinatorDeActivator.jobStatusChanges()方法主要包含如下逻辑。

> 1. 当`newJobStatus == JobStatus.RUNNING`时,立即调用
> coordinator.startCheckpointScheduler()方法启动整个Job的调度器
> CheckpointCoordinator,此时Checkpoint的触发依靠CheckpointCoordinator进行协调。
> 
> 2.JobStatus为其他类型状态时,调用coordinator.stopCheckpointScheduler()方法,
> 停止当前Job中的Checkpoint操作。



public class CheckpointCoordinatorDeActivator implements JobStatusListener {
   
   
   private final CheckpointCoordinator coordinator;
   public CheckpointCoordinatorDeActivator(CheckpointCoordinator coordinator) {
   
   
      this.coordinator = checkNotNull(coordinator);
   }
   @Override
   public void jobStatusChanges(JobID jobId,JobStatus newJobStatus, long timestamp,
                              Throwable error) {
   
   
      if (newJobStatus == JobStatus.RUNNING) {
   
   
         // 启动Checkpoint调度程序
         coordinator.startCheckpointScheduler();
      } else {
   
   
         // 直接停止CheckpointScheduler
         coordinator.stopCheckpointScheduler();
      }
   }
}

 

二. 开启CheckpointScheduler线程

接下来在CheckpointCoordinator.startCheckpointScheduler()方法中调用scheduleTriggerWithDelay()方法进行后续操作,向创建好的checkpointCoordinatorTimer线程池添加定时调度执行的Runnable线程。

如代码所示:

在CheckpointCoordinator.scheduleTriggerWithDelay()方法中指定baseInterval参数,设定执行Checkpoint操作的时间间隔,通过定时器周期性地触发ScheduledTrigger线程,Checkpoint的具体操作在ScheduledTrigger线程中实现。

private ScheduledFuture<?> scheduleTriggerWithDelay(long initDelay) {
   
   
   return timer.scheduleAtFixedRate(
      new ScheduledTrigger(),
      initDelay, baseInterval, TimeUnit.MILLISECONDS);
}

 

三. 触发Checkpoint

如代码,ScheduledTrigger也是CheckpointCoordinator的内部类,实现了Runnable接口。在ScheduledTrigger.run()方法中调用了CheckpointCoordinator.triggerCheckpoint()方法触发和执行Checkpoint操作。

private final class ScheduledTrigger implements Runnable {
   
   
   @Override
   public void run() {
   
   
      try {
   
   
         // 调用triggerCheckpoint()方法触发Checkpoint操作
         triggerCheckpoint(System.currentTimeMillis(), true);
      }
      catch (Exception e) {
   
   
         LOG.error("Exception while triggering checkpoint for job {}.", job, e);
      }
   }
}

CheckpointCoordinator.triggerCheckpoint()方法包含的执行逻辑非常多,这里重点介绍其中的主要逻辑。根据CheckpointCoordinator触发Checkpoint操作的过程分为以下几个部分。

1. Checkpoint执行前的工作

  1. 首先检查Checkpoint的执行环境和参数,满足条件后触发执行Checkpoint操作。Checkpoint执行过程分为异步和同步两种:

调用preCheckBeforeTriggeringCheckpoint()方法进行一些前置检查,主要包括检查CheckpointCoordinator当前的状态是否为shutdown、Checkpoint尝试次数是否超过配置的最大值。

  1. 构建执行和触发Checkpoint操作对应的Task节点实例的Execution集合,其中tasksToTrigger数组中存储了触发Checkpoint操作的ExecutionVertex元素,实际上就是所有的数据源节点。

CheckpointCoordinator仅会触发数据源节点的Checkpoint操作,其他节点则是通过Barrier对齐的方式触发的。

  1. 构建需要发送Ack消息的ExecutionVertex集合,主要是从tasksToWaitFor集合中转换而来。

tasksToWaitFor中存储了ExecutonGraph中所有的ExecutionVertex,也就是说每个ExecutionVertex节点对应的Task实例都需要向CheckpointCoordinator中汇报Ack消息

// 主要做前置检查
   synchronized (lock) {
   
   
      preCheckBeforeTriggeringCheckpoint
<think>嗯,用户想了解Flink 1.17版本中触发checkpoint机制的源码解析。首先,我需要回忆一下Flinkcheckpoint机制的基本原理,确认触发checkpoint的主要流程。然后,我需要定位到Flink 1.17的源代码,找到相关的类和关键方法。 用户可能需要了解触发checkpoint的入口在哪里,比如是通过JobManager的CheckpointCoordinator吗?我记得CheckpointCoordinator负责协调检查点的触发和完成。然后,触发过程可能涉及定时任务或者外部触发事件,比如用户通过REST API触发。 接下来,需要具体到源码中的方法,比如CheckpointCoordinator的triggerCheckpoint方法。参数方面,比如是否定期触发,时间戳如何处理,还有如何通知各个TaskManager开始checkpoint。可能涉及RPC调用,比如通过TaskExecutorGateway发送触发消息。 另外,需要关注核心逻辑,比如检查是否满足触发条件,比如最大并发检查点数,最小间隔时间等。还可能涉及生成CheckpointID,保存检查点元数据等步骤。 用户可能还想知道源码中的关键类,比如PendingCheckpoint,CompletedCheckpoint,以及如何持久化元数据到高可用存储。此外,状态后端如RocksDBStateBackend在触发时的处理可能也是重点。 需要验证这些信息是否正确,可能需要查阅Flink 1.17的官方文档或源码仓库。同时,确保回答中引用的代码片段准确,比如CheckpointCoordinator的triggerCheckpoint方法,并正确标注引用来源。 最后,生成相关问题时要围绕Checkpoint机制的设计、性能优化、与其他机制的区别以及调试方法,帮助用户深入理解。</think>### Flink 1.17触发Checkpoint的源码解析 #### 1. Checkpoint触发入口 在Flink中,Checkpoint触发由`CheckpointCoordinator`类(位于`org.apache.flink.runtime.checkpoint`包)负责。核心逻辑如下: ```java // CheckpointCoordinator.java public CompletableFuture<CompletedCheckpoint> triggerCheckpoint( CheckpointProperties props, String targetDirectory, boolean isPeriodic, long timestamp) { // 1. 检查是否满足触发条件(如最大并发检查点数、最小间隔时间) if (!canTriggerCheckpoint()) { return FutureUtils.completedExceptionally(...); } // 2. 生成CheckpointID并创建PendingCheckpoint final long checkpointId = checkpointIdCounter.getAndIncrement(); PendingCheckpoint checkpoint = new PendingCheckpoint(...); // 3. 通过RPC通知所有TaskManager触发检查点 for (Execution execution: executions) { execution.triggerCheckpoint(checkpointId, timestamp, checkpointOptions); } // 4. 注册超时检测 scheduleTriggerTimeout(checkpointId); return checkpoint.getCompletionFuture(); } ``` 触发条件包括最小间隔时间(`minPauseBetweenCheckpoints`)和最大并发检查点数(`maxConcurrentCheckpoints`)的检查[^1]。 #### 2. TaskManager侧处理流程 TaskManager通过`TaskExecutorGateway`接收触发请求: ```java // TaskExecutor.java public void triggerCheckpoint( ExecutionAttemptID executionAttemptId, long checkpointId, long checkpointTimestamp, CheckpointOptions checkpointOptions) { // 查找对应Task的StreamTask StreamTask<?, ?> task = runningTasks.get(executionAttemptId); // 调用StreamTask的triggerCheckpointBarrier方法 task.triggerCheckpointBarrier(checkpointId, checkpointTimestamp, checkpointOptions); } ``` #### 3. 核心触发逻辑 在`StreamTask`中会创建`CheckpointBarrier`并通过数据流传播: ```java // StreamTask.java public boolean triggerCheckpointBarrier( final long checkpointId, final long checkpointTimestamp, final CheckpointOptions checkpointOptions) { // 生成CheckpointBarrier CheckpointBarrier checkpointBarrier = new CheckpointBarrier( checkpointId, checkpointTimestamp, checkpointOptions); // 通过算子链传播Barrier operatorChain.broadcastEvent(checkpointBarrier, false); // 执行本地快照 performCheckpoint(checkpointId, checkpointTimestamp, checkpointOptions); return true; } ``` #### 4. 状态持久化 状态后端(如`RocksDBStateBackend`)会通过`CheckpointStorage`接口实现快照持久化: ```java // RocksDBStateBackend.java public RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot(...) { // 创建异步快照线程 return asyncSnapshotThread.snapshot(...); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值