Apache Flink框架以及运行原理

Apache Flink架构

  • JobManger(作业管理器)
  • TaskManger(任务管理器)
  • ResourceMager(资源管理器)
  • Dispacher(分发器)

JobManager

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

TaskManger

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

ResourceMager

  • 主要负责管理任务管理器(TaskManager) 的插槽(slot)TaskManger插槽是Flink中定义的处理资源单元。
  • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、小Mesos、K8s, 以及standalone部署。
  • 当JobManager申请插槽 资源时,ResourceManager会将 有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

Dispacher

  • 可以跨作业运行,它为应用提交提供了REST接口。
  • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
  • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
  • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

Flink任务提交流程

首先由Dispatcher接收提交的应用,然后启动JobManger,JobManger根据自己生成的执行图去向ResourceManger申请对应的Slots数量,ResourceManger接收到请求后会根据向自己注册的TaskManager所有Slots数量去判断是否有足够的资源执行任务,然后满足资源需求,ResourceManger就会发送Slots所存在的TaskManager申请资源的JobManger,然后TaskManger连接JobManger,JobManager则分配执行任务,然后TaskManager开始执行分配的任务,不同TaskManager在执行过程中可能存在交换数据

在这里插入图片描述

Flink任务提交流程(YARN)

首先客户端上传Flink的Jar包和配置,然后提交job至ResourceManager(yarn),由ResourceManager启用ApplicationMaster,在ApplicatiionMaster内启动Flink组件JobManager、ResourceManager(flink) ,然后JobManager向ResourceManager(flink)申请所需的资源,ResourceManager(flink)在向ResourceManager(yarn)申请资源,ResourceManager(yarn),根据申请资源数量,在一定数量的NodeManager节点内启动的TaskManager,然后TaskManager向ResourceManger(flink)注册Slots,然后ResourceManager向TaskManager发送申请Slots的JobManager,然后TaskManger连接JobManager,JobManager则发送分配的任务,TaskManager就会根据分配的任务开始执行,其实在yarn管理资源的时候,就是当接收到一个Job任务时,就会启动一个Flink集群,当任务处理完时,这个集群资源也就释放了

在这里插入图片描述

Slot概念

在这里插入图片描述

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

Job任务

  • 所有的Flink程序都是由三部分组成的: Source 、Transformation 和Sink。
  • Source负责读取数据源,Transformation 利用各种算子进行处理加工,Sink 负责输出

数据流(DataFlow)

  • 在运行时,Flink.上运行的程序会被映射成“逻辑数据流”(dataflows),它包含了这三部分
  • 每一个dataflow以一个或多个sources开始以一 个或多个sinks结束。dataflow类似于任意的有向无环图(DAG)
  • 在大部分情况下,程序中的转换运算(transformations) 跟dataflow中的算子(operator)是一一对应的关系

执行图

  • Flink中的执行图可以分成四层: StreamGraph -> JobGraph -> ExecutionGraph->物理执行图
  • StreamGraph:是根据用户通过Stream API编写的代码生成的最初的图。用来表示程序的拓扑结构。
  • JobGraph: StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点chain在一起作为一个节点
  • ExecutionGraph: JobManager 根据JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。
  • 物理执行图: JobManager 根据ExecutionGraph对Job进行调度后,在各个TaskManager.上部署Task后形成的“图”,并不是一个具体的数据结构。

在这里插入图片描述

数据传输形式

  • 一个程序中,不同的算子可能具有不同的并行度
  • 算子之间传输数据的形式可以是one-to-one (forwarding)的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类
  • One-to-one: stream维护着分区以及元素的顺序(比如source和map之间)这意味着map算子的子任务看到的元素的个数以及顺序跟source算子的子任务生产的元素的个数、顺序相同。map、 fliter、 flatMap等算 子都是one-to-one的对应关系。
  • Redistributing: stream的分区会发生改变。 每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy 基于hashCode重纷区、而broadcast和rebalance会随机重新分区,这些算子都会引|起redistribute过程,而redistribute过程就类似于Spark中的shuffle过程。

任务链

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

disableChaining

  • 使用disableChaining的算子禁止跟前后合并任务链

startNewChain

  • 使用startNewChain的算子指从当前算子开始合并任务链,不与该算子之前的任务合并

slotSharingGroup(共享组)

  • 指定任务的共享组,当一个Job中的存在比较复杂且非常耗资源的操作时,可以让该操作独享一个slot,不与其他共享组重合

Flink基础命令

#Flink启动命令
./bin/start-cluster.sh

#Flink命令行提交Job
./bin/flink run -c [入口类] -p [并行度] [指定Jar包] [args参数]

#Flink命令行查看当前允许的Job
./bin/flink list

#Flink命令行关闭Job
./bin/flink canceled [任务ID]

#Flink命令行查看所有任务
./bin/flink list -a

#Flink停止命令
./bin/stop-cluster.sh

--------------------------Yarn-session模式-----------------------------
#Yarn-session模式启动
./bin/yarn-session.sh -n [TaskMannager数量(后面版本可以不配,动态分配)] -s [slot数量] -jm [JobMannager内存] -tm [TaskMannager内存] -nm [AppName] -d(表示后台执行)

#Yarn-session模式提交Job
与上面一致

#Yarn-session模式关闭Job
yran application --kill application 任务ID

--------------------------Par-Job-Cluster模式--------------------------
#提交Job
./bin/flink run  -m yarn-cluster -c [入口类] -p [并行度] [指定Jar包] [args参数]

猜你喜欢

转载自blog.csdn.net/weixin_38468167/article/details/111933606