【Flink状态管理(八)】Checkpoint:CheckpointBarrier对齐后Checkpoint的完成、通知与对学习状态管理源码的思考

上文介绍了CheckpointBarrier的对齐操作,当CheckpointBarrier完成对齐操作后,接下来就是通过notifyCheckpoint()方法触发StreamTask节点的Checkpoint操作。

一. 调用StreamTask执行Checkpoint操作

如下代码,notifyCheckpoint()方法主要包含如下逻辑。

> 1. 判断toNotifyOnCheckpoint不为空。
> 2. 创建CheckpointMetaDataCheckpointMetrics实例,CheckpointMetaData用于存储
> Checkpoint的元信息,CheckpointMetrics用于记录和监控Checkpoint监控指标。
> 3. 触发StreamTask中算子的Checkpoint操作。
protected void notifyCheckpoint(CheckpointBarrier checkpointBarrier, 
                                long bufferedBytes, 
                                long alignmentDurationNanos) throws Exception {
   
   if (toNotifyOnCheckpoint != null) {
   
      // 创建CheckpointMetaData对象用于存储Meta信息
      CheckpointMetaData checkpointMetaData =
         new CheckpointMetaData(checkpointBarrier.getId(), 
                                checkpointBarrier.getTimestamp());
            // 创建CheckpointMetrics对象用于记录监控指标
      CheckpointMetrics checkpointMetrics = new CheckpointMetrics()
         .setBytesBufferedInAlignment(bufferedBytes)
         .setAlignmentDurationNanos(alignmentDurationNanos);
      // 调用toNotifyOnCheckpoint.triggerCheckpointOnBarrier()方法触发Checkpoint
        操作
      toNotifyOnCheckpoint.triggerCheckpointOnBarrier(
         checkpointMetaData,
         checkpointBarrier.getCheckpointOptions(),
         checkpointMetrics);
   }
}

注意:StreamTask是唯一实现了Checkpoint方法的子类,即只有StreamTask才能触发当前Task实例中的Checkpoint操作。

 

接下来具体看Checkpoint执行细节

1. 执行Checkpoint总体代码流程

Checkpoint触发过程分为两种情况:一种是CheckpointCoordinator周期性地触发数据源节点中的Checkpoint操作;另一种是下游算子通过对齐CheckpointBarrier事件触发本节点算子的Checkpoint操作。

不管是哪种方式触发Checkpoint,最终都是调用StreamTask.performCheckpoint()方法实现StreamTask实例中状态数据的持久化操作。

 

在StreamTask.performCheckpoint()方法中,首先判断当前的Task是否运行正常,然后使用actionExecutor线程池执行Checkpoint操作,Checkpoint的实际执行过程如下。

  1. Checkpoint执行前的准备操作,让OperatorChain中所有的Operator执行Pre-barrier工作。
  2. 将CheckpointBarrier事件发送到下游的节点中。
  3. 算子状态数据进行快照

执行checkpointState()方法,对StreamTask中OperatorChain的所有算子进行状态数据的快照操作,该过程为异步非阻塞过程,不影响数据的正常处理进程,执行完成后会返回True到CheckpointInputGate中。

  1. task挂掉情况处理:
  • 如果isRunning的条件为false,表明Task不在运行状态,此时需要给OperatorChain中的所有算子发送CancelCheckpointMarker消息,这里主要借助recordWriter.broadcastEvent(message)方法向下游算子进行事件广播。
  • 当且仅当OperatorChain中的算子还没有执行完Checkpoint操作的时候,下游的算子接收到CancelCheckpointMarker消息后会立即取消Checkpoint操作。
private boolean performCheckpoint(
      CheckpointMetaData checkpointMetaData,
      CheckpointOptions checkpointOptions,
      CheckpointMetrics checkpointMetrics,
      boolean advanceToEndOfTime) throws Exception {
   
   LOG.debug("Starting checkpoint ({}) {} on task {}",
             checkpointMetaData.getCheckpointId(), 
             checkpointOptions.getCheckpointType(), 
             getName());
   final long checkpointId = checkpointMetaData.getCheckpointId();
   if (isRunning) {
   
      // 使用actionExecutor执行Checkpoint逻辑
      actionExecutor.runThrowing(() -> {
   
         if (checkpointOptions.getCheckpointType().isSynchronous()) {
   
             setSynchronousSavepointId(checkpointId);
             if (advanceToEndOfTime) {
   
                 advanceToEndOfEventTime();
            }
         }
         //Checkpoint操作的准备工作
         operatorChain.prepareSnapshotPreBarrier(checkpointId);
         //将checkpoint barrier发送到下游的stream中
         operatorChain.broadcastCheckpointBarrier(
               checkpointId,
               checkpointMetaData.getTimestamp(),
               checkpointOptions);
         //对算子中的状态进行快照操作,此步骤是异步操作,
         //不影响streaming拓扑中数据的正常处理
         checkpointState(checkpointMetaData, checkpointOptions, 
            checkpointMetrics);
      });
      return true;
   } else {
   
      // 如果Task处于其他状态,则向下游广播CancelCheckpointMarker消息
      actionExecutor.runThrowing(() -> {
   
         final CancelCheckpointMarker message = 
             new CancelCheckpointMarker(checkpointMetaData.getCheckpointId());
         recordWriter.broadcastEvent(message);
      });
      return false;
   }
}

 

1.1. StreamTask.checkpointState()

