1.概述

转载:介绍Flink中状态一致性的保证 再次温习了这篇文章有了不一样的收货。侵权可删,这里是方便自己找到。

1. 一致性

1.1 介绍状态一致性

  • 有状态的流处理,内部每个算子任务都可以有自己的状态
  • 对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的要保证计算结果准确,一条数据有也不丢失,也不会重复计算数据
  • 在程序遇到故障时可以恢复任务状态,恢复以后的任务重新计算数据,计算完的结果也应该是完全正确的

1.2 性级别有哪些

在流处理中,一致性可以分为 3 个级别:

级别 说明
at-most-once
至多一次
最多处理一次,当任务发生故障时,什么都不做,
既不恢复丢失的状态,也不重播丢失的数据。
这其实是没有正确性保障的委婉说法——故障发生之后, 计数结果可能丢失。同样的还有 udp。
at-least-once
至少一次
最少处理一次,所有的事件都会得到处理,
这表示计数结果可能大于正确值,但绝不会小于正确值。
也就是说,计数程序在发生故障后可能多算,但是绝不会少算。
exactly-once
精确一次
每个事件都会被处理且仅会被处理一次,这指的是系统保证在发生故障后得到的计数结果与正确值一致。

曾经, at-least-once 非常流行。第一代流处理器(如 Storm 和 Samza)刚问世时只保证 at-least-once,原因有二。

  1. 保证 exactly-once 的系统实现起来更复杂。这在基础架构层(决定什么代表正确,以及 exactly-once 的范围是什么)和实现层都很有挑战性。

  2. 流处理系统的早期用户愿意接受框架的局限性,并在应用层想办法弥补(例如使应用程序具有幂等性,或者用批量计算层再做一遍计算)。

最先保证 exactly-once 的系统(Storm Trident 和 Spark Streaming)在性能和表现力这两个方面付出了很大的代价。为了保证 exactly-once,这些系统无法单独地对每条记录运用应用逻辑,而是同时处理多条(一批)记录,保证对每一批的处理要么全部 成功,要么全部失败。这就导致在得到结果前,必须等待一批记录处理结束。因此, 用户经常不得不使用两个流处理框架(一个用来保证 exactly-once,另一个用来对每个元素做低延迟处理),结果使基础设施更加复杂。曾经, 用户不得不在保证exactly-once 与获得低延迟和效率之间权衡利弊。Flink 避免了这种权衡。

Flink 的一个重大价值在于, 它既保证了 exactly-once, 也具有低延迟和高吞吐的处理能力。从根本上说,Flink 通过使自身满足所有需求来避免权衡,它是业界的一次意义重大的技术飞跃。尽管这在外行看来很神奇,但是一旦了解,就会恍然大悟。

1.3 一致性检查点

Flink 使用了一种轻量级快照机制 — 检查点(checkpoint) 来保证 exactly-once 语义

有状态应用的一致性检查点,就是所有任务的装在,在某个时间点的一份快照,而这个时间点,应该是所有任务都恰好处理完一个相同的输入数据的时候,

应用状态的一致检查点,就是 flink 故障恢复机制的核心

2. 端到端的一致性

  • 端到端(end-to-end)的状态一致性意味着从数据来源的 source 到转换算子再到 sink 能够有一致性保证
  • 这意味着结果的正确性贯穿整个流处理应用的始终每个组件都保证了它自己的一致性。
  • 整个端到端的一致性级别取决去所有组件中一致性最弱的组件

2.1 端到端 exactly-once 各部分的实现方式

  • 内部保证 - checkpoint,发生故障时能够恢复各个环节的数据
  • source端 - 可重设数据的读取位置,当发生故障时重置偏移量到故障之前的位置
  • sink 端 - 从故障恢复时,数据不会重复写入外部系统
    • 幂等写入
    • 事务写入

2.2 幂等写入(idempotent Writes)

所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说后面再重复执行就不起作用了。

2.3 事务写入(Transactional Writes)

  • 事务(Transaction)

    • 应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所有的所有更改都会被撤销
    • 具有原子性:一个事务中的一系列的操作要么全部成功,要么一个都不做
  • 实现思想:构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把所有对应的结果写入 sink 系统中
  • 实现方式
    • 预写日志
    • 两阶段提交

2.3.1 预写日志

  • Write-Ahead-Log, WAL

  • 把结果数据先当成状态保存,然后再收到 checkpoint 完成的通知时,一次性写入 sink 系统

  • 简单易于实现,由于数据提前在状态后端做了缓存,所以无论什么 sink 系统,都能用这种方式一批搞定

  • 存在的问题:写入数据时出现故障则会导致一部分数据成功一部分失败

  • DataStream API 提供了一个模板类:GenericWriteAheadSink,来实现这种事务性 sink

