本文主要讲解flink的基础理论内容,如JobManager,TaskManager是什么,以及常见的Flink集群部署方式,以及flink中常见的一些概念,还有它的运行逻辑
01. JobManager
JobManager相当于是Flin集群的Master节点,它主要负责对Work节点(TaskManagger)资源管理,job的协调查询,job的划分,这些功能主要由以下三个组件完成
- ResourceManager:它主要实现Flink的资源管理功能,如根据不同的计算环境提供不同的资源分配策略,如在Standalone环境中它负责实现申请启动TaskManager并获取Slot的资源信息以便后面分配Task
- Dispatcher:提供对外的REST接口实现Flink执行信息的查询,同时也会为每个job对应的的JobMaster,并分发和执行JobGraph
- JobMaster:它负责管理整个job的生命周期,如分布式快照checkpoints的生成。并把抽象的JobGraph通过配置和优化生成ExecutionGraph,最终把ExecutionGraph中的Task分发给TaskManager执行
02. TaskManager
TaskManager主要是向Flink集群提供运行Task的slot槽,并管理运行在slot槽中的Task
03. Flink中相关概念的含义
flink中任务跑起来之后会有这些名字需要弄清楚,并行度,分区,算子链,taskslot,task,subTask
-
Task: 相当于Spark中的Stage,一个job中根据是否发生分区的变化(主要是指产生shuffle的操作:上游分区的数据会分成若干份,被拉去到下游的不同分区)把job切分成不同的Task
-
算子链: 算子链由若干个能划分成一个Task的算子组成
-
TaskSlot: TaskSlot代表可以运行Task的一组资源槽,分布在各个TaskManager进程中
-
并行度,分区,SubTask: 并行度,分区和SubTask在flink中都表示相近的意思,都代表当下task的并发程度,也可以看作是一个运行线程
其中需要的几点如下,其中一点是,Flink任务TaskSlot的数量要大于等于这个job中各算子并行度最大的那个算子的并行度,否则任务跑不起来,还有一点是各个Task需要运行在一个TaskSlot比如一个job有3个Task,那这三个Task就应该被分配到同一个slot中运行,这样做的目的是为了减少各个Task之间数据交换的成本,如下图所示
04. Flink on yarn的运行原理
flink on yanr是大多数公司选择的一种运行方式,它的优势是借助yarn的资源管理能力,通过yarn能更灵活把控job的资源的使用,同时也大大的减轻了公司大数据组件的维护压力,如下是on yarn的运行流程
- client端提交任务把对应的jar包和配置文件上传到hdfs中–如果是per-job模式,job任务的main函数的运行会放在client端运行,如果是application模式,main函数的执行会放在jobmanager端
- 再向yarn申请contain运行JobManager,JM启动接着运行Dispatch,Resourcemanager组件
- Dispatch根据提交的application为每个job启动JobMaster,并把JobGraph提交给JobMaster
- JobMaster把JobGraph通过配置和优化解析成ExecutionGraph,然后向yarn申请需要的资源
- yarn根据所需资源启动Taskmanager,并向RM注册Slot信息,RM在对应的TM上划分好Slot资源,同时TM向JobMaster提交 slot资源信息
- 至此Flink的环境已经准备好了,JobMstar把ExecutionGraph中划分好的Task发送到TM中开始运行
06. Flink on Yarn 模式下的HA模式
HA模式主要是针对JobManager,每个job集群启动的时候JM但是单点的,如果挂了,对应的job就会失败,所有JM的HA是有必要配置的,flink on yarn模式下,它的HA本质上来说就是让yarn的application进行重试即可,但是在重试时需要zookeeper来协调JM失败后的切换
- yarn application的重试配置
在Hadoop的所以节点的yarn-site.xml文件中配置yarn.resourcemanager.am.max-attempts的次数,默认是2次 - 在任务提交的客户端节点上找到flink-conf.yaml文件,配置JM重试的协调者zookeeper,具体的如配置ZK的集群地址,JM失败重试后所有元数据存储地址