这是我参与「第四届青训营 」笔记创作活动的的第 1 天
1. Flink 概述
1.1. Apache Flink 的诞生背景
大数据:之无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。
特点(4V):Value(价值化)、Volumes(海量化)、Variety(多样化)、Velocity(快速化)
数据实时性的需要,流式计算被提出
1.2. 为什么 Apache Flink 会脱颖而出
流式计算框架对比:
| Storm | Spark Streaming | Flink | |
|---|---|---|---|
| Streaming Model | Native | mini-batch | Native |
| 一致性保证 | At Least/Most Once | Exactly-Once | Exactly-Once |
| 延迟 | 低延迟(毫秒级) | 延迟较低(秒级) | 低延迟(毫秒级) |
| 吞吐 | Low | High | High |
| 容错 | ACK | RDD Based Checkpoint | Checkpoint(Chandy-Lamport) |
| StateFul | No | Yes(DStream) | Yes(Operator) |
| SQL支持 | No | Yes | Yes |
分布式处理引擎,基于有边界和无边界之上数据集有状态计算
2. Flink 整体架构
2.1. Flink 分层架构
- SDK 层:Flink 的 SDK 目前主要有三类,SQL/Table、DataStream、Python;
- 执行引擎层(Runtime 层):执行引擎提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度曾再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
- 状态存储层:负责存储算子的状态信息;
- 资源调度层:目前 Flink 可以支持部署在多种环境
2.2. Flink 总体架构
一个 Flink 集群,主要包含以下两个核心组件:
- JobManager(JM):负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等;
- TaskManager(TM):负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换
JobManager
- Dispatcher:接收作业,拉起 JobManager 来执行作业,并在 JobManager 挂掉之前恢复作业;
- JobMaster:管理一个 job 的震哥哥生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
- ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 MR 注册;
2.3. Flink 作业示例
2.4. Flink 如何做到流批一体
| 维度 | 流式计算 | 批式计算 |
|---|---|---|
| 数据流 | 无线数据集 | 有限数据集 |
| 时延 | 低延迟,业务会感知运行中的情况 | 实时性要求不高,只关注最终结果产出时间 |
- 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流。
Apache Flink 主要从一些几个模块来做流批一体:
- SQL 层;
- DataStream API 层同意,批和流都可以使用 DataSteam API 来开发;
- Scheduler 层架构统一,支持流批场景;
- Failover Recovery 层架构统一,支持流批场景;
- Shuffle Service 层架构同意,流批场景选择不同的 Shuffle Service;
Scheduler 层
Flink 的两种调度模式:
| 模式 | 特点 | 场景 |
|---|---|---|
| EAGER | 申请一个作业需要的全部资源,然后同时调度这个作业的全部 Task,所有的 Task 之间采取 Pipeline 的方式进行通信 | Stream 作业场景 |
| LAZY | 先调度上游,等待上游产生数据会结束后再调度下游,类似 Spark 的 Stage 执行模式 | Batch 作业场景 |
Shuffle 层
Shuffle 的几种不同实现:
- 基于文件的 Pull Based Shuffle,比如 Spark 或 MR,它的特点是具有较高的容错性,适合大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
- 基于 Pipeline 的 Push Based Shuffle,比如 Flink、Storm、Presto 等,特的特点是低延迟和高性能,但是因为 shuffle 数据没有存储下来,如果是 batch 任务的话,就需要进行重跑恢复。
流和批 Shuffle 之间的差异:
- Shuffle 数据的生命周期:流作业的 Shuffle 数据与 Task 是绑定的,而批作业的 Shuffle 数据与 Task 是解耦的;
- Shuffle 数据存储介质:流作业的生命周期比较短、而且流作业为了实时性,Shuffle 通常存储在内存中,批作业因为数据量比较大以及容错的需求一般会存储在磁盘里;
- Shuffle 的部署方式:流作业 Shuffle 服务和计算节点部署在一起,可以减少网络开销,从而减少 latency,而批作业则不同;