2.3.2 两阶段提交

  • Two-Phase-Commit, 2PC

  • 对于每个 checkpoint,sink 任务会启动一个事务,并将接下来所有接收的数据添加到事务里

  • 然后将这些数据写入外部 sink,但不提交它们,这时只是“预提交”

  • 当它收到 checkpoint 完成的通知时,它才正式提交事务,实现结果的真正写入

  • 这种方式真正实现了 exactly-once,它需要一个提供事务支持的外部 sink 系统,Flink 提供了 TwoPhaseCommitSinkFunction 接口

2.3.3 pc 对外部sink 系统的要求

  • 外部 sink 系统必须提供事务支持,或者 sink 任务必须能够模拟外部系统上的事务
  • 在 checkpoint 的隔离期间里,必须能够开启一个事务并接受数据写入
  • 在收到 checkpoint 完成的通知之前,事务必须是“等待提交”的状态。在故障恢复的情况下,这可能需要一些时间。如果这个时候 sink 系统关闭事务(例如超时了),那么未提交的数据就会丢失
  • sink 任务必须能够在进程失败后恢复事务
  • 提交事务必须是幂等操作

2.4 Source 和 Sink 的一致性保证

sink\source 不可重置 可重置
任意(Any) at-most-once at-least-once
幂等 at-most-once exactly-once
故障恢复时会出现暂时不一致
预写日志(WAL) at-most-once at-least-once
两阶段提交(2PC) at-most-once exactly-once

3. Flink + Kafka 的端到端状态一致性保证

  1. flink内部:利用 checkpoint 机制把状态保存,当发生故障的时候可以恢复状态,从而保证内部的状态一致性
  2. source 端:kafka consumer 作为 source,可以将偏移量保存下来,当发生故障时可以从发生故障前的偏移量重新消费数据,从而保证一致性
  3. sink端:kafka producer 作为 sink,采用两阶段提交 sink,需要实现一个 TwoPhaseCOmmitSinkFunction

3.1 Exactly-once 两阶段提交

  1. JobManager 协调各个 TaskManager 进行 checkpoint 存储,Checkpoint 保存在 StateBackend 中,默认 StateBackend 是内存级别,也可以改为文件级进行持久化保存

  1. 当 checkpoint 启动时,JobManager 会将 barrier 注入到数据流中,在 source 读取到 barrier 时会进行检查点操作,执行完检查点操作后将 barrier 下发到下游算子。

  1. 当算子收到 barrier 时,会将当前保存到状态后端,checkpoint 可以保证内部的状态一致性。

  1. 每个内部的任务遇见barrier 时,都会把状态保存到checkpoint 里,sink 任务首先把数据写入外部 kafka,这些事务都属于预提交事务,遇到 barrier 时把状态保存到状态后端,并开启新的预提交事务。barrier 之前的数据属于上一个事务,barrier 之后的数据属于下一个事务,

  1. 当所有环节的 checkpoint完成时,JobManager 会向所有任务发出通知,确认这次 checkpoint 完成,当 sink 收到这个完成的通知时,正式提交之前的事务,kafka 中未确认的数据状态改为已确认。

3.2 两阶段提交步骤

具体的两阶段提交步骤总结如下:

  1. sink收到第一条数据之后,开启一个 kafka 的事务( transaction),这时把数据写入kafka 标记为未提交, 这就是“预提交”

  2. jobmanager 触发 checkpoint 操作,barrier 从 source 开始向下传递,遇到barrier 的算子将状态存入状态后端,并通知 jobmanager

  3. sink 连接器收到 barrier,保存当前状态,存入 checkpoint,通知jobmanager,并开启下一阶段的事务,用于提交下个检查点的数据

  4. jobmanager 收到所有任务的通知,发出确认信息,表示 checkpoint 完成

  5. sink 任务收到 jobmanager 的确认信息,正式提交这段时间的数据

  6. 外部 kafka 关闭事务,提交的数据可以正常消费了。

所以我们也可以看到,如果宕机需要通过 StateBackend 进行恢复, 只能恢复所有确认提交的

3.3 注意点

  1. kafka超时时间要与 sink 超时要保持一致
  2. kafka 设置未提交数据不可读

