开发者学堂课程【Apache Flink 入门到实战 - Flink 开源社区出品 :Flink on Yarn_K8S 原理剖析及实践(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/632/detail/10043
Flink on Yarn_K8S 原理剖析及实践(一)
内容简介:
一、Flink 架构概论
二、Flink on Yarn 原理及实践
三、Flink on Kubernetes 原理及实践
四、答疑环节
一、Flink 架构概论
(1)Flink 架构概论
这是一个典型的 flink 任务,就是通过 DataStream API 、 DataSet API 、 SQL 或者 TableAPI 去编写 Flink 任务,它会生成一个JobGraph ,当这个 Flink 处提交给之后,它会运行在好很几种情况下,
第一个是 Local 模式;
第二个是 Standalone 模式
第三种是Yarn 模式
第四种是 Kubernetes 模式,
对这个 JobGraph 来说,它里面是分成 Operator ,可以看下图里,就是有 Source 、 map 、KeyBy 、还有 Sink 这个 Operator ,然后每个 Operator 在运行过程中是可以设置它自己独立的变化度, Operator 之间,是有一个数据的加法过程。如下图:
(2)JobManger
首先我们来介绍一下 Flink 里面几个概念,其中第一个是JobManager , JobManager 主要解决它的工作,主要第一个是将JobGraph 转换成一个 Execution Graph 然后将 Execution Graph拿来运行;
第二个是 Scheduler ,就是一个调度,它负责 task 的调度;第三个是 checkpoint coordinator ,看名字就知道,它就是做 JobManager 的,用来协调整个任务的 checkpoint ,包括checkpoint 的开始、完成都是通过 JobManager 进行协调的;
第四部分就是说它里面有一个 Actor system ,它是负责通信的,主要是和 JobManager 结合, taskManager 的一个通信。其实 JobManager 还有一些其他的功能,比如它有些 Metadata 、 Recovery ,就是当它故障恢复的时候,可以从 Metadata 里面读一下数据,这个是JobManager 的一个主要的一个功能,如下图:
(3)TaskManager
其次介绍下 TaskManager ,它是负责具体任务的一个执行过程,当JobManager 申请到资源之后,它就去学习启动 TaskManager ,它里面主要的主角是:第一个是 Memory & l/O Manager ,就是内存和 io的管理;第二个是 Network Manager ,就是对网络方面的管理;第三个 Actor system ,就是负责网络通信方面的。
在 TaskManager 里面,它是分成很多 Tsak Status ,每一个 Tsak Status 是它所调度的资源的一个最小的一个单位,就是说它的任务是运行在一个 Tsak Status 里面,然后在 Flink 里面, Task 之间是可以通过task group 的方式进行共享,如下图:
(4)Flink Standalone 模式
在介绍 Yarn 之前,先简单介绍一下 Flink Standalone 模式,这样有助于了解后面的 Yarn 和 Kubernetes ,在 Flink Standalone 单独模式下,可以它的整个调度,是 Flink 自己来实现的,可以将Master 和 TaskManager ,它是不同的进程,可以运行在一台机器上面,也可以运行在不同的机器上面,在 Flink Master进程里面,它有几个部分,第一个就是 Standalone ResourceManager ,就是对资源进行管理的;
第二个就是当用户从 Flink Client ,让他提交一个JobGraph 给 master 的时候,它第一个先经过 Dispatcher ,可以理解 Dispatcher 为是一个方法,当收到客户端的请求之后,它会生成一个 JobManager 的进程.它需要注册到 ResourceManager ,注册之后, ResourceManager 再将具体的 task 任务分发给 TaskManager去执行,这是三动模式的一个运行过程,在后面我们会讲到 Yarn 和 Kubernetes 格式,两种方式,很多地方其实是相通的,
如下图:
(5)小结
来总结一下,第一章里面讲了 Flink 的基本架构和它的运行的一些组件,第一个是 Client ,就是任务的提交,用户在客户端通过 Client 或者 API 的方式提交任务,它会生成一个 JobGraph ;第二个是 JobManager ,它接受了用户的请求之后,就对任务进行调度,并且会申请资源启动 task ,包括中国的有效的通信,其实是TaskManager ,它是负责一个具体的 task 的执行,他会像JobManager 请求支援,然后接触到 JobManager 分配给它的任务之后,开始具体的任务执行。
二、Flink on Yarn 原理及实践
(1)Yarn 架构原理-总览
因为这种模式在国内用的很多,基本上所有的公司在生产环境可能大部分都是使用的 Yarn ,来介绍一下 Yarn 的架构原理,因为只有了解了 Yarn ,才能知道 Flink 是在 Yarn 中运行的,就说 Yarn 里面最主要的角色就是 ResourceManager ,它是负责整个资源的管理,然后 Client 端向 ResourceManager 提交一个任务,像之前 Yarn 。
当它提交给 ResourceManager 之后,它会向它会申请一个 Container,就在第一个 Container 里面,会起一个Application master ,这是 Yarn 里面的概念,比如如果是一个MapReduceStatus 的任务,那这个 master 就是 MapReduceStatus的一个 master ,当 master 起来之后,它会重新再根据 master 任务的要求再去申请资源,比如需要三个 task ,这个有三个 map 和三个 reduce ,那这样他会兴起六个 task ,这样 ResourceManager会将资源重新分配,分配给它,接着这个 Application master 它就会根据分配给它的资源,再去启动具体的 container ,然后在container 上面,去运行具体的 Map 或者 Reduce ,然后所有的 container ,都是通过 Node Manager 去管理的,这是一样的一个基本的一个架构,如下图:
(2)Yarn 架构原理-组件
可以看到在架构里面,分为四部分,第一个为 ResourceManager一般简称为 RM ,处理客户端请求、启动监控 APP master 、他会监控 NodeManager ,主要的是资源的分配和调度,它主要是包括schedule 、 Application manager ;
第二个是 ApplicationMaster ,简称 为AM ,运行在 Slave 上,负责数据切分,申请资源和分配,任务监控和容错, AM 是一个比较核心的角色,比如 Flink ,如果不运行 flink 任务,肯定是要实现一个自己的AM ;
第三个 NodeManager ,简称 NM ,它是运行在 Slave 上,单节点的资源管理,与 AM/RM 通信,汇报情况;第四个是 Container ,它是资源抽象,包括内存、 CPU 、磁盘、网络等资源,其中 AM 和NM 都是运行在 Container 上。
(3)Yarn架构原理-交互
具体讲解 Yarn 的交互原理,会对后面对付 Flink 的执行会很有帮助,第一个就是提交任务,我在看 Client 端写了一个代码,这个任务提交之后,它会先给 ResourceManager ,之后,它会返回给你一个 application ID ,就是 Client 拿这个 ID ,再继续提交任务的上下文,比如说任务里面到底要执行什么样的程序?有哪些配置?
当证物提交给尾数是 ResourceManager 之后,它会启动 Container ,第一个 Container 里面是启动的是application master ,就他就是其中那个 master 节点,当 master别人启动之后,它会找 ResourceManager ,再重新申请资源,因为它知道当前需要运行哪几个任务,这个任务有多少个,比如会不会丢失节点,有多少个并发,所以这个 Application 来找ResourceManager 再重新申请资源,这时候 ResourceManager 将资源分配给 application master ,然后 application master将具体的 task 的调动起来去执行。比如它要启动哪一个 task 、启动的那个命令是多少、上下本是多少,由 NodeManager 将它拿起来,然后进行运行,
如下图:
(4)Flink on Yarn - Per Job
先讲一下 Per Job 模式,每次提交的是一个任务,然后用户运行完成之后,这个资源就被释放了。看这个流程,其实了解前面讲到的 Yarn原理,基本上对 Flink 的这个流程可能会比较熟悉了,它第一步,Client 端提交,提交一个 Yarn 的 APP ,比如是写了一 JobGraph ,然后,这是一个 Yarn 的 ResourceManager ,这个地方还是 Yarn 的角色,就 ResourceManager ,它会申请第一个 Container ,第一个可能启动的进程就是 application master ,里面运行的就是 flink的程序,包括里面第一个是 Flink 的 Yarn ,相当于是 Flink 有一个自己的 ResourceManager 来讲,就是自己的资源管理,然后它里面还会起一个 JobManager ,当着它启来之后,它先申请资源,就说JobManager 它根据 JobGraph 去申请,比如说要启多少个 task ,它找 Flink Yarn 的 ResourceManager 去申请,然后 Flink Yarn 的 ResourceManager分配好资源之后,它再去启动TaskManager ,它分配提成完之后,对Flink Yarn的ResourceManager 进行一个注册的过程,注册完成之后, JobManager再将具体的 task 分配给 TaskManager 去执行,这就是整个 Flink的一个 Rer Job 的执行模式,
如下图:
(5)Flink on Yarn - Session
接着讲一下 Session 模式,在 Per Job 模式下面,一般执行完任务之后,整个资源就释放了,包括 JobManager 和 TaskManager 全部都会退出, Session 模式不一样,它的 JobManager 是可以复用的。
重点看一下中间的节点,就是 JobManagerA 和 JobManagerB ,首先提一个 A 的任务, Dispatcher 收到请求之后,它会启动一个JobManagerA ,然后由它来完成后面的事情,包括申请资源,然后启动 TaskManager ;但同时还可以提 Job B , Dispatcher 在收到JobManager 的请求之后,它会启一个 JobManagerB ,它负责 Job B任务的资源申请和 TaskManager 的一个运行。
如果这是 A 的任务,运行结束之后,资源也不会释放;然后当B任务运行完成,资源也不会释放, Session 模式它的特点就是资源会一直存在,不会释放。
然后它的多个 JobManager ,它是共享 Dispatcher ,还有共享 Flink Yarn 的 ResourceManager. 。 Session 模式和 Per Job 模式区别就是它的用处是什么,在 Per Job 下面,因为它比较适合运行时间比较长的任务,虽然申请资源可能长点,但是认为运行时间也很长;
Session 模式适合比较小的任务,可能运行很短时间就退出了,如果用 Per Job 模式去运行,那就需要频繁的申请资源,申请资源释放而运行结束就下次又得重新运行,再重新申请资源,然后,然后结束了这种任务,就适合用 Session 模式,如下图:
(6)Yarn 模式的优点
为什么使用 Yarn 模式,而不是 Standalone 模式。实际上Standalone 模式,也在生产环境可以用,但它可能说一般机器数不会太多。 Yarn 模式的优点是什么?
第一个是它的资源是按需使用的,它可以提高整个集群的资源利用率,它通过 Yarn ResourceManager进行资源的管理;第二个就是 Yarn 模式,它的任务调度策略是比较多的,比如 PFO Scheduler 就是先进先出、 Capacity Scheduler就是按照容量调度、 Fair Scheduler 就是公平调度,甚至它可以设置一些任务优先级,然后这样就对生产环境的任务可以做很好的一个调度策略,可以达到一个最优的集群资源利用率;
第三个是它可以做一些废物的处理,就用 Yarn 帮你做,比如 NodeManager 可以监控, Yarn ApplicationManager 可以做一个异常的恢复,这些都是 Yarn 天然提供的攻略, Yarn 模式在生产环境会更稳定,提升质量也会比较高。
(7)Flink on Yarn 实践
因为 Yarn 模式之前讲的比较多,像之前讲几个课程,讲 Flink 安装部署的,还有 Flink 操作,可以点开这个链接去看一下,链接如下:https://zh.ververica.corn/developers/flink-training-course1/, Yarn 模式的操作,这里就不重复了。