赞
踩
目录
以Yarn模式部署Flink任务时,要求Flink是有 Hadoop 支持的版本,Hadoop 环境需要保证版本在 2.2 以上,并且集群中安装有 HDFS 服务。
独立(Standalone)模式由 Flink 自身提供资源,无需其他框架,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但我们知道,Flink 是大数据计算框架,不是资源调度框架,这并不是它的强项;所以还是应该让专业的框架做专业的事,和其他资源调度框架集成更靠谱。而在目前大数据生态中,国内应用最为广泛的资源管理平台就是 YARN 了。所以接下来我们就将学习,在强大的 YARN 平台上 Flink 是如何集成部署的。
整体来说,YARN 上部署的过程是:客户端把 Flink 应用提交给 Yarn 的 ResourceManager, Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器。在这些容器上,Flink 会部署 JobManager 和 TaskManager 的实例,从而启动集群。Flink 会根据运行在 JobManger 上的作业 所需要的 Slot 数量动态分配 TaskManager 资源。
Flink1.13 版本提供了三种在 yarn 上运行的模式,分别是会话模式、单作业模式和应用模式。(1.10的时候没有应用模式)
Session-Cluster 模式需要先启动集群,然后再提交作业,接着会向 yarn 申请一 块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到 yarn 中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享 Dispatcher 和 ResourceManager;共享资源;适合规模小执行时间短的作业。
在 yarn 中初始化一个 flink 集群,开辟指定的资源,以后提交任务都向这里提交。这个 flink 集群会常驻在 yarn 集群中,除非手工停止。
YARN 的会话模式与独立集群略有不同,需要首先申请一个 YARN 会话(YARN session) 来启动 Flink 集群。具体步骤如下:
(1)启动 hadoop 集群
(2)执行脚本命令向 YARN 集群申请资源,开启一个 YARN 会话,启动 Flink 集群。
$ bin/yarn-session.sh -nm test
可用参数解读:
注意:Flink1.11.0 版本不再使用-n 参数和-s 参数分别指定 TaskManager 数量和 slot 数量, YARN 会按照需求动态分配 TaskManager 和 slot。所以从这个意义上讲,YARN 的会话模式也 不会把集群资源固定,同样是动态分配的。 YARN Session 启动之后会给出一个 web UI 地址以及一个 YARN application ID,如下所示, 用户可以通过 web UI 或者命令行两种方式提交作业。
2021-06-03 15:54:27,069 INFO org.apache.flink.yarn.YarnClusterDescriptor [] - YARN application has been deployed successfully. 2021-06-03 15:54:27,070 INFO org.apache.flink.yarn.YarnClusterDescriptor [] - Found Web Interface hadoop104:39735 of application 'application_1622535605178_0003'. JobManager Web Interface: http://hadoop104:39735
(1)通过 Web UI 提交作业 这种方式比较简单,与上文所述 Standalone 部署模式基本相同。
(2)通过命令行提交作业
① 将 Standalone 模式讲解中打包好的任务运行 JAR 包上传至集群
② 执行以下命令将该任务提交到已经开启的 Yarn-Session 中运行。客户端可以自行确定 JobManager 的地址,也可以通过-m 或者-jobmanager 参数指定 JobManager 的地址,JobManager 的地址在 YARN Session 的启动页面中可以找到。
$ bin/flink run -c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT.jar
③ 任务提交成功后,可在 YARN 的 Web UI 界面查看运行情况。 如下图所示,从图中可以看到我们创建的 Yarn-Session 实际上是一个 Yarn 的 Application,并且有唯一的 Application ID。
④也可以通过 Flink 的 Web UI 页面查看提交任务的运行情况,如图 3-15 所示。
如果想取消 yarn-session,直接执行kill
yarn application --kill application_1577588252906_0001
一个 Job 会对应一个集群,每提交一个作业会根据自身的情况,都会单独向 yarn 申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享 Dispatcher 和 ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。每次提交都会创建一个新的 flink 集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。
仅仅启动 hadoop 集群(略)
(1)执行命令提交作业
- $ bin/flink run -d -t yarn-per-job -c com.atguigu.wc.StreamWordCount
- FlinkTutorial-1.0-SNAPSHOT.jar
早期版本也有另一种写法(注意这里是通过参数-m yarn-cluster 指定向 YARN 集群提交任务):
- $ bin/flink run -m yarn-cluster -c com.atguigu.wc.StreamWordCount
- FlinkTutorial-1.0-SNAPSHOT.jar
(2)在 YARN 的 ResourceManager 界面查看执行情况,如图 3-16 所示。
点击可以打开 Flink Web UI 页面进行监控,如图 3-17 所示:
可以使用命令行查看或取消作业,命令如下
$ ./bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY $
./bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
这里的 application_XXXX_YY 是当前应用的 ID,是作业的 ID。注意如果取消作业,整个 Flink 集群也会停掉。
前面提到的两种模式下,应用代码都是在客户端上执行,然后由客户端提交给 JobManager 的。但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给 JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的 资源消耗。
所以解决办法就是,我们不要客户端了,直接把应用提交到 JobManger 上运行。而这也就代表着,我们需要为每一个提交的应用单独启动一个 JobManager,也就是创建一个集群。这个 JobManager 只为执行这一个应用而存在,执行结束之后 JobManager 也就关闭了,这就是所 谓的应用模式,如图 3-12 所示。
应用模式与单作业模式,都是提交作业之后才创建集群;单作业模式是通过客户端来提交 的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由 JobManager 执行应用程序的,并且即使应用包含了多个作业,也只创建一个集群。
应用模式同样非常简单,与单作业模式类似,直接执行 flink run-application 命令即可。
(1)执行命令提交作业。
- $ bin/flink run-application -t yarn-application -c com.atguigu.wc.StreamWordCount
- FlinkTutorial-1.0-SNAPSHOT.jar
(2)在命令行中查看或取消作业。
- $ ./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
- $ ./bin/flink cancel -t yarn-application
- -Dyarn.application.id=application_XXXX_YY <jobId>
(3)也可以通过 yarn.provided.lib.dirs 配置选项指定位置,将 jar 上传到远程。这种方式下 jar 可以预先上传到 HDFS,而不需要单独发送到集群,这就使得作业提交更 加轻量了。
- $ ./bin/flink run-application -t yarn-application
- -Dyarn.provided.lib.dirs="hdfs://myhdfs/my-remote-flink-dist-dir"
- hdfs://myhdfs/jars/my-application.jar
总结一下,在会话模式下,集群的生命周期独立于集群上运行的任何作业的生命周期,并 且提交的所有作业共享资源。而单作业模式为每个提交的作业创建一个集群,带来了更好的资 源隔离,这时集群的生命周期与作业的生命周期绑定。最后,应用模式为每个应用程序创建一 个会话集群,在 JobManager 上直接调用应用程序的 main()方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。