flink提交任务的流程
在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:
- 会话模式(Session Mode)
- 单作业模式(Per-Job Mode)
- 应用模式(Application Mode)
它们的区别主要在于:集群的生命周期和资源分配方式不同、以及应用程序的 main()方法到底在哪里执行。 客户端(Client)还是JobManager 。
这里我们重点探讨 Flink On YARN。
具体流程如下: - 客户端阶段:首先使用命令行flink run -t yarn-per-job来提交Per-Job任务,后面可以带其他参数,但必须指定自己作业的类全限定名和jar包。
- 命令行执行后是通过CliFrontend(客户端前端)中的main方法进入后续的作业提交流程。
- 客户端中主要做了命令行参数解析并根据命令类型封装相应的客户端对象。
- 执行用户作业类中main方法中的代码,生成对应的StreamGragh。
- 在YarnJobClusterExecutor(PipelineExecutor)中生成JobGragh。
- 生成YarnClusterDescriptor,主要是上传资源到HDFS中,包括jar包(Flink的jar包和用户jar包)、应用配置(flink-conf.yaml、log4j.properties)、其他相关文件(配置类文件、JobGragh对象等)。
- 创建Yarn客户端准备向Yarn申请创建ApplicationMaster(JobManager)。
- Yarn集群阶段:Yarn的ResourceManager为ApplicationMaster申请到容器后,以YarnJobClusterEntryPoint作为集群启动入口开启JobManager进程。
- AM中首先创建和启动Dispatcher和YarnResourceManager(这是Flink内部的RM,后简称YRM)。
- 在Dispatcher读取到JobGragh后,为此作业构建一个JobMaster,将作业交给JobMaster,在其中将JobGragh构建为ExecutionGragh。
- JobMaster中的SlotPool向YRM中的SlotManager申请资源。而SlotManager需要向Yarn的RM请求资源(requestNewWorker),YRM先将资源请求加入等待队列,通过心跳向YARN的RM申请新的容器来启动TaskManager进程。
- 容器就绪后,YRM在容器中启动TaskManager进程(入口为YarnTaskExecutorRunner),调用runTaskManager启动TaskExecutor(真正的实例)。
- TaskExecutor向SlotManager反向注册,汇报当前可用slot数量。SlotManager返回分配slot的信息。
- TaskExecutor根据分配信息,向对应的JobMaster提供slot。JobMaster得到消息后,向对应的slot提交任务开始执行(submitTask)。
在图中可以看出,Flink 与 YARN 的关系与 MapReduce 和 YARN 的关系是一样的。Flink 通过 YARN的接口实现了自己的 ApplicationMaster。当在 YARN 中部署了Flink,YARN 就会用自己的 Container来启动 Flink 的 JobManager(也就是 ApplicationMaster)和 TaskManager。
Flink On YARN 有三种模式:
- Session 模式:在 YARN 中初始化一个 Flink 集群,开辟指定的资源,之后我们提交的 Flink Job 都在这个 Flink yarn-session 中,也就是说不管提交多少个job,这些 job 都会共用开始时在 YARN中申请的资源。这个 Flink 集群会常驻在 YARN 集群中,除非手动停止。
- Per-Job 模式:在 YARN 中,每次提交 job 都会创建一个新的 Flink 集群,任务之间相互独立,互不影响并且方便管理。任务执行完成之后创建的集群也会消失。 所以每个 Job 执行完毕,Flink 集群关闭,释放资源。
- Application 模式:Flink-1.11 引入,Client 需要做的事情(main 方法的执行)转移到JobManager中,多个 env.execute() 视为同一个 Application,相比Per-Job 模式不用启动多个Cluster,实际上,就是 Session 模式和 Per-Job 模式的折衷。
模式 | 优点 | 缺点 | 应用场景 |
---|---|---|---|
Session 模式 | 一次资源分配,多次 job 执行,充分利用资源,Job 启动快 | 一直占据资源,可能导致连锁重启,JobManager负载大 | 小规模短时间运行的作业 |
Per-Job 模式 | 资源分配粒度更细,方便单个 Job 的管理 | 当提交 Job 的Client 集中的时候,会加重负载(带宽和CPU消耗) | 大规模长时间运行的作业 |
Application模式 | Client 需要做的事情转移到JobManager中,多个 execute() 视为同一个Application,相比 Per-Job 模式不用启动多个 Cluster | Application模式本质上是Session和Per-Job模式的折衷 |
YARN 模式 和 Standalone 模式最大的区别就是:Standalone 模式,已经提前把 ClusterEntrypoint和 TaskManagerRunner 启动好了。集群的资源总量是固定的。
Flink On YARN 模式中,在 YARN 集群中,申请到一个 Container 用来启动一个SessionClusterEntrypoint,然后动态申请足够数量的 Container 来启动TaskManagerRunner 来运行Task。