Flink提交模式及提交流程

726 阅读7分钟

1. 部署模式

1.1 会话模式

先启动一个集群,并保持会话 -> 在客户端执行应用程序 -> 在这个会话中通过客户端提交作业

集群启动时所有资源都已经确定,提交的作业会相互竞争资源,适合于规模小、执行时间短的大量作业

1.2 单作业模式

客户端执行应用程序 -> 作业提交给Yarn的ResourceManager -> Yarn的ResourceManager启动JobManager -> Yarn的ResourceManager启动TaskManager

需要借助Yarn来启动集群,作业和集群一对一

1.3 应用模式

应用程序提交到JobManager上执行

1.4 三种模式的区别

① 会话模式和单作业模式的应用程序都是在客户端执行,应用模式的应用程序在JobManager上执行

② 会话模式在作业提交之前开启集群,单作业模式与应用模式都是作业提交之后才创建集群

③ 一个应用可能包含两个作业,如果用单作业模式是会启动两个集群的,应用模式就会启动一个集群。单作业模式是 作业和集群 一对一,应用模式是 jar包和集群 一对一

2. Standalone模式

2.1 会话模式

#启动集群
start-cluster.sh

#提交作业
flink run \
-m hadoop02:8081 \ #指定JobManager
-c com.atguigu.wc.StreamWordCount ./FlinkTutorial-1.0-SNAPSHOT.jar

#关闭集群
stop-cluster.sh

Standalone会话模式 作业提交流程:

(0)启动集群,包括JobManager和TaskManager,JobManager内部启动了分发器,JobMaster,资源管理器

(1) 客户端通过分发器提供的 REST 接口,将作业提交给JobManager。

(2)分发器将作业(包含 JobGraph)提交给已经事先启动好的 JobMaster。

