Flink - 核心原理、执行流程、运行架构详解
作者:hangge | 2025-02-13 08:59
一、基本介绍
1,什么是 Flink?
(1)Flink 是一个开源的分布式、高性能、高可用、准确的实时数据计算框架.
(2)Flink 的前身是柏林理工大学的一个研究性项目。它在 2014 年被 Apache 孵化器所接受,然后迅速地成为 ASF(Apache Software Foundation)的顶级项目之一。
(3)Flink 也有一套类似于 Spark 的生态圈,主要包括 DataStream API、DataSet API、Table API、SQL、FlinkML,涉及实时数据处理、SQL 操作、图计算和机器学习。
2,Flink 的特点
- 流式优先:Flink 可以连续处理流式数据(实时数据)。
- 容错:Flink 提供了有状态的计算,会记录数据的中间状态,当任务执行失败时,可以实现故障恢复,并且可以提供 Exactly-Once 语义支持。
- 可伸缩:Flink 集群可以支持上千个节点。
- 性能:Flink 能够提供高吞吐、低延迟的性能。高吞吐表示在单位时间内可以处理海量数据,低延迟表示在数据产生以后可以在很短的时间内对其进行处理,即 Flink 可以实现快速处理海量数据。
3,Flink 的典型应用场景
Flink 主要应用于流式数据分析场景,主要应用在以下领域:
- 实时 ETL:集成实时数据计算系统现有的诸多数据通道和 SQL 灵活的加工能力,对实时数据进行清洗、归并和结构化处理。同时,为离线数仓进行有效的补充和优化,为数据实时传输提供计算通道。
- 实时报表:实时采集、加工和存储,实时监控和展现业务、客户各类指标,让数据化运营实时化。
- 监控预警:对系统和用户行为进行实时检测和分析,实时监测和发现危险行为。
- 在线系统:实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策略。它在内容投放、无线智能推送等领域有着大量的应用。
4,Flink 的核心算子
(1)Flink 中提供了 4 种不同层次的 API,每种 API 在简洁和易用性之间有自己的权衡,适用于不同的场景。
- Sateful Stream Processing:低级 API,提供了对时间和状态的细粒度控制,简洁性和易用性较差,主要应用在一些复杂事件处理逻辑上。
- DataStream / DataSet API:核心 API,提供了针对实时数据和离线数据的处理,是对低级 API 进行的封装,提供了 filter()、sum()、max()、min() 等高级函数,简单易用,所以这些 API 在工作中应用得比较广泛。
- Table API:对 DataStream / DataSet API 做了进一步封装,提供了基于 Table 对象的一些关系型 API。
- SQL:高级语言。Flink 的 SQL 是基于 Apache Calcite 的,而 Apache Calcite 实现了标准的 SQL,使用起来比其他 API 更加方便。Table API 和 SQL 可以很容易地结合在一块使用,它们都返回 Table 对象。

(2)在工作中常用的是 DataStream/DataSet API 和 SQL。如果能用 SQL 解决,那使用 SQL 是最方便快捷的。复杂一些的可以考虑使用 DataStream/DataSet API。
二、原理分析
1,核心组件
(1)Flink 中提供了以下 3 个核心组件:

(2)各组件作用如下:
- DataSource:数据源,主要用来接收数据。例如:readTextFile()、socketTextStream()、fromCollection(),以及一些第三方数据源组件。
- Transformation:计算逻辑,主要用来对数据进行计算。例如:map()、flatmap()、filter()、reduce() 等类型的算子。
- DataSink:目的地,主要用来把计算的结果数据输出到其他存储介质(例如 Kafka、Redis、Elasticsearch 等)中。
2,执行流程
Flink 任务在运行期间可以读取多种实时数据源中的数据,之后通过多种 Transformation 算子对数据进行计算,最终把结果输出到多种目的地。

3,Streaming 和 Batch
(1)Flink 是一个实时数据计算框架,但是它也支持离线数据计算。对于 Flink 而言,离线数据计算只是实时数据计算的一个极限特例而已。
实时数据计算与离线数据计算:
- 在大数据处理领域,离线数据计算任务与实时数据计算任务一般被认为是两种截然不同的任务。一个大数据框架一般会被设计用来处理其中一种任务,例如 Storm 只支持实时数据计算任务,而 MapReduce、Spark 只支持离线数据计算任务。
- Spark Streaming 是 Spark 支持实时数据计算任务的子系统,看似是一个特例,其实并不是。Spark Streaming 采用了一种 Micro-Batch 的架构,即把输入的数据流切分成细粒度的 Batch,并为每一个 Batch 数据提供了一个离线数据计算的 Spark 任务。所以,Spark Streaming 本质上还是基于 Spark 离线数据计算的,和 Storm 这种真正的实时数据计算完全不同。
- 对于一个实时数据计算系统,其节点间数据传输的标准模型是:一条数据在被处理完成后会被序列化到缓存中,然后被立刻通过网络传输到下一个节点,由下一个节点继续处理,如下图所示:

