Flink状态一致性笔记
时间:2021-01-12
本文章向大家介绍Flink状态一致性笔记,主要包括Flink状态一致性笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
知识点
状态一致性分类: • AT-MOST-ONCE(最多一次):当任务故障时,最简单的做法是什么都不干,既不恢复丢失的状态,也不重播丢失的数据。At-most-once 语义的含义是最多处理一次事件。 • AT-LEAST-ONCE(至少一次):在大多数的真实应用场景,我们希望不丢失事件。这种类型的保障称为 at- least-once,意思是所有的事件都得到了处理,而一些事件还可能被处理多次。 • EXACTLY-ONCE(精确一次):恰好处理一次是最严格的保证,也是最难实现的。恰好处理一次语义不仅仅 意味着没有事件丢失,还意味着针对每一个数据,内部状态仅仅更新一次 EXACTLY-ONCE(精确一次):通过checkpoint(快照)机制来保证 端到端(end-to-end)状态一致性 • 目前我们看到的一致性保证都是由流处理器实现的,也就是说都是在 Flink 流处理器内部保证的;而在真实应用中,流处理应用除了流处理 器以外还包含了数据源(例如 Kafka)和输出到持久化系统 • 端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的 始终;每一个组件都保证了它自己的一致性 • 整个端到端的一致性级别取决于所有组件中一致性最弱的组件 端到端 exactly-once • 内部保证 —— checkpoint • source 端 —— 可重设数据的读取位置 (kafka的offset) • sink 端 —— 从故障恢复时,数据不会重复写入外部系统 : 幂等写入 、事务写入(预写日志、两阶段提交) 幂等写入:所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次 结果更改,也就是说,后面再重复执行就不起作用了 事务(Transaction) : 应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所 作的所有更改都会被撤消;具有原子性:一个事务中的一系列的操作要么全部成功,要么一个都不做 预写日志(Write-Ahead-Log,WAL) • 把结果数据先当成状态保存,然后在收到 checkpoint 完成的通知时, 一次性写入 sink 系统 • 简单易于实现,由于数据提前在状态后端中做了缓存,所以无论什么 sink 系统,都能用这种方式一批搞定 • DataStream API 提供了一个模板类:GenericWriteAheadSink,来实 现这种事务性 sink 两阶段提交(Two-Phase-Commit,2PC) • 对于每个 checkpoint,sink 任务会启动一个事务,并将接下来所有接 收的数据添加到事务里 • 然后将这些数据写入外部 sink 系统,但不提交它们 —— 这时只是 “预提交” • 当它收到 checkpoint 完成的通知时,它才正式提交事务,实现结果 的真正写入 ; 这种方式真正实现了 exactly-once,它需要一个提供事务支持的外部 sink 系统。Flink 提供了 TwoPhaseCommitSinkFunction 接口 要求: • 外部 sink 系统必须提供事务支持,或者 sink 任务必须能够模拟外部系统 上的事务 • 在 checkpoint 的间隔期间里,必须能够开启一个事务并接受数据写入 • 在收到 checkpoint 完成的通知之前,事务必须是“等待提交”的状态。在 故障恢复的情况下,这可能需要一些时间。如果这个时候sink系统关闭 事务(例如超时了),那么未提交的数据就会丢失 • sink 任务必须能够在进程失败后恢复事务 • 提交事务必须是幂等操作 Flink+Kafka 端到端状态一致性的保证 • 内部 —— 利用 checkpoint 机制,把状态存盘,发生故障的时候可以恢 复,保证内部的状态一致性 • source —— kafka consumer 作为 source,可以将偏移量保存下来,如 果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消 费数据,保证一致性 • sink —— kafka producer 作为sink,采用两阶段提交 sink,需要实现一 个 TwoPhaseCommitSinkFunction
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java提取2个集合中的相同和不同元素代码示例
- Bootstrap实现翻页效果
- Java数组扩容实例代码
- JQuery 又谈ajax局部刷新
- jfinal与bootstrap的登出实战详解
- Dropify.js图片宽高自适应的方法
- 详解Linux进程调度策略
- java语言实现权重随机算法完整实例
- 详解Linux实现U盘自动挂载(图文教程)
- weebox弹出窗口不居中显示的解决方法
- Oracle查询中OVER (PARTITION BY ..)用法
- Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除
- Java语言描述二叉树的深度和宽度
- JAVA中SSM框架的搭建实现CRUD的方法
- 详解Android 基于TCP和UDP协议的Socket通信