深入理解Flink-On-Yarn模式

[TOC]

2. Session-Cluster模式

Session-Cluster模式需要先启动集群,然后再提交作业,接着会向yarn申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到yarn中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享Dispatcher和ResourceManager;共享资源;适合规模小执行时间短的作业。

image.png

2.1. 启动集群

运行bin/yarn-session.sh即可默认启动包含一个TaskManager(内存大小为1024MB,包含一个Slot)、一个JobMaster(内存大小为1024MB),当然可以通过指定参数控制集群的资源,如-n指定TaskManager个数,-s指定每个TaskManager中Slot的个数;其他配置项,可参考

下面以bin/yarn-session.sh为例,分析Session-Cluster启动流程。

2.2. 流程分析
下面分为本地和远程分析启动流程,其中本地表示在客户端的启动流程,远端则表示通过Yarn拉起Container的流程;

2.2.1 本地流程
Session启动入口为FlinkYarnSessionCli#main
根据传入的参数确定集群的资源信息(如多少个TaskManager,Slot等)
部署集群AbstractYarnClusterDescriptor#deploySessionCluster -> AbstractYarnClusterDescriptor#deployInternal

  • 进行资源校验(如内存大小、vcore大小、队列)
  • 通过YarnClient创建Application
  • 再次校验资源
  • AbstractYarnClusterDescriptor#startAppMaster启动AppMaster
    初始化文件系统(HDFS)
    将log4j、logback、flink-conf.yaml、jar包上传至HDFS
    构造AppMaster的Container(确定Container进程的入口类YarnSessionClusterEntrypoint),构造相应的Env
    YarnClient向Yarn提交Container申请
    跟踪ApplicationReport状态(确定是否启动成功,可能会由于资源不够,一直等待)

启动成功后将对应的ip和port写入flinkConfiguration中
创建与将集群交互的ClusterClient
* 根据flink-conf的HA配置创建对应的服务(如StandaloneHaServices、ZooKeeperHaServices等)
创建基于Netty的RestClient;
创建/rest_server_lock、/dispatcher_lock节点(以ZK为例)
启动监听节点的变化(主备切换)

经过上述步骤,整个客户端的启动流程就结束了,下面分析yarn拉起Session集群的流程,入口类在申请Container时指定为YarnSessionClusterEntrypoint。

2.2.2 远端流程
远端宿主在Container中的集群入口为YarnSessionClusterEntrypoint#main

ClusterEntrypoint #runClusterEntrypoint -> ClusterEntrypoint#startCluster启动集群

初始化文件系统
初始化各种Service(如:创建RpcService(AkkaRpcService)、创建HAService、创建并启动BlobServer、创建HeartbeatServices、创建指标服务并启动、创建本地存储ExecutionGraph的Store)
创建DispatcherResourceManagerComponentFactory(SessionDispatcherResourceManagerComponentFactory),用于创建DispatcherResourceManagerComponent(用于启动Dispatcher、ResourceManager、WebMonitorEndpoint)
通过DispatcherResourceManagerComponentFactory创建DispatcherResourceManagerComponent
创建/dispatcher_lock节点,/resource_manager_lock节点
创建DispatcherGateway、ResourceManagerGateway的Retriever(用于创建RpcGateway)
创建DispatcherGateway的WebMonitorEndpoint并启动
创建JobManager的指标组
创建ResourceManager、Dispatcher并启动进行ZK选举
返回SessionDispatcherResourceManagerComponent
经过上述步骤就完成了集群的启动;

2.3. 启动任务

当启动集群后,即可使用./flink run -c mainClass /path/to/user/jar向集群提交任务。

2.4 流程分析

同样,下面分为本地和远程分析启动流程,其中本地表示在客户端提交任务流程,远端则表示集群收到任务后的处理流程。