接下来我们看StreamTask.checkpointState()方法的具体实现,如下代码。

  1. 创建CheckpointStateOutputStream实例。主要有如下两种实现类:
    • FsCheckpointStateOutputStream:文件类型系统
    • MemoryCheckpointOutputStream:内存的数据流输出。
  2. 创建CheckpointingOperation实例,CheckpointingOperation封装了Checkpoint执行的具体操作流程,以及checkpointMetaData、checkpointOptions、storage和checkpointMetrics等Checkpoint执行过程中需要的环境配置信息。
  3. 调用CheckpointingOperation.executeCheckpointing()方法执行Checkpoint操作。
private void checkpointState(
      CheckpointMetaData checkpointMetaData,
      CheckpointOptions checkpointOptions,
      CheckpointMetrics checkpointMetrics) throws Exception {
   
     // 创建CheckpointStreamFactory实例
   CheckpointStreamFactory storage = checkpointStorage.resolveCheckpointStorag
      eLocation(
         checkpointMetaData.getCheckpointId(),
         checkpointOptions.getTargetLocation());
     // 创建CheckpointingOperation实例
   CheckpointingOperation checkpointingOperation 
<think>好的,用户之前问了数仓工程师的介绍,现在又需要实时计算的面试资料。这说明用户可能在准备面试,特别是数仓或数据工程方向的岗位,可能涉及实时处理。需要先明确实时计算的核心技术和常见问题。 用户身份可能是数仓工程师,希望扩展技能到实时领域,或者准备跳槽。需要覆盖实时计算的框架、理论、面试题和实际应用场景。 要确保回答结构清晰,分点列出,涵盖基础理论、技术栈、常见问题、实战案例和学习资源。可能用户需要快速掌握重点,所以需要重点突出,比如Flink、Kafka、窗口处理、容错机制等。 还要注意用户的深层需求,可能是想系统复习,或者针对面试查漏补缺。需要提供面试高频题和推荐资料,帮助用户高效准备。</think>以下是针对实时计算岗位的**系统性面试准备指南**,包含高频考点实战技巧: --- ### **一、核心理论必考** 1. **流式计算模型** - **时间语义**:区分$事件时间$(Event Time)$处理时间$(Processing Time) $$ \text{水位线}(Watermark) = \text{最大事件时间} - \text{允许延迟阈值} $$ - **窗口机制**:滚动窗口($Tumbling Window$)、滑动窗口($Sliding Window$)、会话窗口($Session Window$) 2. **容错一致性** - **Exactly-Once语义**:如何通过$Checkpoint$(如Flink的Chandy-Lamport算法)实现 - **状态后端**:比较$MemoryStateBackend$$RocksDBStateBackend$的存储差异 --- ### **二、技术栈重点** 1. **Flink核心考点** - **任务调度**:TaskManagerJobManager交互流程 - **反压机制**:通过$TCP反向压力$或$Credit-Based$流量控制 - **SQL优化**:解释`MATCH_RECOGNIZE`在复杂事件处理中的应用 ```java // Flink窗口统计示例 DataStream<Trade> stream = env.addSource(kafkaSource); stream.keyBy("productId") .window(TumblingEventTimeWindows.of(Time.minutes(5))) .aggregate(new AveragePriceAggregate()); ``` 2. **Kafka深度问题** - **ISR机制**:如何通过$in-sync replicas$保证数据可靠性 - **零拷贝**:`sendfile`系统调用如何提升传输效率 - **消费偏移管理**:`__consumer_offsets`主题的内部结构 --- ### **三、高频面试题集锦** 1. **场景设计题** - *"如何设计一个延迟≤1秒的实时风控系统?"* ➤ 参考答案:Kafka做缓冲层 + Flink CEP规则引擎 + Redis存储黑名单 2. **故障排查题** - *"Flink作业反压严重,如何定位瓶颈?"* ➤ 排查链:Metrics监控 → 线程堆栈分析 → 检查窗口/聚合函数 3. **源码理解题** - *"描述Flink Checkpoint执行过程中Barrier的传播逻辑"* ➤ 关键点:Barrier对齐、异步快照、状态持久化 --- ### **四、实战案例库** 1. **电商场景** - 实时计算UV:使用$HyperLogLog$去重,误差率控制在$1\%$以内 - 动态定价:通过$滑动窗口$统计最近5分钟商品点击率 2. **物联网场景** - 设备故障预测:用$CEP$检测连续三次温度超阈值事件 - 资源优化:基于$Process Function$实现自适应并行度调整 --- ### **五、学习资源推荐** 1. **官方文档** - [Apache Flink官方文档](https://nightlies.apache.org/flink/)(重点阅读State & Time章节) - [Kafka设计原理](https://kafka.apache.org/documentation/#design) 2. **开源项目** - **flink-learning**(GitHub 14k星):含完整练习案例 - **streaming-benchmarks**:对比Flink/Spark Streaming性能 3. **模拟面试工具** - **LeetCode**:刷SQL题(窗口函数类题目) - **DataCamp**:完成实时数据处理专项训练 --- **附加技巧**:面试中遇到模糊问题时可反问澄清,例如: “您提到的‘低延迟’具体是指99分位在100ms以内吗?这需要结合具体业务场景设计” (展现结构化思考能力) 如果需要某类题目的详细解析或模拟面试训练,可告知具体方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

roman_日积跬步-终至千里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值