- 而对于一个离线数据计算系统,其节点间数据传输的标准模型是:一条数据在被处理完成后会被序列化到缓存中,并不会立刻被通过网络传输到下一个节点。当缓存写满后,数据会持久化到本地磁盘上。当所有数据都被处理完成后,才开始将处理过的数据通过网络传输到下一个节点,如下图所示:

(3)Flink 的执行引擎同时支持这两种数据传输方式。Flink 以固定的缓存块为单位进行网络数据传输,可以通过设置缓存块超时值指定缓存块的传输时机:
- 如果缓存块的超时值被设置为 0,则 Flink 的数据传输方式类似于上文提到的实时数据计算系统的数据传输方式,此时系统可以获得最低的处理延迟。
- 如果缓存块的超时值被设置为无限大,则 Flink 的数据传输方式类似于上文提到离线数据计算系统的数据传输方式,此时系统可以获得最高的吞吐量。
注意:缓存块的超时值也可以被设置为 0 到无限大之间的任意值。缓存块的超时阈值越小,则 Flink 流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。可以根据需求调整缓存块的超时阈值,从而权衡系统延迟和吞吐量。

三、架构分析
1,核心架构
(1)Flink 核心架构可以分为以下 4 层:
- Deploy 层:主要涉及 Flink 的部署模式。Flink 支持多种部署模式,包括本地单机部署、集群部署(Standalone / ON YARN)和云服务器部署(GCE / EC2)。
- Core 层:提供了 Flink 分布式流处理(实时数据计算)模型的核心实现,为 API 层提供基础服务。
- API 层:提供了实时数据计算 API 和离线数据计算 API。其中,实时数据计算对应的是 DataStream API,离线数据计算对应的是 DataSet API。
- Libraries 层:也被称为 Flink 应用框架层。它在 API 层之上构建了满足特定应用的计算框架,分别对应于实时数据计算和离线数据计算。实时数据计算支持 CEP(复杂事件处理)、Table 和 SQL 操作。离线数据计算支持 FlinkML(机器学习)、Gelly(图计算)、Table 和 SQL 操作。
(2)具体分层架构图如下,可以看到 Flink 对 Core 层的代码进行了封装,为用户提供了上层的 DataStram API 和 DataSet API。使用这些 API,可以很方便地完成实时数据计算任务和离线数据计算任务。另外,Flink 在 Libraries 层提供了基于 Table 和 SQL 操作,可以通过 SQL 轻松实现实时数据计算和离线数据计算(这也是 Flink 最大的亮点)。

2,集群架构
(1)在实际工作中,Flink 集群最常用的两种架构是:Standalone(独立集群)和 ON YARN
- Standalone:适合小型且独立的项目,轻量级,不依赖于 Hadoop。缺点是集群资源不能共用,只能运行 Flink 任务。
- ON YARN:不需要单独部署 Flink 集群,减少运维成本;而是直接使用 Hadoop(YARN)集群的资源,共用集群资源。
(2)首先分析一下 Standalone 架构。这种架构包含两个节点:
- Master 节点:主节点。支持一个或者多个,可以实现高可用(HA)。在 Master 节点上会运行一个 JobManager 进程,负责集群资源管理和任务调度。
- Slave 节点:从节点。支持多个。在 Slave 节点上会运行一个 TaskManager 进程,负责执行 Master 节点分配给它的任务。
注意:多个 Master 节点(JobManager)要实现高可用,则需要依赖 Zookeeper。Flink 利用
ZooKeeper 实现多个 Master 节点之间的分布式协调服务。

(3)Flink 的 ON YARN 架构的原理是,依靠 YARN 来调度 Flink 任务。目前在企业中使用得最多的就是这种方式。这种方式的好处是:可以充分利用集群资源,提高集群机器的利用率。即只需要 1 套 Hadoop 集群,在其中既可以执行 MapReduce 任务,也可以执行 Spark 任务,还可以执行 Flink 任务,非常方便,运维也很轻松。

(4)Flink ON YARN 架构在运行时可以细分为以下两种模式:
- Session 模式:可以称之为会话模式或多任务模式。这种模式会在 YARN 中初始化一个 Flink 集群,以后提交的 Flink 任务都提交到这个 Flink 集群中。这个 Flink 集群会常驻在 YARN 集群中,除非手工停止。
- Per-Job 模式:可以称之为单任务模式。这种模式在每次提交 Flink 任务时都会创建一个新的 Flink 集群,Flink 任务之间相互独立,互不影响。在任务执行完成后,创建的 Flink 集群也会消失。
(1)Session 模式和 Per-Job 模式对比:
- Session 模式的优点是 Flink 任务的启动时间会缩短(节省了启动 Flink 集群的时间),缺点是会一直占据集群资源。适合规模小、短时间运行的任务。
- Per-Job 模式的优点是及时释放集群资源,缺点是每次提交 Flink 任务都需要创建新的 Flink 集群,任务的启动时间会延长。适合规模大、长时间运行的任务。
(2)在实际工作中,Flink 实时计算任务都是需要长时间运行的,所以 Per-Job 模式是最常用的。
全部评论(0)