目录
- 一、Flink 简介
- 二、Flink 组件栈
- 1. API & Libraries 层
- 2. runtime层
- 3. 物理部署层
- 三、Flink 集群架构
- 四、Flink基本编程模型
- 五、Flink 的优点
一、Flink 简介
Apache Flink 的前身是柏林理工大学一个研究性项目, 在 2014 被 Apache 孵化器所接受,然后迅速地成为了Apache Software Foundation的顶级项目之一。2019 年 1 年,阿里巴巴收购了 Flink 的母公司 Data Artisans,并宣布开源内部的 Blink,Blink 是阿里巴巴基于 Flink 优化后的版本,增加了大量的新功能,并在性能和稳定性上进行了各种优化,经历过阿里内部多种复杂业务的挑战和检验。
Flink 是一个分布式的流处理框架,它能够对有界和无界的数据流进行高效的处理。
二、Flink 组件栈
Flink 采用分层的架构设计,从而保证各层在功能和职责上的清晰。如下图所示,由上而下分别是 API & Libraries 层、Runtime 核心层以及物理部署层:
1. API & Libraries 层
- API层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API
- 在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类
这里的API可以进行更具体的划分
API 的一致性由下至上依次递增,接口的表现能力由下至上依次递减
-
SQL 和 Table API 同时适用于批处理和流处理,这意味着可以对有界数据流和无界数据流以相同的语义进行查询,并产生相同的结果。
-
DataStream 和 DataSet API 是 Flink 数据处理的核心 API,支持使用 Java 语言或 Scala 语言进行调用,提供了数据读取,数据转换和数据输出等一系列常用操作的封装。
-
Stateful Stream Processing 是最低级别的抽象,它通过 Process Function 函数内嵌到 DataStream API 中。 Process Function 是 Flink 提供的最底层 API,具有最大的灵活性,允许开发者对于时间和状态进行细粒度的控制。
2. runtime层
这一层是 Flink 分布式计算框架的核心实现层,包括作业转换,任务调度,资源分配,任务执行等功能,基于这一层的实现,可以在流式引擎下同时运行流处理程序和批处理程序。
3. 物理部署层
Flink 的物理部署层,用于支持在不同平台上部署运行 Flink 应用
Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)
三、Flink 集群架构
Flink采用标准的 Master - Slave 结构, 其中,Master 部分包含了三个核心组件:Dispatcher、ResourceManager 和 JobManager,而 Slave 则主要是 TaskManager 进程。它们的功能分别如下:
-
JobManager: 负责所有需要中央协调的操作,比如说检查点(checkpoints) 的协调
- 接收由 Dispatcher 传递过来的执行程序,该执行程序包含了作业图 (JobGraph),逻辑数据流图 (logical dataflow graph) 及其所有的 classes 文件以及第三方类库 (libraries) 等等 。
- JobManagers 会将 JobGraph 转换为执行图 (ExecutionGraph)
- 向 ResourceManager 申请资源来执行该任务,一旦申请到资源,就将执行图分发给对应的 TaskManagers 。因此每个作业 (Job) 至少有一个 JobManager;高可用部署下可以有多个 JobManagers,其中一个作为 leader,其余的则处于 standby 状态。
-
TaskManagers:负责实际的子任务 (subtasks) 的执行
- 每个 TaskManagers 都拥有一定数量的 slots。Slot 是一组固定大小的资源的合集 (如计算能力,存储空间)
- TaskManagers 启动后,会将其所拥有的 slots 注册到 ResourceManager 上,由 ResourceManager 进行统一管理
- 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的 TaskManager交换数据
-
ResourceManager :负责管理 slots 并协调集群资源
- ResourceManager 接收来自 JobManager 的资源请求,并将存在空闲 slots 的 TaskManagers 分配给 JobManager 执行任务
- Flink 基于不同的部署平台,如 YARN , Mesos,K8s 等提供了不同的资源管理器
- 当 TaskManagers 没有足够的 slots 来执行任务时,它会向第三方平台发起会话来请求额外的资源。
-
Dispatcher
- 负责接收客户端提交的执行程序,并传递给 JobManager
- 提供了一个 WEB UI 界面,用于监控作业的执行情况
- 在架构中可能并不是必需的,这取决于应用提交运行的方式。
Flink任务 on yarn
四、Flink基本编程模型
所有的Flink程序都是由三部分组成的: Source 、Transformation 和 Sink
- Source 负责读取数据源
- Transformation 利用各种算子进行处理加工
- Sink 负责输出
每一个dataflow以一个或多个sources开始以一个或多个sinks结束。dataflow 类似于任意的有向无环图(DAG)
下面是一个由Flink程序映射为Streaming Dataflow的示意图:
转化为并行的数据流时
五、Flink 的优点
- Flink 是基于事件驱动 (Event-driven) 的应用,能够同时支持流处理和批处理
- 基于内存的计算,能够保证高吞吐和低延迟,具有优越的性能表现
- 支持精确一次 (Exactly-once) 语意,能够完美地保证一致性和正确性
- 分层 API ,能够满足各个层次的开发需求
- 支持高可用配置,支持保存点机制,能够提供安全性和稳定性上的保证
- 多样化的部署方式,支持本地,远端,云端等多种部署方案
- 具有横向扩展架构,能够按照用户的需求进行动态扩容
- 活跃度极高的社区和完善的生态圈的支持