Flink

一文搞懂Flink内部的Exactly Once和At Leas

2019-08-04  本文已影响0人  fanrui

Flink简介

Apache Flink® - 数据流上的有状态计算

Flink 1.8 Document

State & Fault Tolerance

Flink的CheckPoint功能简介

flink任务task图.png 流式计算中状态交互.png

多并行度、多Operator情况下,CheckPoint过程

多并行度快照详图0.png 多并行度快照详图1.png 多并行度快照详图2.png 多并行度快照详图3.png 多并行度快照详图4.png
  1. 第一种场景计算PV,kafka只有一个partition,精确一次,至少一次就没有区别?

    答:如果只有一个partition,对应flink任务的Source Task并行度只能是1,确实没有区别,不会有至少一次的存在了,肯定是精确一次。因为只有barrier不对齐才会有可能重复处理,这里并行度都已经为1,默认就是对齐的,只有当上游有多个并行度的时候,多个并行度发到下游的barrier才需要对齐,单并行度不会出现barrier不对齐,所以必然精确一次。其实还是要理解barrier对齐就是Exactly Once不会重复消费,barrier不对齐就是 At Least Once可能重复消费,这里只有单个并行度根本不会存在barrier不对齐,所以不会存在至少一次语义

  2. 为了下游尽快做CheckPoint,所以会先发送barrier到下游,自身再同步进行快照;这一步,如果向下发送barrier后,自己同步快照慢怎么办?下游已经同步好了,自己还没?

    答: 可能会出现下游比上游快照还早的情况,但是这不影响快照结果,只是下游快照的更及时了,我只要保障下游把barrier之前的数据都处理了,并且不处理barrier之后的数据,然后做快照,那么下游也同样支持精确一次。这个问题你不要从全局思考,你单独思考上游和下游的实例,你会发现上下游的状态都是准确的,既没有丢,也没有重复计算。这里需要注意一点,如果有一个Operator 的CheckPoint失败了或者因为CheckPoint超时也会导致失败,那么JobManager会认为整个CheckPoint失败。失败的CheckPoint是不能用来恢复任务的,必须所有的算子的CheckPoint都成功,那么这次CheckPoint才能认为是成功的,才能用来恢复任务

  3. 我程序中Flink的CheckPoint语义设置了 Exactly Once,但是我的mysql中看到数据重复了?程序中设置了1分钟1次CheckPoint,但是5秒向mysql写一次数据,并commit

    答:Flink要求end to end的精确一次都必须实现TwoPhaseCommitSinkFunction。如果你的chk-100成功了,过了30秒,由于5秒commit一次,所以实际上已经写入了6批数据进入mysql,但是突然程序挂了,从chk100处恢复,这样的话,之前提交的6批数据就会重复写入,所以出现了重复消费。Flink的精确一次有两种情况,一个是Flink内部的精确一次,一个是端对端的精确一次,这个博客所描述的都是关于Flink内部去的精确一次,我后期再发一个博客详细介绍一下Flink端对端的精确一次如何实现

参考链接:

Flink官网

An Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache Kafka, too!)

Managing Large State in Apache Flink: An Intro to Incremental Checkpointing

State & Fault Tolerance

Checkpoints

Savepoints

State Backends

Tuning Checkpoints and Large State

Data Streaming Fault Tolerance

flink-china系列课程

谈谈流计算中的『Exactly Once』特性

Apache Flink结合Kafka构建端到端的Exactly-Once处理

上一篇下一篇

猜你喜欢

热点阅读