1. Flink on Yarn 简介
Flink的Standalone和 Yarn模式都属于集群运行模式,但是有很大的不同,在实际环境中,使用Flink on Yarn模式者居多。
on yarn模式的好处
在集群运行时,可能会有很多的集群实例包括MapReduce、Spark、Flink等等,那么如果它们全基于on Yarn就可以完成资源分配,减少单个实例集群的维护,提高集群的利用率。
on yarn模式注意事项
- 在yarn模式下,启动flink集群之前要启动yarn和hadoop
- 以Yarn模式部署Flink任务时,要求Flink有Hadoop支持的版本。Flink1.10要求Hadoop环境需要保证版本在2.2以上,并且集群中安装有HDFS服务。
2.Flink on Yarn的两种模式说明
Flink on yarn有两种运行模式:Session-Cluster
和Per-Job-Cluster
模式。
2.1 Session-cluster 模式
(1)session模式特点
- 内存集中管理
在Yarn中初始化一个Flink集群,开辟指定的资源,资源申请到之后,资源永远保持不变,之后我们提交的Flink Jon都在这个Flink yarn-session中,也就是说不管提交多少个job,这些job都会共用开始时在yarn中申请的资源。这个Flink集群会常驻在Yarn集群中,除非手动停止。
如果资源满了,下一个作业就无法提交(阻塞),只能等到yarn中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。
从上面来看, Session模式下基本和standalone模式一样,只不过是资源管理交给了Yarn集群
(2)session模式下的flink集群运行时四个组件
- Dispatcher和ResourceManager由所有提交的job共享
- Dispatcher负责给job封装jobManager,jobManager和job是绑定的,一个job由一个jobManager管理。
- ResourceManager负责给job安排NodeManager用来启动TaskManager
(3)Session模式的适用场景
- 适合规模小、执行时间短的作业。
- 比如适合小的有界流,不适合无界流,因为无界流的Job 7*24小时运行,始终占用资源,如果Job多了资源不够用,导致Job阻塞
2.2 Per-Job-Cluster 模式
- 先提交job,再启动flink集群。一个job对应一个flink集群,每个flink集群单独向yarn申请资源,因此每个job之间资源不共享、每个job之间互相独立,互不影响,方便管理,一个作业的失败与否并不会影响下一个作业的正常提交和运行。
- 只有当整个yarn集群资源不足,才会造成任务无法提交了。
- job执行完成之后对应的集群也会消失。
由于每个job独享一个flink集群,每个job独享Dispatcher和ResourceManager,按需接受资源申请;
应用场景:规模大,时间长的任务,无界流任务可用
2.3 Application Mode
3.Flink on Yarn 两种模式演示
Session Cluster使用演示
Session Cluster的启动
1.启动hadoop集群(略)
2.添加hadoop依赖
将hadoop依赖支持放进flink/lib目录下
Flink官方从1.8版本开始不提供带hadoop支持,flink将hadoop当做额外的组件,需要手动放进来。
在G:\18_尚硅谷大数据技术之Flink\2.资料目录下,2.8和3.1版本都能用
3.启动yarn-session
bin/yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
Yarn-session模式下,在启动的时候就指定好了TaskManager的数量,指定了资源的数量;
- -n (–container):TaskManager的数量。
- -s(–slots): 每个TaskManager的slot数量,默认1个slot1个core,有时可以多一些taskmanager,做冗余。
- -jm:JobManager的内存(单位MB)。
- -tm:每个taskmanager的内存(单位MB)。
- -nm:yarn 的appName(现在yarn的ui上的名字)。
- -d:后台执行。
其中-n 和 -d已经无效了。(并不会后台执行)
注意:每次启动yarn-session会阻塞当前Linux的页面,ctrl+c 会挂掉当前的yarn-session;并且页面末尾如下面一张图所示,每次启动yarn-session会随机jobmanager的端口号,因此要从web页面访问,需要按照这个端口号来访问。[总结:启动yarn-session阻塞页面+随机web端口号]
jpsall如下:
提交Job执行任务
./flink run -c com.atguigu.wc.Flink03_WordCount_Unbounded FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar --host hadoop102 --port 7777
去yarn控制台查看任务状态
取消任务
yarn application --kill application_1577588252906_0001
Session-Cluster中任务提交现象说明
前提:三台机器,flink的配置为每个TaskManager有两个slots,一共6个slots
(1)访问web页面会看到可用slots个数为0,因为还没有提交任务,yarn没有给flink集群分配资源。Yarn分配资源的进程为YarnTaskExecutorRunner,提交任务后,yarn回启动这个进程来调度资源。用jps可以看到。
现象1:提交job后才能查看flink集群可用资源
(2)提交一个并行度为4的job,yarn会分配两个TaskManager,4个slots
两个taskManager进程都分配到第三台 机器了;
现象2:(一台NodeManager可以运行多个TaskManager进程)
(3)再提交并行度为1的job,flink需要1个TaskManager来执行此job,由于两个已经启动的TaskManager已经没有slot可以提供给job了,yarn需要申请NodeManager资源来启动TaskManager,而一个TaskManager就带有两个Slot,因此会还剩1个slot可用。
现象3:(TaskManager进程是Flink中管理资源的最小单元)
(4)再提交并行度>1的job,会造成和standAlone模式下一样的现象
可用slots为0,Running Jobs为3,但是第三个Job是阻塞的
2.3 Per Job Cluster使用演示
-
启动hadoop集群(略)
-
将hadoop依赖支持放进flink/lib目录下
Flink官方从1.8版本开始不提供带hadoop支持,flink将hadoop当做额外的组件,需要手动放进来。
在G:\18_尚硅谷大数据技术之Flink\2.资料目录下,2.8和3.1版本都能用 -
不用启动yarn-session,直接执行job
./flink run -m yarn-cluster -c com.atguigu.wc.Flink03_WordCount_Unbounded \
FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar --host hadoop102 --port 7777
说明:Per Job Cluster模式下提交job比standalone模式下提交job多一个参数-m yarn-cluster
提交后linux窗口阻塞,如下图所示:也会随机web的地址
Yarn模式下提交的flink任务,在yarn web页面都能查看到,可以看出来flink在yarn的两种部署模式
2.3.1 Per Job模式下两种访问web UI页面方式
第一种:根据随机的web地址,在浏览器访问
第二种:在yarn页面中找到当前提交的flink Job,在Tracking UI页面可以访问到UI页面(如下图所示)
注意: PerJob模式下,一个job对应一个webUI页面,和Session模式不同,Session模式下所有任务共享一个webUI页面,因此可以看见一个页面有多个Job的现象,但是PerJob模式下的web页面只会显示当前一个Job。
2.4 无界流job占满一个队列
- 无界流job占满一个队列
如果提交了一个无界流Job,由于Yarn模式下,默认使用的是容量调度器,容量调度器是多队列但是先进先出型,一个队列只能跑一个任务,而无界流任务不会停止,因此会将队列阻塞,此时如果再提交一个job,即使集群的资源足够使用,由于调度队列被阻塞,仍然会导致第二个job阻塞,因此需要提交到另一个队列中
2.5 flink提交任务时指定队列的方式
bin/flink 可以查看命令的参数
PerJob模式提交一个flink job到hive队列中:
2.6 两种模式下job占用队列方式
- Yarn-session模式下,Yarn-session整体相当于一个Job提交在yarn的调度队列中,因此可以提交多个无界流任务;
- PerJob模式不同,PerJob提交的每一个Job都是一个调度队列中的,因此一个队列只能提交一个无界流Job
2.7 PerJob模式下一个NodeManager可有多个TaskManager
PerJob 模式下分别提交两个并行度为4的Job到两个队列中:
是可以运行的,因为允许一台机器上启动多个TaskManager
一台机器上起的TaskManager的个数受TaskManger配置的内存限制:
结论:PerJob模式下,只要整个Yarn集群的机器资源充足,就能一直启动TaskManager,
而YarnSession和standalone模式下,一台机器只能启动一个taskManager;
调小slots大小的两种方式:
- 调小taskManager的内存
- 调大slots个数