是什么
- Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算
概念:
-
数据流
- 任何类型的数据都可以形成一种事件流,信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流。
-
什么是有界流
- 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理
-
什么是无界流
- 有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
部署方式:
-
Local 本地部署,直接启动进程,适合调试使用
-
Standalone Cluster集群部署,flink自带集群模式
-
On Yarn 计算资源统一由Hadoop YARN管理资源进行调度,按需使用提高集群的资源利用率,生产环境
-
运行流程
- 用户提交Flink程序到JobClient,
- JobClient的 解析、优化提交到JobManager
- TaskManager运行task, 并上报信息给JobManager
- 通俗解释
- JobManager 包工头
- TaskManager 任务组长
- Task solt 工人 (并行去做事情)
运行架构
- Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序
- 运行时由两种类型的进程组成
- 一个 JobManager
- 一个或者多个 TaskManager。
- 运行时由两种类型的进程组成
-
什么是JobManager(大Boss,包工头)
- 协调 Flink 应用程序的分布式执行的功能
- 它决定何时调度下一个 task(或一组 task)
- 对完成的 task 或执行失败做出反应
- 协调 checkpoint、并且协调从失败中恢复等等
- 协调 Flink 应用程序的分布式执行的功能
-
什么是TaskManager (任务组长,搬砖的人)
- 负责计算的worker,还有上报内存、任务运行情况给JobManager等
- 至少有一个 TaskManager,也称为 worker执行作业流的 task,并且缓存和交换数据流
- 在 TaskManager 中资源调度的最小单位是 task slot
进阶
-
Jobmanager进阶
- JobManager进程由三个不同的组件组成
- ResourceManager
- 负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots
- Dispatcher
- 提供了一个 REST 接口,用来提交 Flink 应用程序执行
- 为每个提交的作业启动一个新的 JobMaster。
- 运行 Flink WebUI 用来提供作业执行信息
- JobMaster
- 负责管理单个JobGraph的执行,Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster
- 至少有一个 JobManager,高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby
- ResourceManager
- JobManager进程由三个不同的组件组成
-
TaskManager 进阶
- TaskManager中 task slot 的数量表示并发处理 task 的数量
- 一个 task slot 中可以执行多个算子,里面多个线程
- 算子 opetator
- source
- transformation
- sink
- 算子 opetator
- 对于分布式执行,Flink 将算子的 subtasks 链接成 tasks,每个 task 由一个线程执行
- 图中source和map算子组成一个算子链,作为一个task运行在一个线程上
- 将算子链接成 task 是个有用的优化:它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量
Task Slots 任务槽
-
Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个subtask ,每个subtask会以单独的线程来运行
-
每个 worker(TaskManager)是一个 JVM 进程,可以在单独的线程中执行一个(1个solt)或多个 subtask
-
为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)
-
每个 task slot 代表 TaskManager 中资源的固定子集
-
注意
- 所有Task Slot平均分配TaskManger的内存, TaskSolt 没有 CPU 隔离
- 当前 TaskSolt 独占内存空间,作业间互不影响
- 一个TaskManager进程里有多少个taskSolt就意味着多少个并发
- task solt数量建议是cpu的核数,独占内存,共享CPU
-
5 个 subtask 执行,因此有 5 个并行线程
- Task 正好封装了一个 Operator 或者 Operator Chain 的 parallel instance。
- Sub-Task 强调的是同一个 Operator 或者 Operator Chain 具有多个并行的 Task
- 图中source和map算子组成一个算子链,作为一个task运行在一个线程上
- 算子链接成 一个 task 它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量
- Task Slot是Flink中的任务执行器,每个Task Slot可以运行多个task即subtask ,每个sub task会以单独的线程来运行
- Flink 算子之间可以通过【一对一】模式或【重新分发】模式传输数据
- 一个很重要的区分 TaskSolt和parallelism并行度配置
- task slot是静态的概念,是指taskmanager具有的并发执行能力;
- parallelism是动态的概念,是指 程序运行时实际使用的并发能力
- 前者是具有的能力比如可以100个,后者是实际使用的并发,比如只要20个并发就行。