Exactly Once 语义在 Flink 中的实现 课后习题 | 青训营笔记

69 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

题目来源:【大数据专场 学习资料一】第四届字节跳动青训营 - 掘金

  1. 流式处理中算子为什么会有状态?

    1. 因为flink需要做一些如map,bykey,group by等操作,需要记录状态用于后续更新
  1. 数据流和动态表之间是如何进行转换的?

    1. 将数据流切割成小块,每一块任务是一批数据,对该批数据执行sql,生成动态表
  1. Flink 作业为什么需要考虑故障恢复?

    1. 如果不考虑故障恢复,可能会丢失数据或重复消费数据,无法实现exactly once
  1. Flink 故障恢复前为什么需要Checkpoint?

    1. 需要通过checkpoint记载上一次正常情况处理位置,并用其恢复作业
  1. 为什么不能保留任意时刻的状态作为故障恢复的时间点?

    1. 需要等待所有处理逻辑消费完成,source保存状态和之前的数据
  1. Flink Checkpoint 对作业性能的影响有多大?

    1. 处理barrier需要保存当前状态,耗时可能较大
    2. 如果有多个上游,需要等待所有上游的barrier,等待耗时
    3. 快照提交到远端可能极其耗时,所以会异步提交
    4. 解耦了任务执行和快照生成,各个算子完成快照制作就可以继续工作,不用等待所有算子完成
  1. 两阶段提交协议对性能影响有多大?

    1. 如果某个节点制作快照失败,整个事务需要回滚,会影响处理速度
    2. 事务未完成下游不可见,输出数据不再是实时写入到外部系统,而是分批次地提交
  1. 写入下游如果不支持事务读写,能做到 Exactly-Once 语义么?

    1. 我理解可以的,flink本身保证事务未完成不提交给下游,不需要下游提供事务读写,如果下游处理失败,也可以更改offset,从之前的数据重新消费。