(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。

(4)资源管理器判断是否有足够的可用资源。如果资源不够,只能等待资源释放,而不会直接启动新的 TaskManager。

(5)如果资源够用,资源管理器通知 TaskManager 为新的作业提供 slots。

(6)TaskManager 连接到 JobMaster,提供 slots。

(7)JobMaster 将需要执行的任务分发给 TaskManager。

(8)TaskManager 执行任务,互相之间可以交换数据。

(9)任务运行完毕后,释放持有的资源,供其他作业使用

2.2 单作业模式

单作业模式需要借助外部资源管理平台,例如Yarn。Standalone模式不依赖外部管理资源平台,所以Standalone的单作业模式不存在

2.3 应用模式

#提交作业,启动JobManager
standalone-job.sh start \
--job-classname com.atguigu.wc.StreamWordCount ./FlinkTutorial-1.0-SNAPSHOT.jar 

#启动TaskManager
taskmanager.sh start

#停掉集群
taskmanager.sh stop
standalone-job.sh stop

Standalone应用模式 作业提交流程:

(1) 客户端通过分发器提供的 REST 接口,将应用程序提交给JobManager,应用程序在JobManager上运行,这个应用程序可能会生成多个作业,但只会启动一个集群(JobManager通过提交作业启动,此时JobManager内部启动了分发器和资源管理器,JobMaster还没有启动)。

(2)手动启动TaskManager。

(3)由分发器启动多个JobMaster,并将作业(包含 JobGraph)提交给各自对应的 JobMaster。

(4)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。

(5)资源管理器判断当前是否由足够的可用资源。

(6)如果资源够用,资源管理器通知 TaskManager 为作业提供 slots。

(7)TaskManager 连接到JobMaster,提供 slots。

(8)JobMaster 将需要执行的任务分发给 TaskManager。

(9)TaskManager 执行任务,互相之间可以交换数据。

(10)应用运行完毕,手动关闭集群

2.4 standalone会话模式与应用模式的区别

standalone的会话模式,JobManager和TaskManager都是预先启动好的,并且JobManager内部的JobMaster也启动了

standalone的应用模式,JobManager靠提交作业来启动,在JobManager内部,当作业提交到分发器后,由分发器启动JobMaster。TaskManger手动启动, 因为standalone模式不依赖Yarn,所以会话模式和应用模式的 TaskManager 都需要手动启动

3. Yarn模式

3.1 会话模式

#开启一个Yarn会话
yarn-session.sh -nm test #-nm 任务名

#提交作业
flink run \
-c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar

image.png

Yarn的会话模式并没有预先启动整个集群。开启Yarn会话之后,Yarn启动了JobManager,在JobManager内部,因为还没有提交作业,所以只有 ResourceManager 和 Dispatcher ,提交作业后由分发器启动 JobMaster。TaskManager还没有启动,TaskManager根据需要动态的启动

image.png

Yarn会话模式 作业提交流程:

(0)开启一个Yarn会话,这个Yarn会话启动了JobManager(此时JobManager内部只有ResourceManager 和 Dispatcher),TaskManager还没启动。

(1)客户端通过 REST 接口,将作业提交给分发器。

(2)分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。

(3)JobMaster 向资源管理器请求资源(slots)。

(4)资源管理器向 YARN 的资源管理器请求 container 资源。

(5)YARN 启动新的 TaskManager 容器。

(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。

(7)资源管理器通知 TaskManager 为新的作业提供 slots。

(8)TaskManager 连接到对应的 JobMaster,提供 slots。

(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

3.2 单作业模式

#提交作业
flink run \
-d \ 
-t yarn-per-job \
-c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar

#查看作业
flink list \
-t yarn-per-job \
-Dyarn.application.id=application_XXXX_YY

#取消作业
flink cancel \
-t yarn-per-job \
-Dyarn.application.id=application_XXXX_YY <jobId>

-d 参数:作业提交之后,任务的执行其实就跟客户端没有关系了,可以让客户端与 JobManager 断开连接,也可以继续保持连接。在提交作业时,加上的-d参数,就是表示分离模式(detached mode),也就是断开连接。

image.png

Yarn单作业模式 作业提交流程:

(0)在客户端运行应用程序,一个应用程序可能包含多个作业,一个作业启动一个集群

(1)客户端将作业提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器。

(2)YARN 的资源管理器分配 Container 资源,启动 Flink JobManager(JobManager包含了资源管理器和JobMaster,省略了 Dispatcher ),并将作业提交给JobMaster。

(3)JobMaster 向资源管理器请求资源(slots)。

(4)资源管理器向 YARN 的资源管理器请求 container 资源。

(5)YARN 启动新的 TaskManager 容器。

(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。

(7)资源管理器通知 TaskManager 为新的作业提供 slots。

(8)TaskManager 连接到对应的 JobMaster,提供 slots。

(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

会话模式与单作业模式的区别在于JobManager 的启动方式:

会话模式下,开启Yarn会话之后,Yarn启动了JobManager,在JobManager内部,因为还没有提交作业,所以只有 ResourceManager 和 Dispatcher ,提交作业后由分发器启动 JobMaster。TaskManager还没有启动,TaskManager根据需要动态的启动

在单作业模式下,Flink 集群不会预先启动,而是在提交作业时,才启动新的 JobManager。省去了分发器Dispatcher

3.3 应用模式

#提交作业
flink run-application \
-t yarn-application \
-c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar

#查看作业
flink list \
-t yarn-application \
-Dyarn.application.id=application_XXXX_YY

#取消作业
flink cancel \
-t yarn-application \
-Dyarn.application.id=application_XXXX_YY <jobId>

Yarn应用模式 作业提交流程:

(1)客户端将应用程序(一个应用程序包含了多个作业)提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器。

(2)YARN 的资源管理器分配 Container 资源,启动 Flink JobManager(JobManager包含了资源管理器和多个JobMaster,省略了 Dispatcher ),并将多个作业提交给各自对应的JobMaster。

(3)JobMaster 向资源管理器请求资源(slots)。

(4)资源管理器向 YARN 的资源管理器请求 container 资源。

(5)YARN 启动新的 TaskManager 容器。

(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。

(7)资源管理器通知 TaskManager 为新的作业提供 slots。

(8)TaskManager 连接到对应的 JobMaster,提供 slots。

(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

应用模式与单作业模式的提交流程非常相似,只是初始提交给 YARN 资源管理器的不再是具体的作业,而是整个应用。一个应用中可能包含了多个作业,这些作业都将在 Flink 集群中启动各自对应的 JobMaster