小言_互联网的博客

快速入门Flink(3)——Flink运行架构(面试必问,建议收藏)

581人阅读  评论(0)


        上一篇教大家如何搭建一个Flink集群,本篇博客给大家讲解一下Flink运行时架构(面试必问)

一、Flink运行时组件

1.1 作业管理器(JobManager)

  1. 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的Jobmanager所控制执行
  2. Jobmanager会先接收到要执行的应用程序,这个应用程序会包括:作业图( Job Graph)、逻辑数据流图( ogical dataflow graph)和打包了所有的类、库和其它资源的JAR包
  3. Jobmanager会把 Jobgraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(Executiongraph),包含了所有可以并发执行的任务。Job Manager会向资源管理器( Resourcemanager)请求执行任务必要的资源,也就是(任务管理器( Taskmanager)上的插槽slot。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 Taskmanager上。而在运行过程中Jobmanagera会负责所有需要中央协调的操作,比如说检查点( checkpoints的协调。

1.2 任务管理器(Taskmanager)

  1. Flink中的工作进程。通常在 Flink中会有多个 Taskmanageria运行,每个 Taskmanageri都包含了一定数量的插槽( slots)插槽的数量限制了Taskmanageri能够执行的任务数量
  2. 启动之后, Taskmanager会向资源管理器注册它的插槽;收到资源管理器的指令后, Taskmanageri就会将一个或者多个插槽提供给Jobmanageri调用 Jobmanager就可以向插槽分配任务( tasks)来执行了
  3. 在执行过程中,一个 Taskmanagera可以跟其它运行同一应用程序的Taskmanager交换数据

1.3 资源管理器(Resource Manager)

  1. 主要负责管理任务管理器( Task Manager)的插槽(slot)Taskmanger插槽是 Flink中定义的处理资源单元
  2. Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARNMesos、K8s,以及 standalone部署。
  3. 当 Jobmanagerl申请插槽资源时, Resourcemanager会将有空闲插槽的Taskmanager?分配给Jobmanager如果 Resourcemanagery没有足够的插槽来满足 Jobmanagerf的请求它还可以向资源提供平台发起会话,以提供启动 Taskmanageri进程的容器

1.4 分发器(Dispatcher)

  1. 可以跨作业运行,它为应用提交提供了REST接口。
  2. 当一个应用被提交执行时,分发器就会启动并将应用移交给Jobmanage
  3. Dispatcher他会启动一个WebUi,用来方便地展示和监控作业执行的信息
  4. Dispatcher?在架构中可能并不是必需的,这取決于应用提交运的方式。

二、任务提交流程

  1. 提交应用
  2. 启动并提交应用
  3. 请求slots
  4. 任务启动
  5. 注册slots
  6. 发出提供slot的指令
  7. 提供slots
  8. 提交要在slots中执行的任务
  9. 交换数据

2.1 任务提交流程(YARN)

  1. Flink 任务提交后,Client 向 HDFS 上传 Flink 的 Jar 包和配置
  2. 随后向 Yarn ResourceManager 提 交 任 务 ,ResourceManager 分 配 Container 资 源 并 通 知 对 应 的 NodeManager 启 动
  3. ApplicationMaster,ApplicationMaster 启动后加载 Flink 的 Jar 包 和 配 置 构 建 环 境
  4. 然 后 启 动 JobManager , 之 后 ApplicationMaster 向 ResourceManager 申 请 资 源 启 动 TaskManager
  5. ResourceManager 分 配 Container 资 源 后 , 由 ApplicationMaster 通 知 资 源 所 在 节 点 的 NodeManager 启动 TaskManager
  6. NodeManager 加载 Flink 的 Jar 包和配置构建环境并启动 TaskManager
  7. TaskManager 启动后向 JobManager 发送心跳包,并等待 JobManager 向其分配任务

三、任务调度原理

3.1 TaskManager 和 Slots

  1. Flink中每一个 Taskmanageri都是一个JMM进程,它可能会在独立的线程上执行一个或多个 subtask
  2. 为了控制一个 Taskmanageri能接收多少个task, Taskmanager通过 task slot来进行控制(一个 Taskmanager至少有一个slot)


3. 默认情况下,Fink允许子任务共享slot,即使它们是不同任务的子任务。这样的结果是,一个slot可以保存作业的整个管道
4. Task Slot是静态的概念,是指 Taskmanager具有的并发执行能力

3.2 程序与数据流(DataFlow)

  1. 所有的 Flink程序都是由三部分组成的: SourceTransformationSink
  2. Source负责读取数据源, Transformation利用各种算子进行处理加工,Sink负责输出
  3. 在运行时, Flink上运行的程序会被映射成“逻辑数据流”( dataflows),它包含了这三部分
  4. 每一个 dataflow以一个或多个 Sources开始一个或多个 sinks结束。 dataflow类以于任意的有向无环图(DAG)
  5. 在大部分情况下,程序中的转换运算( transformations)跟 dataflow中的算子

3.3 执行图(ExecutionGraph)

Flink中的执行图可以分成四层
Streamgraph -> Jobgraph -> Executiongraph -> 物理执行图

  1. Streamgraph:是根据用户通过 Stream API编写的代码生成的最初的图。用来表示程序的拓扑结构
  2. Jobgraph: Streamgraph经过优化后生成了 Jobgraph,提交给 Jobmanager的数据结构。主要的优化为,将多个符合条件的节点 chain在一起作为一个节点Execution Graph: Jobmanager根据 Jobgraph生成
  3. ExecutiongraphExecution Graph是 Job Graphi的并行化版本,是调度层最核心的数据结构
  4. 物理执行图: Jobmanager根据 Executiongraph对Job进行调度后,在各个Taskmanager上部署Task后形成的“”,并不是一个具体的数据结构。

3.4 并行度(Parallelism)

  1. 特定算子的子任务( subtask)的个数被称之为其并行度( parallelism)般情况下,一个 stream的并行度,可以认为就是其所有算子中最大的并行度。
  2. 一个程序中,不同的算子可能具有不同的并行度
  3. 算子之间传输数据的形式可以是 one-to-one( (forwarding)的模式也可以是redistributing的模式,具体是哪一种形式,取決于算子的种类
  4. One-to-one: stream维护着分区以及元素的顺序(比如 Sources和map之间)。这意味着map算子的子任务看到的元素的个数以及顺序跟 Source算子的子任务生产的元素的个数、顺序相同。map、 fliter.、 flatmap等算子都是 one-to-one的对应关系
  5. Redistributing: stream的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如, keyby基于 hash Code重分区、而 broadcast和 rebalance会随机重新分区,这些算子都会引起distributer过程,而 redistribute过程就类似于 Spark中的 shuffle过程。

3.5 任务链(Operator Chains)

  1. Flink采用了一种称为任务链的优化技术,可以在特定条件下减少本地通信的开销。为了满足任务链的要求,必须将两个或多个算子设为相同的并行度,并通过本地转发( ocal forward)的方式进行连接
  2. 相同并行度的one-to-one操作, Flink这样相连的算子链接在一起形成一个task,原来的算子成为里面的 subtask并行度相同、并且是one-to-one操作,两个条件缺一不可

转载:https://blog.csdn.net/qq_43791724/article/details/108158444
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场