部署模式
Flink 的运行时架构中,最重要的就是两大组件:作业管理器(JobManger)和任务管理器(TaskManager)
对于一个提交执行的作业, JobManager 是真正意义上的“管理者”(Master),负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”(Worker、 Slave),负责执行任务处理数据,所以可以有一个或多个

部署模式
- 会话模式
- 单作业模式
- 应用模式
区别主要在于:集群的生命周期以及资源的分配方式,以及应用的 main 方法到底在哪里执行:客户端(Client)还是 JobManager
会话模式
先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业
缺点:因为资源是共享的,所以资源不够了,提交新的作业就会失败,另外,同一个 TaskManager 上可能运行了很多作业,如果其中一个发生故障导致 TaskManager 宕机,那么所有作业都会受到影响
会话模式比较适合于单个规模小、执行时间短的大量作业
单作业模式
为每个提交的作业启动一个集群
单作业模式也很好理解,就是严格的一对一,集群只为这个作业而生。同样由客户端运行应用程序,然后启动集群,作业被提交给 JobManager,进而分发给 TaskManager 执行。作业作业完成后,集群就会关闭,所有资源也会释放。这样一来,每个作业都有它自己的 JobManager 管理,占用独享的资源,即使发生故障,它的 TaskManager 宕机也不会影响其他作业。
这些特性使得单作业模式在生产环境运行更加稳定,所以是实际应用的首选模式
需要注意的是,Flink 本身无法直接这样运行,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如 YARN、Kubernetes
应用模式
前面提到的两种模式下,应用代码都是在客户端上执行,然后由客户端提交给 JobManager 的。但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗
所以解决办法就是,我们不要客户端了,直接把应用提交到 JobManger 上运行
而这也就代表着,我们需要为每一个提交的应用单独启动一个 JobManager,也就是创建一个集群。这个 JobManager 只为执行这一个应用而存在,执行结束之后 JobManager 也就关闭了
小结
应用模式与单作业模式,都是提交作业之后才创建集群;单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由 JobManager 执行应用程序的,并且即使应用包含了多个作业,也只创建一个集群
总结一下,在会话模式下,集群的生命周期独立于集群上运行的任何作业的生命周期,并且提交的所有作业共享资源
而单作业模式为每个提交的作业创建一个集群,带来了更好的资源隔离,这时集群的生命周期与作业的生命周期绑定
最后,应用模式为每个应用程序创建一个会话集群,在 JobManager 上直接调用应用程序的 main() 方法
实际应用时,一般需要和资源管理平台结合起来,选择特定的模式来分配资源、部署应用
YARN 模式
YARN 上部署的过程是:客户端把 Flink 应用提交给 Yarn 的ResourceManager, Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器
在这些容器上,Flink 会部署 JobManager 和 TaskManager 的实例,从而启动集群
Flink 会根据运行在 JobManger 上的作业所需要的 Slot 数量动态分配 TaskManager 资源
1)配置环境变量:
$ sudo vim /etc/profile.d/my_env.sh
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath`
2)可修改 conf/flink-conf.yaml 文件来修改相关配置:
需要注意的是:slots 等相关配置需要小于yarn容器所分配的资源
$ cd /opt/module/flink-1.13.0-yarn/conf/
$ vim flink-conf.yaml
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m
# 根据需要设置
taskmanager.numberOfTaskSlots: 1
parallelism.default: 1
3) 修改 hadoop/etc/hadoop/yarn-site.xml (注意分发)
<!-- 关闭 yarn 内存检查 -->
<!-- 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认为 true -->
<!-- 因为对于 Flink 使用 yarn 模式下,很容易内存超标,这个时候 yarn 会自动杀掉 job,因此需要关掉-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
会话模式部署
注意需要在ResourceManager上进行相关操作
-
启动集群
$ bin/yarn-session.sh -nm test -d-d:分离模式,如果你不想让 Flink YARN 客户端一直前台运行,可以使用这个参数,即使关掉当前对话窗口,YARN session 也可以后台运行
-jm(--jobManagerMemory):配置 JobManager 所需内存,默认单位 MB
-nm(--name):配置在 YARN UI 界面上显示的任务名
-qu(--queue):指定 YARN 队列名
-tm(--taskManager):配置每个 TaskManager 所使用内存
注意:Flink1.11.0 版本不再使用-n 参数和-s 参数分别指定 TaskManager 数量和 slot 数量, YARN 会按照需求动态分配TaskManager 和 slot。所以从这个意义上讲,YARN 的会话模式也不会把集群资源固定,同样是动态分配的
-
提交作业
$ bin/flink run -c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0.jar
参考
【Flink 搭建 - Flink On Yarn 集群模式】:https://blog.csdn.net/hell_oword/article/details/120116908

浙公网安备 33010602011771号