2.4.1 本地流程

  • 程序入口为CliFrontend#main

  • 解析处理参数

  • 根据用户jar、main、程序参数、savepoint信息生成PackagedProgram

  • 获取session集群信息

  • 执行用户程序

    设置ClassLoader
    设置Context
    执行用户程序main方法(当执行用户业务逻辑代码时,会解析出StreamGraph然后通过ClusterClient#run来提交任务),其流程如下:
    获取任务的JobGraph
    通过RestClusterClient#submitJob提交任务
    创建本地临时文件存储JobGraph
    通过RestClusterClient向集群的rest接口提交任务
    处理请求响应结果
    重置Context
    重置ClassLoader

经过上述步骤,客户端提交任务过程就完成了,主要就是通过RestClusterClient将用户程序的JobGraph通过Rest接口提交至集群中。

2.4.2 远端流程

远端响应任务提交请求的是RestServerEndpoint,其包含了多个Handler,其中JobSubmitHandler用来处理任务提交的请求;

  • 处理请求入口:JobSubmitHandler#handleRequest

  • 进行相关校验

  • 从文件中读取出JobGraph

  • 通过BlobClient将jar及JobGraph文件上传至BlobServer中

  • 通过Dispatcher#submitJob提交JobGraph

  • 通过Dispatcher#runJob运行任务

    创建JobManagerRunner(处理leader选举)
    创建JobMaster(实际执行任务入口,包含在JobManagerRunner)
    启动JobManagerRunner(会进行leader选举,ZK目录为leader/{jobId}/job_manager_lock) 当为主时会调用JobManagerRunner#grantLeadership方法 启动JobMaster 将任务运行状态信息写入ZK(/{AppID}/running_job_registry/${jobId})
    启动JobMaster的Endpoint
    开始调度任务JobMaster#startJobExecution

接下来就进行任务具体调度(构造ExecutionGraph、申请Slot等)流程,本篇文章不再展开介绍。

3. Per-Job-Cluster模式

一个任务会对应一个Job,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。

image.png

3.1 启动任务
启动Per-Job-Cluster任务,可通过./bin/flink run -m yarn-cluster -d -c mainClass /path/to/user/jar命令使用分离模式启动一个集群,即单任务单集群;

3.2. 流程分析
与Session-Cluster类似,我们对Per-Job-Cluster模式也分为本地和远端。

3.2.1 本地流程

  • 与Session-Cluster模式类似,入口也为CliFrontend#main
  • 解析处理参数
  • 根据用户jar、main、程序参数、savepoint信息生成PackagedProgram
  • 根据PackagedProgram创建JobGraph(对于非分离模式还是和Session模式一样,模式Session-Cluster)
  • 获取集群资源信息
  • 部署集群YarnClusterDesriptor#deployJobCluster -> AbstractYarnClusterDescriptor#deployInternal;后面流程与Session-Cluster类似,值得注意的是在AbstractYarnClusterDescriptor#startAppMaster中与Session-Cluster有一个显著不同的就是其会将任务的JobGraph上传至Hdfs供后续服务端使用

经过上述步骤,客户端提交任务过程就完成了,主要涉及到文件(JobGraph和jar包)的上传。

3.2.2 远端流程

  • 远端宿主在Container中的集群入口为YarnJobClusterEntrypoint#main
  • ClusterEntrypoint#runClusterEntrypoint -> ClusterEntrypoint#startCluster启动集群
  • 创建JobDispatcherResourceManagerComponentFactory(用于创建JobDispatcherResourceManagerComponent)
  • 创建ResourceManager(YarnResourceManager)、Dispatcher(MiniDispatcher),其中在创建MiniDispatcher时会从之前的JobGraph文件中读取出JobGraph,并启动进行ZK选举
  • 当为主时会调用Dispatcher#grantLeadership方法

Dispatcher#recoverJobs恢复任务,获取JobGraph
Dispatcher#tryAcceptLeadershipAndRunJobs确认获取主并开始运行任务
Dispatcher#runJob开始运行任务(创建JobManagerRunner并启动进行ZK选举),后续流程与Session-Cluster相同,不再赘述

小结

Flink提供在Yarn上两种运行模式:Session-Cluster和Per-Job-Cluster,其中Session-Cluster的资源在启动集群时就定义完成,后续所有作业的提交都共享该资源,作业可能会互相影响,因此比较适合小规模短时间运行的作业,对于Per-Job-Cluster而言,所有作业的提交都是单独的集群,作业之间的运行不受影响(可能会共享CPU计算资源),因此比较适合大规模长时间运行的作业。

PS

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容