flink整体构成
-
作业管理器(JobManager):管理者 负责管理调度 不考虑高可用 只能有一个
-
任务管理器(TaskManager):工作者 负责执行任务处理数据 可以有一个或者多个
作业管理器(JobManager)
任务管理和调度的核心 控制应用执行的主进程
组件
JobMaster
-
作用是处理单独的作业(Job)
-
每个Job都有一个自己独立的JobMaster
JobMaster接收需要执行的应用1
JobMaster将作业图(JobGraph)转换成一个执行图(ExecutionGraph)2
JobMaster向组员管理器(ResourceManager)发出请求 申请执行任务必要的资源 一旦获取到足够的资源 将执行图分发到真正运行它们的TaskManager上
在运行过程中JobManager会负责所有需要中央协调的工作 例如检查点的协调
资源管理器(ResourceManager)
-
资源的分配和管理 资源主要是指主要是指TaskManager上的任务槽(task slots)4 ,每一个任务都需要分配到一个slot上执行
分发器(Dispatcher)
-
提供一个REST接口 用来提交应用
-
为每一个新提交的作业启动一个新的JobManager组件
-
启动Web UI
任务管理器(TaskManager)
-
工作进程 数据流的具体计算
-
包含了一定数量的任务槽(task solt)
-
收到资源管理器指令之后 将一个或者多个槽位提供给JobManager调用 Jobmanager分配任务
-
执行过程中 TaskManager可以缓冲数据 也可以进行TaskManager之间通信
作业提交流程
抽象流程
-
客户端(app)通过分发器(dispatcher)提供的REST接口 将作业提交个JobManager
-
由分发器启动JobMaster 并将作业1,提交给JobMaster
-
JobMaster将JobGraph解析为可执行的ExectionGraph 得到所需的资源数量 然后向资源管理器请求资源(slots)2
-
资源管理器判断当前是否由足够的可用资源:如果没有启动新的TaskManager
-
TaskManager启动后 向ResourceManager注册自己的可用任务槽(slots)
-
资源管理器通知TaskManager为新的作业提供slots
-
TaskManager链接到对应的JobMaster 提供Slots
-
JobMaster将需要执行的任务分发给TaskManager
-
TaskManager执行任务 相互之间可以交换数据
YARN集群
会话模式(Session)
-
启动YARN session 创建一个Flink集群 只启动了JobManager
-
客户端通过REST接口 将作业提交给分发器
-
分发器启动JobMaster 将作业交给JobManager
-
JobMaster向资源管理器请求资源(slots)
-
资源管理器向YARN的资源管理器请求container资源
-
YARN启动新的TaskManager容器
-
TaskManager启动后 向Flink资源管理器注册自己的可用任务槽
-
资源管理器通知TaskManager为新的作业提供slots
-
TaskManager链接到对应的JobMaster 提供slots
-
JobMaster将需要执行的任务分发给TaskManager 执行任务
单作业模式
不会预先启动Flink集群 而是在提交作业时才会启动新的JobManager
-
客户端将作业提交给YARN的资源管理器 同时将Flink的Jar包和配置上传到HDFS 以便后续启动Flink相关组件的容器
-
Yarn的资源管理器分配Container资源 启动Flink JobManager 并将作业提交给JobMaster 省略Dispatch组件 同回话模式3
-
JobMaster向资源管理器请求资源(slots)
-
资源管理器向YARN的资源管理器请求container资源
-
YARN启动新的TaskManager容器
-
TaskManager启动后 向Flink资源管理器注册自己的可用任务槽
-
资源管理器通知TaskManager为新的作业提供slots
-
TaskManager链接到对应的JobMaster 提供slots
-
JobMaster将需要执行的任务分发给TaskManager 执行任务
应用模式
与但作业的提交流程非常相似 只是初始提交给 Yarn资源管理器是具体的作业 而是整个应用
一个应用中可能包含了多个作业
这些作业都将在Flink中启动各自对应的JobManager
重要概念
数据流图(Dataflow Graph)
Flink代码中 定义每一个处理转换操作为"算子"(Operator)
算子分类:
-
Source表示源算子 负责读取数据源
-
Transformation 表示转换算子 利用各种算子进行处理加工
-
Sink表示 下沉算子 负责数据的输出
Flink程序会被映射成所有算子按照逻辑顺序链接在一起的一张图 称为数据流图
类似有向无环图 每一条数据流由一个或多个source算子开始 以一个或者多个sink算子结束
并行度(Parallelism)
flink 用于实现数据并行:
将数据先分发到多个节点
将算子操作 "复制"放到多个节点 数据哎了之后就可以到其中任意一个执行
在Flink执行过程中 每一个算子可以包含一个或多个子任务 这些子任务在不同的线程 不同的物理机 或不同的容器中完全独立的运行
一个特定的算子的子任务(subtask)的个数称之为并行度(parallelisim)
这样 包含并行子任务的数据流就是并行数据流 它需要多个分区(stream partition)来分配任务
一般情况下 一个流程序的并行度 可以认为是其所有算子中最大的并行度
一个程序中 不同的算子可以有不同的并行度
算子链(Operator Chain)
在Flink中 有两种数据传输形式的算子
-
一对一:数据流维护这分区以及元素的顺序 保证着"一对一关系"
-
重分区:数据流的分区会发生改变 每一个子任务 会根据数据传输策略 把数据发送到不同的下游目标任务中
合并算子链:
并行度相同的一对一算子操作 可以直接链接在一起形成一个大的任务(task) 这样原来的算子就称为真正任务力的一部分 每个task会被一个线程执行
这样的技术被称为"算子链"
作业图(JobCraph)与执行图(ExecutionGraph)
Flink程序直接映射称为的数据流图(表示计算逻辑的高级视图) 带具体的执行环节时 还需要考虑并行子任务的分配 数据在任务间的传输 以及合并算子链的优化
为了说明最终应该怎样执行一个流处理程序 Flink需要将逻辑流图进行解析 转换为物理数据流图
逻辑流图(StreamGraph)->作业图(JobGraph)->执行图(ExecutionGraph)->物理图(physical Graph)
-
逻辑流图(StreamGraph)
根据用户通过DataStreamAPI所编写的代码生成的最初的DAG图 表示程序的拓扑结构
-
作业图(JobGraph)
StramGraph经过优化后生成 提交给JobManager 的数据结构 确定了当前所有作业中所有任务的划分
-
将多个符合条件的节点链接在一起合并成一个任务节点 形成算子链 以减少数据交换的消耗
-
-
执行图(ExecutionGraph)
JobMaster收到JobGraph后 会根据它来生成执行图(ExecutionGraph) 是JobGraph的并行化 版本 是调度称最核心的数据结构
-
物理图(Physical Graph)
JobMaster生成执行图后 会将它分发给TaskManager
各个TaskManager会根据执行图部署任务 最终物理执行过程也会形成一张"图" 只是一个执行层面的图 并不是一个具体的数据结构
任务(Task)和任务槽(Task Slots)
Slots作用:独立执行一个子任务的
-
任务对任务槽的共享
只要是同一个作业 对于不同任务节点的并行终极任务 就可以放到同一个slot上执行 所以对第一个任务节点 它的六个并行子任务必须分到不同的slot( 如果在同一个slot就没法数据并行了)
资源密集型(对资源消耗多)和非资源密集型(对资源消耗少)的任务同时放到一个slot中
[1] 由客户端提交上来 包括jar包 数据流图(dataflow graph) 作业图(JobGraph)
[2] 物理层面的数据流图3 包含了可以并发执行的任务
[3] JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构
[4] 机器执行计算一组CPU资源和内存资源