聊聊Flink必知必会(二)

聊聊,flink · 浏览次数 : 96

小编点评

**Checkpoint机制** * Flink 是一种有状态的流处理框架,因此需要对状态做持久化。 * checkpoint 是一种定期保存状态数据的机制,用于恢复从备份中恢复数据。 * checkpoint 为 Flink 提供 Exactly-Once 的投递保障。 **Barrier** * Barrier 是一个用于将无界数据流从时间上切分成多个窗口的技术。 * Barrier 生成之后,在这之前的数据都进入此快照,在这之后的数据则进入下一个快照。 **Exactly-Once 保证** * Connector 与端到端的Exactly-Once 保证一个完整作业的执行。 * Source 和 Sink 是 Flink 与外部系统进行数据交互的重要组件。 **Checkpoint 过程** * checkpoint 过程保证作业内部的数据一致性。 * Flink 对以下两类数据做了备份:作业中的每个算子的状态和输入数据的偏移量。 **事务** * Flink借鉴数据库中的事务处理技术,结合自身的 checkpoint 机制来保证Sink 只对外部输出产生一次影响。 * 事务写 (Transaction Write) 指,Flink先将待输出的数据保存下来,暂时不向外部系统提交。

正文

Checkpoint与Barrier

Flink是一个有状态的流处理框架,因此需要对状态做持久化,Flink定期保存状态数据到存储空间上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoint机制。而Checkpoint为Flink提供了Exactly-Once的投递保障。

流处理是一个数据不断输入的过程,为了更好更方便的快照,需要将数据进行分批分段;而Barrier(栅栏)就是做这个事情,它将数据流分段,在进行Checkpoint的时候Flink会在数据流源头处周期性地注入Barrier,这些Barrier会作为数据流的一部分,一起流向下游节点并且不影响正常的数据流。Barrier的作用是将无界数据流从时间上切分成多个窗口,每个窗口对应一系列连续的快照中的一个,每个Barrier都带有一个快照ID,一个Barrier生成之后,在这之前的数据都进入此快照,在这之后的数据则进入下一个快照。
如图所示,当ID为n的Checkpoint Barrier到达每个算子后,表示要对n-1和n之间状态更新做Snapshot。
image

Connector与端到端的Exactly-Once保障

一个完整的Flink作业包括Source和Sink两大模块,Source和Sink肩负着Flink与外部系统进行数据交互的重要功能,它们又被称为外部连接器(Connector)。
Flink的Checkpoint过程保证了一个作业内部的数据一致性,主要是因为Flink对如下两类数据做了备份。

  • 作业中每个算子的状态。
  • 输入数据的偏移量Offset。

端到端的Exactly-Once问题是分布式系统领域最具挑战性的问题之一,很多系统都在试图攻克这个问题。在这个问题上,Flink内部状态的一致性主要依赖Checkpoint机制,外部交互的一致性主要依赖Source和Sink提供的功能。Source需要支持重发功能,Sink需要采用一定的数据写入技术,比如幂等写或事务写。

Source重发

对于Source重发功能,如图7-1所示,只要我们记录了输入的偏移量Offset,作业重启后数据发送方根据该Offset重新开始发送数据即可。Kafka的Producer除了发送数据,还能将数据持久化写到日志文件中。如果下游作业重启,Kafka Producer根据下游作业提供的Offset,从持久化的日志文件中定位到数据,可以重新开始向下游作业发送数据。

image

Sink幂等写

幂等写(Idempotent Write)是指,任意多次向一个系统写入数据,只对目标系统产生一次结果影响。

事务(Transaction)是数据库系统所要解决的核心问题。Flink借鉴了数据库中的事务处理技术,同时结合自身的Checkpoint机制来保证Sink只对外部输出产生一次影响。

简单概括,Flink的事务写(Transaction Write)是指,Flink先将待输出的数据保存下来,暂时不向外部系统提交;等到Checkpoint结束,Flink上、下游所有算子的数据都一致时,将之前保存的数据全部提交到外部系统。换句话说,只有经过Checkpoint确认的数据才向外部系统写入。如图所示,在数据重发的例子中,如果使用事务写,那只把时间戳3之前的输出提交到外部系统,时间戳3以后的数据(例如时间戳5和8生成的数据)先被写入缓存,等得到确认后,再一起提交到外部系统。这就避免了时间戳5的数据多次产生输出,并多次提交到外部系统。

image

在事务写的具体实现上,Flink目前提供了两种方式:预写日志(Write-Ahead-Log,WAL)和两阶段提交(Two-Phase-Commit,2PC)。这两种方式也是很多数据库和分布式系统实现事务时经常采用的方式,Flink根据自身的条件对这两种方式做了适应性调整。这两种方式的主要区别在于:Write-Ahead-Log方式使用Operator State缓存待输出的数据;如果外部系统自身支持事务,比如Kafka,就可以使用Two-Phase-Commit方式,待输出数据被缓存在外部系统。

与聊聊Flink必知必会(二)相似的内容:

聊聊Flink必知必会(二)

### Checkpoint与Barrier Flink是一个有状态的流处理框架,因此需要对状态做持久化,Flink定期保存状态数据到存储空间上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoint机制。而Checkpoint为Flink提供了Exactly-Once的投递保障。 流处理

聊聊Flink必知必会(四)

### 概述 Flink Streaming API借鉴了谷歌数据流模型(Google Data Flow Model),它的流API支持不同的时间概念。Flink明确支持以下3个不同的时间概念。 Flink明确支持以下3个不同的时间概念。 (1)事件时间:事件发生的时间,由产生(或存储)事件的设备

聊聊Flink的必知必会(一)

Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

聊聊Flink的必知必会(三)

### 概述 在进行流处理时,很多时候想要对流的有界子集进行聚合分析。例如有如下的需求场景: (1)每分钟的页面浏览(PV)次数。 (2)每用户每周的会话次数。 (3)每分钟每传感器的最高温度。 (4)当电商发布一个秒杀活动时,想要每隔10min了解流量数据。 对于这些需求的处理,程序需要处理元素组

聊聊Flink CDC必知必会

CDC是(Change Data Capture变更数据获取)的简称。 核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的插入INSERT、更新UPDATE、删除DELETE等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 ## Flink CDC的设

聊聊日志聚类算法及其应用场景

阅读《[基于 Flink ML 搭建的智能运维算法服务及应用](https://mp.weixin.qq.com/s/yhXiQtUSR4hxp9XWrkiiew "基于 Flink ML 搭建的智能运维算法服务及应用")》一文后,对其中日志聚类算法有了些思考。 ### 概述 日志聚类,简而言之是对

聊聊GLM-4-9B开源模型的微调loss计算

概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述。我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都是关心如何使用之类的应用层,而不是其具体的底层逻辑,当然咱也说不清太底层的计算。 可了解其它loss

聊聊一个差点被放弃的项目以及近期的开源计划

前言 自从 StarBlog 和 SiteDirectory 之后,我还没写新的关于开源项目的系列,最近又积累了很多想法,正好写一篇博客来总结一下。 关于差点被放弃的项目,就是最近一直在做的单点认证(IdentityServerLite) IdentityServerLite 开发这个项目的起因,是

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍:https://jwt.io/introduction

聊聊MySQL是如何处理排序的

在MySQL的查询中常常会用到 order by 和 group by 这两个关键字,它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?