flink

深入理解Flink-On-Yarn模式

2021-01-03  本文已影响0人  tracy_668

[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

启动成功后将对应的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 本地流程

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

2.4.2 远端流程

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

接下来就进行任务具体调度(构造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 本地流程

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

3.2.2 远端流程

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

上一篇 下一篇

猜你喜欢

热点阅读