【Flink】介绍Flink中状态一致性的保证相关推荐

  1. Flink 状态一致性:端到端状态一致性的保证

    文章目录 状态一致性 什么是状态一致性 状态一致性种类 端到端(end-to-end)状态一致性 Sink端到端状态一致性的保证 Flink+Kafka端到端状态一致性的保证 状态一致性 什么是状态一 ...

  2. [Flink] 容错机制与状态一致性机制

    文章目录 1.状态一致性 1.1 状态一致性分类 2.一致性检查点 checkpoint 3.端到端(end-to-end)状态一致性 4. 端到端的精确一次(exactly-once)保证 4.1 ...

  3. 【Flink】Flink 介绍Flink中 Timer 的使用

    1.概述 Timer(定时器)是 Flink 提供的用于 Processing Time 或 Event Time 变化的机制. Timer是 Flink 内部的定时器,与 key 和 timesta ...

  4. 【Flink】FLink 写入kafka 中关于 Exactly-Once 的一些思考

    1.概述 首先看看文章:[Flink]介绍Flink中状态一致性的保证 根据文章内容化,我们知道kafka写写入是2阶段提交.2阶段提交看起来挺令人迷惑的,其实就是分2中情况嘛. 1.1 sink带事 ...

  5. Apache Flink介绍、架构、原理以及实现

    文章目录 一 Flink简介 1.1 什么是flink 1.2 flink的特点 1.3 编程API 二 Flink架构 2.1 架构图 2.2 运行组件 2.3 关键词含义 三 Flink原理 3. ...

  6. 什么是Flink?Flink能用来做什么?

    文章目录 概述 特点 应用场景 Flink VS Spark Streaming 概述 Flink是什么? Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态 ...

  7. 《从0到1学习Flink》—— Flink Data transformation(转换)

    前言 在第一篇介绍 Flink 的文章 <<从0到1学习Flink>-- Apache Flink 介绍> 中就说过 Flink 程序的结构 Flink 应用程序结构就是如上图 ...

  8. flink 自定义 窗口_《从0到1学习Flink》—— Flink Data transformation(转换)

    前言 在第一篇介绍 Flink 的文章 <<从0到1学习Flink>-- Apache Flink 介绍> 中就说过 Flink 程序的结构 Flink 应用程序结构就是如上图 ...

  9. Flink的状态一致性

    1 状态的一致性 1.1 一致性级别   流处理操作一般分为at-most-once,at-least-once和exactly-once这3个级别.   at-most-once:至多一次,发生故障 ...

最新文章

  1. javascript 字符串操作函数大全
  2. 为什么要 conda 作用_烤箱预热有什么作用?为什么烘焙一定要预热烤箱?怎么正确预热?...
  3. Silverlight 5 Beta新特性[3]多窗口支持
  4. 真的,关于 Kafka 入门看这一篇就够了
  5. C/C++(变量作用域)
  6. 第 7 章 Neutron - 072 - 详解 ML2 Core Plugin(II)
  7. 当前版本与卡刷包android_小米5s卡刷包android版本不一致怎么解决
  8. 傲梅备份服务器系统,傲梅轻松备份迁移系统
  9. 阿凡题——智慧的背囊
  10. 使用qemu进行路由器环境的虚拟搭建
  11. 所有的想不通,都是因为你不懂
  12. myftpadmin+proftpd+mysql架设ftp服务器_proftpd – 碎言碎语
  13. nginx 504错误日志出现 upstream timed out (110: Connection timed out) while reading response
  14. springboot基础(72):Redisson分布式锁
  15. 华为服务器如何设置网站dns,华为ensp服务器dns配置
  16. android 内核调整工具,内核调谐器(Kernel Tuner)手机工具 for android v4.4.8 安卓版
  17. 求最近公共祖先和所有祖先
  18. java 判断String是不是Long类型
  19. 0X000000该内存不能为read written的解决思路(艾孜尔江撰稿)
  20. OushuDB入门(四)——数仓架构篇

热门文章

  1. “滤镜景点”太坑遭吐槽!小红书致歉:将推出景区踩坑榜
  2. 首销价1999元起!OPPO K9 Pro开启预售:搭载天玑1200芯片
  3. 恒大与小米洽谈出售恒大汽车65%股份?恒大:有过初步交流,没深谈
  4. 分房变卖房?董明珠承诺的3700套房即将交付,或将按成本价卖给员工
  5. 美团关联公司公开“无人车及无人配送系统”相关专利
  6. 一加9 Pro渲染图曝光:6.55英寸曲面屏 左上角打孔
  7. 官方正式预热华为Mate40系列发布盛典:余承东称还有新功能
  8. 2020财富中国500强:京东位列第13,阿里位列第18
  9. “章子欣父亲”账号发文造假实锤 百度新闻负责人:是我的锅
  10. 5月16日亮相!华硕ZenFone 6新旗舰曝光:无刘海全面屏加持