flink on yarn之per-job方式部署超时的一种解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flink on yarn之per-job方式部署超时的一种解决方法相关的知识,希望对你有一定的参考价值。

参考技术A

网上很多写的很乱,看不明白,故此记录。

前提:
flink版本:1.10.0
zk集群
hadoop集群

flink还不完善,也不想诟病了
分析 :我这里是,由于yarn调度器实际上是一个队列,在yarn-cluster选项中有 -yqu 这个参数,表示指定一个队列,如果你已经提交了一个per-job任务,再次提交 必须指定一个新的队列名称 ,否则他会一直等待之前的任务结束后,新的job才能running,所以一直是accept。

解决 :flink run -m yarn-cluster -yqu root.myjob1 ..

另:flink1.10已经不必需要-yn了,它会自动去检测。

Flink On Yarn模式,为什么使用Flink On Yarn?Session模式Per-Job模式关闭yarn的内存检查,由Yarn模式切换回standalone模式时需要注意的点

Flink On Yarn模式

原理

为什么使用Flink On Yarn?

在实际开发中,使用Flink时,更多的使用方式是Flink On Yarn模式,原因如下:

-1.Yarn的资源可以按需使用,提高集群的资源利用率
-2.Yarn的任务有优先级,根据优先级运行作业
-3.基于Yarn调度系统,能够自动化地处理各个角色的 Failover(容错)
○ JobManager 进程和 TaskManager 进程都由 Yarn NodeManager 监控
○ 如果 JobManager 进程异常退出,则 Yarn ResourceManager 会重新调度 JobManager 到其他机器
○ 如果 TaskManager 进程异常退出,JobManager 会收到消息并重新向 Yarn ResourceManager 申请资源,重新启动 TaskManager

Flink如何和Yarn进行交互?

在这里插入图片描述
在这里插入图片描述
1.Client上传jar包和配置文件到HDFS集群上
2.Client向Yarn ResourceManager提交任务并申请资源
3.ResourceManager分配Container资源并启动ApplicationMaster,然后AppMaster加载Flink的Jar包和配置构建环境,启动JobManager

JobManager和ApplicationMaster运行在同一个container上。
一旦他们被成功启动,AppMaster就知道JobManager的地址(AM它自己所在的机器)。
它就会为TaskManager生成一个新的Flink配置文件(他们就可以连接到JobManager)。
这个配置文件也被上传到HDFS上。
此外,AppMaster容器也提供了Flink的web服务接口。
YARN所分配的所有端口都是临时端口,这允许用户并行执行多个Flink

4.ApplicationMaster向ResourceManager申请工作资源,NodeManager加载Flink的Jar包和配置构建环境并启动TaskManager
5.TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务

两种方式

Session模式

在这里插入图片描述
在这里插入图片描述
特点:需要事先申请资源,启动JobManager和TaskManger
优点:不需要每次递交作业申请资源,而是使用已经申请好的资源,从而提高执行效率
缺点:作业执行完成以后,资源不会被释放,因此一直会占用系统资源
应用场景:适合作业递交比较频繁的场景,小作业比较多的场景

Per-Job模式

在这里插入图片描述
在这里插入图片描述
特点:每次递交作业都需要申请一次资源
优点:作业运行完成,资源会立刻被释放,不会一直占用系统资源
缺点:每次递交作业都需要申请资源,会影响执行效率,因为申请资源需要消耗时间
应用场景:适合作业比较少的场景、大作业的场景

操作

vim /export/server/hadoop/etc/hadoop/yarn-site.xml
添加:

<!-- 关闭yarn内存检查 -->
 
<property>
 
<name>yarn.nodemanager.pmem-check-enabled</name>
 
    <value>false</value>
 
</property>
 
<property>
 
     <name>yarn.nodemanager.vmem-check-enabled</name>
 
     <value>false</value>
 
</property>

说明:
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
在这里面我们需要关闭,因为对于flink使用yarn模式下,很容易内存超标,这个时候yarn会自动杀掉job

2.同步

scp -r /export/server/hadoop/etc/hadoop/yarn-site.xml node2:/export/server/hadoop/etc/hadoop/yarn-site.xml 
scp -r /export/server/hadoop/etc/hadoop/yarn-site.xml node3:/export/server/hadoop/etc/hadoop/yarn-site.xml

3.重启yarn

/export/server/hadoop/sbin/stop-yarn.sh 
/export/server/hadoop/sbin/start-yarn.sh

测试

Session模式

yarn-session.sh(开辟资源) + flink run(提交任务)

1.在yarn上启动一个Flink会话,node1上执行以下命令

/export/server/flink/bin/yarn-session.sh -n 2 -tm 800 -s 1 -d

说明:

申请2个CPU、1600M内存

# -n 表示申请2个容器,这里指的就是多少个taskmanager
# -tm 表示每个TaskManager的内存大小
# -s 表示每个TaskManager的slots数量
# -d 表示以后台程序方式运行

注意:

该警告不用管
WARN  org.apache.hadoop.hdfs.DFSClient  - Caught exception
java.lang.InterruptedException

2. 查看UI界面

http://node1:8088/cluster
在这里插入图片描述

3.使用flink run提交任务:

/flink/bin/flink run  /export/server/flink/examples/batch/WordCount.jar
run  /export/server/flink/examples/batch/WordCount.jar

4.通过上方的ApplicationMaster可以进入Flink的管理界面

在这里插入图片描述
在这里插入图片描述

5.关闭yarn-session:

yarn application -kill application_1599402747874_0001

在这里插入图片描述

rm -rf /tmp/.yarn-properties-root

Per-Job分离模式

1.直接提交job

/export/server/flink/bin/flink run -m yarn-cluster -yjm 1024 -ytm 1024 /export/server/flink/examples/batch/WordCount.jar
# -m  jobmanager的地址
# -yjm 1024 指定jobmanager的内存信息
# -ytm 1024 指定taskmanager的内存信息

2.查看UI界面

http://node1:8088/cluster
在这里插入图片描述
在这里插入图片描述

3.注意:

在之前版本中如果使用的是flink on yarn方式,想切换回standalone模式的话,如果报错需要删除:【/tmp/.yarn-properties-root】

rm -rf /tmp/.yarn-properties-root

因为默认查找当前yarn集群中已有的yarn-session信息中的jobmanager

以上是关于flink on yarn之per-job方式部署超时的一种解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Flink源码阅读——Flink on Yarn的Per-job模式源码简析

Flink on Yarn三部曲之二:部署和设置

Flink on Yarn三部曲之二:部署和设置

Flink on Yarn三部曲之三:提交Flink任务

FlinkOnYarn源码分析

kerberos环境下parcel方式部署flink1.15.3 基于CDH6.3.2 Flink on Yarn