flink on yarn 将运行所需的依赖包与上传到远程(如:hdfs系统),这将使作业提交变得非常轻量级,因为所需的Flink jar和应用程序jar将由指定的远程获取,而不是由客户端发送到集群。
- Application Mode on yarn
./bin/flink run-application \
-t yarn-application \
-Dyarn.application.name="flink-yarn-application" \
-Dtaskmanager.numberOfTaskSlots=5 \
-Djobmanager.memory.process.size=1024m \
-Dtaskmanager.memory.process.size=1024m \
-Drest.flamegraph.enabled=true \
-Dyarn.provided.lib.dirs="hdfs://bdptest/data/flink-1.15.0/lib;hdfs:///data/flink-1.15.0/plugins" \
hdfs:///data/flink-1.15.0/flink-demo01-1.0-SNAPSHOT-pony-shade.jar
NOTE:
Flink 应用的执行包含两个阶段:
- pre-flight: 在main()方法调用之后开始,构造job graph。
- runtime: 一旦用户代码调用 execute() 就会触发该阶段。
只有在application模式main函数所依赖的jar包(flink-dist-jar)才可以放到远程分布式文件系统,因为application模式的main方法在jobmanager执行。
但是对于Session模式和Per-Job模式,main方法在客户端执行。
- Per-Job Cluster Mode on yarn
./bin/flink run -t yarn-per-job --detached \
-Dyarn.application.name="flink-yarn-perjob" \
-Dyarn.provided.lib.dirs="hdfs://bdptest/data/flink-1.15.0/lib;hdfs:///data/flink-1.15.0/plugins" \
./examples/streaming/TopSpeedWindowing.jar
- Session Mode on yarn
./bin/yarn-session.sh --detached \
-Dyarn.application.name="flink-yarn-session" \
-Dtaskmanager.numberOfTaskSlots=5 \
-Dyarn.provided.lib.dirs="hdfs://bdptest/data/flink-1.15.0/lib;hdfs:///data/flink-1.15.0/plugins" \
-Drest.flamegraph.enabled=true
./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
【yarn.provided.lib.dirs】参数解释
指定远程依赖包所在的路径,可以是多个路径,使用分号分割。此路径下的依赖包是预先上传的,并且全局可读的。
该种模式的操作使得 flink 作业提交变得很轻量,避免了从本地客户端上传Flink依赖(例如:Flink-dist、lib/、plugins/),以加速作业提交过程。
另外,YARN会将它们缓存到节点上,这样就不需要为每个应用程序每次都下载依赖。这也是社区在 flink-1.11 版本引入新的部署模式的意义所在。
NOTE:
如果自己指定 yarn.provided.lib.dirs,有以下注意事项:
- 需要将 lib 包和 plugins 包地址用;分开,从上面的例子中也可以看到,将 plugins 包放在 lib 目录下可能会有包冲突错误
- plugins 包路径地址必须以 plugins 结尾,例如上面例子中的 hdfs:///data/flink-1.15.0/plugins
示例:
hdfs://{namenode_address}/data/flink-1.15.0/lib;hdfs://{namenode_address}/data/flink-1.15.0/plugins;hdfs://{namenode_address}/data/flink-1.15.0/flink-dist
应用说明
- 如果不指定【yarn.provided.lib.dirs】
应用程序flink依赖包在nodemanager节点的分布情况:
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0026/filecache/53/flink-dist-1.15.0.jar
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0026/container_e31_1655891072415_0026_01_000001/flink-dist-1.15.0.jar
flink-dist-1.15.0.jar是在当前application_1655891072415_0026下面,任务停止,依赖被清除。等下次再次启动flink任务时,再次从client上传到hdfs,然后下发到计算节点指定目录。当前节点上的container的依赖取的是当前applicationId filecache上的超链接,如下:
[root@hadoop05 ~]# find / -name flink-dist-1.15.0.jar
/data/hadoop/yarn/local/filecache/79/flink-dist-1.15.0.jar
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/filecache/52/flink-dist-1.15.0.jar
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/container_e31_1655891072415_0048_01_000001/flink-dist-1.15.0.jar
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/container_e31_1655891072415_0048_01_000002/flink-dist-1.15.0.jar
[root@hadoop05 ~]# ll /data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/container_e31_1655891072415_0048_01_000001/flink-dist-1.15.0.jar
lrwxrwxrwx 1 yarn hadoop 118 Jun 24 12:14 /data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/container_e31_1655891072415_0048_01_000001/flink-dist-1.15.0.jar -> /data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0048/filecache/52/flink-dist-1.15.0.jar
- 如果不指定【yarn.provided.lib.dirs】
应用程序flink依赖包在nodemanager节点的分布情况:
/data/hadoop/yarn/local/filecache/79/flink-dist-1.15.0.jar
/data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0046/container_e31_1655891072415_0046_01_000001/lib/flink-dist-1.15.0.jar
flink-dist-1.15.0.jar不是在当前application_1655891072415_0046下面,任务停止,依赖依然存在。等下次再次启动flink任务时,直接复用。当前节点上的container的依赖取的是当前filecache上的超链接,如下:
[root@hadoop05 ~]# ll /data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0047/container_e31_1655891072415_0047_01_000001/lib/flink-dist-1.15.0.jar
lrwxrwxrwx 1 yarn hadoop 63 Jun 24 12:09 /data/hadoop/yarn/local/usercache/root/appcache/application_1655891072415_0047/container_e31_1655891072415_0047_01_000001/lib/flink-dist-1.15.0.jar -> /data/hadoop/yarn/local/filecache/79/flink-dist-1.15.0.jar