flink相关概念介绍

2021-07-19  本文已影响0人  另存為

Flink定义

Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams.

Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。

Flink相关概念

批处理是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。

流处理正相反,其涉及无界数据流。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。

image-20210514141555125.png

Flink架构

在Flink中执行应用程序主要涉及三个实体:ClientJobManagerTaskManagers

Client

client不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式

JobManager

ResourceManager

Dispatcher

JobMaster

JobMaster负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。

TaskManager

时间语义

Flink 明确支持以下三种时间语义:

image

在 Flink 的流式处理中,绝大部分的业务都会使用 eventTime。

我们知道,流处理从事件产生,到流经 source,再到 operator,中间是有一个过程和时间的,虽然大部分情况下,流到 operator 的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、分布式等原因,导致乱序的产生,所谓乱序,就是指 Flink 接收到的事件的先后顺序不是严格按照事件的 Event Time 顺序排列的。

image

window

出现乱序数据,首先想到的是要排序,但是流式数据中不能等待所有数据都到达再进行排序,而是要将数据流切分为数据集,并对数据集进行排序,由此引入窗口的概念。 窗口是一种切割无限数据为有限块进行处理的手段,是无限数据流处理的核心。

Flink 有一些内置的窗口分配器,如下所示:

image

可以对窗口内收集到的数据做聚合或者其他处理操作,主要非为两大类:

Flink提供了丰富的window API:

image

Watermark

窗口操作虽然可以解决乱序问题,但是依然存在迟到数据的现象,由此引入Watermark。

image

当一个窗口戳到了关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。数据流中的 Watermark 用于表示 timestamp 小于 Watermark 的数据都已经到达了,因此,window 的执行也是由 Watermark 触发的。

watermarks 给了开发人员一种选择,使开发者做流处理时可以控制延迟和结果正确性之间的权衡。

State Backends

由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问。每传入一条数据,有状态的算子任务都会读取和更新状态。状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(state backend) 。如果发生故障,Flink 可以恢复应用程序的完整状态并继续处理。

状态后端主要负责两件事:本地的状态管理,以及将检查点(checkpoint)状态写入远程存储。

名称 状态存储位置 checkpoint存储位置 快照 特点
RocksDBStateBackend RocksDB RocksDB 全量 / 增量 支持大于内存大小的状态经验法则:比基于堆的后端慢10倍
FsStateBackend TM JVM Heap 分布式文件系统 全量 快速,需要大的堆内存受限制于 GC 同时拥有内存级的本地访问速度,和更好的容错保证
MemoryStateBackend TM JVM Heap JM JVM Heap 全量 适用于小状态(本地)的测试和实验 快速、低延迟,但不稳定
image

算子状态的作用范围限定为算子任务,由同一并行任务所处理的所有数据都可以访问到相同的状态,如聚合每分钟的事件时,可将一分钟内数据的增量聚合结果作为状态保存。

Checkpoint

image

Checkpoint是由 Flink 自动执行的快照,Flink 故障恢复机制的核心就是应用状态的一致性检查点。有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照),这个时间点,应该是所有任务都恰好处理完一个相同的输入数据的时候。

image

在执行流应用程序期间,Flink 会定期保存状态的一致检查点。如果发生故障, Flink 将会使用最近的检查点来一致恢复应用程序的状态,并重新启动处理流程

image

遇到故障之后,第一步就是重启应用

image

第二步是从 checkpoint 中读取状态,将状态重置。从检查点重新启动应用程序后,其内部状态与检查点完成时的状态完全相同

image

第三步:开始消费并处理检查点到发生故障之间的所有数据,这种检查点的保存和恢复机制可以为应用程序状态提供“精确一次”(exactly-once)的一致性,因为所有算子都会保存检查点并恢复其所有状态,这样一来所有的输入流就都会被重置到检查点完成时的位置。

Savepoint

一个 Savepoint,就是一个应用服务状态的一致性快照,因此其与checkpoint组件的很相似,但是与checkpoint相比,Savepoint 需要手动触发启动,而且当流应用服务停止时,它并不会自动删除。Savepoint 常被应用于启动一个已含有状态的流服务,并初始化其(备份时)状态。

Savepoint 有以下特点:

状态一致性

Flink内部的状态一致性

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

端到端的状态一致性

流处理应用除了流处理器以外还包含了数据源(例如 Kafka)和输出到持久化系统。端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一致性。整个端到端的一致性级别取决于所有组件中一致性最弱的组件。

为实现目标端数据不重复下写入有以下实现方式:

事务写入的两种实现方式:

预写日志:

缺点:微批处理,不能保证一批数据全部成功。

两阶段提交

2PC 对外部 sink 系统的要求

部署

部署模式

Session and Per-Job Mode
application.png

client load:此过程包括在本地下载应用程序的依赖项,执行用户代码以提取 Flink 的运行时可以理解的应用程序(即JobGraph),并将依赖项和JobGraph(s)传送到集群。

部署模式 client load执行位置 JM是否隔离 TM是否隔离 原生k8s集群是否支持
Application Mode Client
Per-Job Mode JM
Session Mode JM

Flink对k8s集群的要求

关注作者公众号 HEY DATA,一起讨论更多

上一篇 下一篇

猜你喜欢

热点阅读