当前位置:   article > 正文

【Flink】【第三章 Flink运行模式】 Flink on Yarn

flink on yarn


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-ClusterPer-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
  • 1

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
  • 1

去yarn控制台查看任务状态

在这里插入图片描述

取消任务

yarn application --kill application_1577588252906_0001
  • 1

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使用演示

  1. 启动hadoop集群(略)

  2. 将hadoop依赖支持放进flink/lib目录下
    Flink官方从1.8版本开始不提供带hadoop支持,flink将hadoop当做额外的组件,需要手动放进来。
    在G:\18_尚硅谷大数据技术之Flink\2.资料目录下,2.8和3.1版本都能用

  3. 不用启动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
  • 1
  • 2

说明: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大小的两种方式:

  1. 调小taskManager的内存
  2. 调大slots个数
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/941679
推荐阅读
相关标签
  

闽ICP备14008679号