前言
在 Flink on YARN 运行模式下,Flink 提供了三种主要的部署模式:Session Mode、Per-Job Mode 和 Application Mode。每种模式在集群管理、资源分配、作业执行等方面有不同的特点,适用于不同的场景。接下来详细介绍这三种部署模式及其适用场景。
Session Mode
描述
- 共享集群,一个集群多个作业:
- 在 Session Mode 下,多个作业可以共享一个集群。
- JobManager 是长期运行的,多个作业可以提交到这个共享的 JobManager 上执行。
- 每个作业对应一个独立的 JobMaster,但所有作业共享同一个集群资源。
适用场景
多个作业需要共享集群资源且作业生命周期较长的情况。
启动命令
bin/yarn-session.sh -nm test
可用参数解读:
-d:分离模式,如果你不想让Flink YARN客户端一直前台运行,可以使用这个参数,即使关掉当前对话窗口,YARN session也可以后台运行。
-jm(--jobManagerMemory):配置JobManager所需内存,默认单位MB。
-nm(--name):配置在YARN UI界面上显示的任务名。
-qu(--queue):指定YARN队列名。
-tm(--taskManager):配置每个TaskManager所使用内存。
Per-Job Mode
描述
- 独享集群,一个作业一个集群:
- 每次提交作业时,都会启动一个独立的 Flink 集群,包括一个独立的 JobManager 和多个 TaskManager。
- 作业执行完毕后,整个集群会被销毁。
适用场景
每个作业都需要独立的集群资源,特别是当作业之间没有共享资源需求时。
启动命令
bin/flink run -d -t yarn-per-job -c com.wwb.wc.SocketStreamWordCount SocketStreamWordCount.jar
Application Mode
描述
- 独享集群,与 Per-Job Mode 的区别在于用户代码的解析位置:
- 与 Per-Job Mode 相似,每次提交作业时都会启动一个独立的集群,包括独立的 JobManager 和 TaskManager。
- 区别在于用户代码的解析:在 Per-Job Mode 中,作业代码通常是在 JobManager 中解析的,而在 Application Mode 中,用户代码会在 YARN 应用的客户端(Client) 侧进行解析。这意味着 Application Mode 会使得作业的提交和资源分配更为集中和独立。
适用场景
与 Per-Job Mode 类似,但是适合那些需要将作业作为独立应用提交并控制作业生命周期的场景,尤其是在作业和资源管理之间有较强依赖时。
启动命令
应用模式同样非常简单,与单作业模式类似,直接执行flink run-application命令即可
bin/flink run-application -t yarn-application -c com.wwb.wc.SocketStreamWordCount SocketStreamWordCount.jar
进一步总结:
特性/模式 | Session Mode | Per-Job Mode | Application Mode |
---|---|---|---|
集群共享性 | 一个集群多个作业共享 | 每个作业独立使用一个集群 | 每个作业独立使用一个集群 |
JobManager | 长期运行的 JobManager,多个作业共享一个 JobManager | 每个作业启动独立的 JobManager | 每个作业启动独立的 JobManager,JobManager 与 YARN 应用生命周期绑定 |
作业数量 | 支持多个作业,作业共享资源 | 每个作业是独立的 | 每个作业是独立的 |
作业生命周期 | 作业提交后,集群持续运行,直到手动停止 | 作业完成后,集群会被销毁 | 作业完成后,集群会被销毁 |
代码解析位置 | 作业代码在 JobManager 解析 | 作业代码在 JobManager 解析 | 作业代码在 Client(YARN 应用客户端) 解析 |
适用场景 | 多个作业共享资源,适合长期运行多个作业 | 独立运行的作业,适合资源隔离较强的场景 | 将作业作为独立应用提交,适合资源需求较独立的作业 |
总结
- Session Mode:适用于多个作业共享同一个集群资源,适合需要长时间运行的场景。
- Per-Job Mode:适用于单个作业运行时,独立启动集群,适合资源隔离要求高的场景。
- Application Mode:与 Per-Job Mode 类似,但作业代码的解析发生在 JobManager,适合大规模提交作业且作业独立性较强。缓解了Per-Job 模式下单client 端的提交压力。