Flink on Yarn模式部署

一,介绍

独立(Standalone)模式由 Flink 自身提供资源,无需其他框架,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但我们知道,Flink 是大数据计算框架,不是资源调度框架,这并不是它的强项;所以还是应该让专业的框架做专业的事,和其他资源调度框架集成更靠谱。而在目前大数据生态中,国内应用最为广泛的资源管理平台就是 YARN 了。所以接下来介绍的是 YARN 平台上 Flink 是如何集成部署的。

整体来说,YARN 上部署的过程是:客户端把 Flink 应用提交给 Yarn 的ResourceManager, Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器。在这些容器上,Flink 会部署JobManager 和 TaskManager 的实例,从而启动集群。Flink 会根据运行在 JobManger 上的作业所需要的 Slot 数量动态分配TaskManager 资源。

二,flink on yarn部署

2.1 相关准备和配置

在 Flink1.8.0 之前的版本,想要以 YARN 模式部署 Flink 任务时,需要 Flink 是有 Hadoop 支持的。从 Flink 1.8 版本开始,不再提供基于 Hadoop 编译的安装包,若需要Hadoop 的环境支持,需要自行在官网下载 Hadoop 相关版本的组件flink-shaded-hadoop-2-uber-2.7.5-10.0.jar, 并将该组件上传至 Flink 的 lib 目录下。在 Flink 1.11.0 版本之后,增加了很多重要新特性,其中就包括增加了对Hadoop3.0.0 以及更高版本Hadoop 的支持,不再提供flink-shaded-hadoop-*jar 包,而是通过配置环境变量完成与 YARN 集群的对接。

在将 Flink 任务部署至 YARN 集群之前,需要确认集群是否安装有Hadoop,保证Hadoop版本至少在 2.2 以上,并且集群中安装有 HDFS 服务。
下载flink安装包:https://flink.apache.org/downloads.html

这里我选用的版本为:flink-1.13.6-bin-scala_2.12.tgz

下载kafka相关jar,为后续连接kafka做准备

https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka_2.12/1.13.6/flink-connector-kafka_2.12-1.13.6.jar

https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/2.0.0/kafka-clients-2.0.0.jar

将安装包上传到/root/soft下载,进行解压操作

cd /root/soft
tar -zxf flink-1.13.6-bin-scala_2.12.tgz -C /data1/

为了方便区分将安装包改名

cd /data1/
mv flink-1.13.6/ flink-1.13.6-yarn

2.2 环境变量配置

修改机器环境变量

vim /etc/profile

增加环境变量配置如下,这里必须保证设置了环境变量HADOOP_CLASSPATH

# hadoop
export HADOOP_HOME=/usr/hdp/3.1.5.0-152/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/conf
export HADOOP_CLASSPATH=`hadoop classpath`

# flink
export FLINK_HOME=/data1/flink-1.13.6-yarn
export PATH=$PATH:$FLINK_HOME/bin

修改完使用以下命令生效

source /etc/profile

2.3 flink配置修改

进入 conf 目录,修改 flink-conf.yaml 文件

cd $FLINK_HOME
vim conf/flink-conf.yaml

修改以下配置

jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m
taskmanager.numberOfTaskSlots: 1
parallelism.default: 1

参数意义如下

参数 介绍
jobmanager.memory.process.size 对 JobManager 进程可使用到的全部内存进行配置, 包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
taskmanager.memory.process.size 对 TaskManager 进程可使用到的全部内存进行配置,包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
taskmanager.numberOfTaskSlots 对每个 TaskManager 能够分配的 Slot 数量进行配置, 默认为 1,可根据 TaskManager 所在的机器能够提供给 Flink 的 CPU 数量决定。所谓Slot 就是TaskManager 中具体运行一个任务所分配的计算资源。
parallelism.default Flink 任务执行的默认并行度,优先级低于代码中进行的并行度配置和任务提交时使用参数指定的并行度数量。

2.4 上传依赖包

为了后续使用flink连接kafka时不出现问题,这里将额外下载的jar包上传到lib目录

cd /root/soft
cp flink-connector-kafka_2.12-1.13.6.jar kafka-clients-2.0.0.jar $FLINK_HOME/lib

2.5 高可用部署

正常基于 Yarn 提交 Flink 程序,无论是使用 yarn-session 模式还是 yarn-cluster 模 式 , 基 于 yarn 运 行 后 的 application 只 要 kill 掉 对 应 的 Flink 集 群 进 程 “YarnSessionClusterEntrypoint”后,基于 Yarn 的 Flink 任务就失败了,不会自动进行重试,所以基于 Yarn 运行 Flink 任务,也有必要搭建 HA,同样还是需要借助 zookeeper 来完成高可用管理。

Flink on Yarn的HA高可用模式,首先依赖于Yarn自身的高可用机制(ResourceManager高可用),并通过Yarn对JobManager进行管理,当JobManager失效时,Yarn将重新启动JobManager。其次Flink Job在恢复时,需要依赖Checkpoint进行恢复,而Checkpoint的快照依赖于远端的存储:HDFS,所以HDFS也必须是高可用,同时JobManager的元数据信息也依赖于HDFS的高可用(namenode的高可用,和多副本机制),再者JobManager元数据的指针信息要依赖于Zookeeper的高可用。

YARN 模式的高可用和独立模式(Standalone)的高可用原理不一样。Standalone 模式中, 同时启动多个 JobManager, 一个为leader,其他为standby,当 leader 挂了, 其他的才会有一个成为 leader。而 YARN 的高可用是只启动一个 Jobmanager,当这个 Jobmanager 挂了之后,YARN 会再次启动一个,所以其实是利用的 YARN 的重试次数来实现的高可用。

请注意,在YARN上部署时,Flink管理high-availability.cluster-id配置参数。Flink默认将其设置为YARN应用程序的ID。在YARN上部署HA集群时,你不应该覆盖这个参数。集群ID是用来区分HA后端(例如Zookeeper)的多个HA集群的。覆盖这个配置参数会导致多个YARN集群相互影响。

Flink on YARN是针对Hadoop 2.4.1编译的,所有Hadoop版本>=2.4.1都被支持,包括Hadoop 3.x。

2.5.1 修改yarn配置

YARN负责重启失败的JobManagers。JobManager的最大重启次数是通过两个配置参数定义的。首先Flink的yarn.application-attempts配置将默认为2。这个值由YARN的yarn.resourcemanager.am.max-attempts限制,它的默认值也是2。

修改yarn 中配置(yarn-site.xml)设置application master重启时,尝试的最大次数。

<property>
    <name>yarn.resourcemanager.am.max-attemptsname>
    <value>4value>
    <description>
    The maximum number of application master execution attempts.
    description>
property>

2.5.2 修改flink-conf.yaml配置

修改flink-conf.yaml配置文件,添加修改以下内容

# 单个flink job重启次数 必须小于等于yarn-site.xml中Application Master配置的尝试次数(yarn.resourcemanager.am.max-attempts)
yarn.application-attempts: 3
# 高可用模式
high-availability: zookeeper
# JobManager元数据保留在文件系统storageDir中,指向此状态的指针存储在ZooKeeper中
high-availability.storageDir: hdfs://mycluster/flink/yarn/ha
# Zookeeper集群,修改为自己的集群
high-availability.zookeeper.quorum: n11hdp01:2181,n12hdp02:2181,n13hdp03:2181
# 在zookeeper下的根目录
high-availability.zookeeper.path.root: /flink-yarn

注意:对于未启动高可用之前启动job 需要在配置完高可用后重启job

2.5.3 测试

测试 flink on yarn 下per job

flink run -d -t yarn-per-job $FLINK_HOME/examples/streaming/TopSpeedWindowing.jar

查看hdfs目录,可以看到flink on yarn的 ha checkpoint目录已创建
Flink on Yarn模式部署_第1张图片
查看flink webui日志,可以看到已选取leader
Flink on Yarn模式部署_第2张图片

Jps获取YarnJobClusterEntrypoint 的进程,然后杀掉此进程
Flink on Yarn模式部署_第3张图片

这时再访问job的web ui界面可以看到以下信息,这个代表正常选举leader,jobmanager正在重启
Flink on Yarn模式部署_第4张图片

等待一会可以发现web ui界面正常显示,日志显示启动了一个新的leader
Flink on Yarn模式部署_第5张图片

三,测试

3.1 会话模式执行(yarn session)

YARN 的会话模式与独立集群略有不同,需要首先申请一个 YARN 会话(YARN session) 来启动 Flink 集群。

3.1.1 启动集群

执行脚本命令向 YARN 集群申请资源,开启一个 YARN 会话,启动 Flink 集群。

yarn-session.sh -nm test

可用参数解读:

  • -d:分离模式,如果你不想让 Flink YARN 客户端一直前台运行,可以使用这个参数,即使关掉当前对话窗口,YARN session 也可以后台运行。
  • -jm(--jobManagerMemory):配置 JobManager 所需内存,默认单位 MB。
  • -nm(--name):配置在 YARN UI 界面上显示的任务名。
  • -qu(--queue):指定 YARN 队列名。
  • -tm(--taskManager):配置每个 TaskManager 所使用内存。

注意:Flink1.11.0 版本不再使用-n 参数和-s 参数分别指定 TaskManager 数量和 slot 数量, YARN 会按照需求动态分配TaskManager 和 slot。所以从这个意义上讲,YARN 的会话模式也不会把集群资源固定,同样是动态分配的。

YARN Session 启动之后会给出一个web UI 地址以及一个 YARN application ID,如下所示,用户可以通过web UI 或者命令行两种方式提交作业。

2022-06-14 17:21:43,152 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - YARN application has been deployed successfully.
2022-06-14 17:21:43,153 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface n13hdp03:19264 of application 'application_1653635374037_0023'.
JobManager Web Interface: http://n13hdp03:19264

可以看到我们创建的 Yarn-Session 实际上是一个 Yarn 的Application,并且有唯一的Application ID。
Flink on Yarn模式部署_第6张图片

3.1.2 提交任务

执行以下命令将该任务提交到已经开启的 Yarn-Session 中运行。

flink run $FLINK_HOME/examples/streaming/TopSpeedWindowing.jar

Flink on Yarn模式部署_第7张图片
客户端可以自行确定 JobManager 的地址,也可以通过-m 或者-jobmanager 参数指定JobManager 的地址,JobManager 的地址在 YARN Session 的启动页面中可以找到。
任务提交成功后,可在 YARN 的Web UI 界面查看运行情况。
Flink on Yarn模式部署_第8张图片

从图中可以看到我们创建的 Yarn-Session 实际上是一个 Yarn 的Application,并且有唯一的Application ID。

也可以通过 Flink 的 Web UI 页面查看提交任务的运行情况
Flink on Yarn模式部署_第9张图片
此时再次提交一个任务

flink run /ywdsj/test/dfkafka.jar

Flink on Yarn模式部署_第10张图片

任务提交成功后,可在 YARN 的Web UI 界面查看运行情况。

Flink on Yarn模式部署_第11张图片
从图中可以看到我们提交的任务仍然是提交到 Yarn-Session上,这时 Flink 的 Web UI 页面可以看到有两个running job了

Flink on Yarn模式部署_第12张图片

3.2 单作业模式执行(Yarn Per-job)

3.2.1 介绍

在 YARN 环境中,由于有了外部平台做资源调度,所以我们也可以直接向 YARN 提交一个单独的作业,从而启动一个 Flink 集群。
Per-job Cluster模式将在YARN上启动一个Flink集群,然后运行本地提供的应用程序jar包,最后将JobGraph提交给YARN上的JobManager。如果你传递了–detached参数,一旦提交被接受,客户端将停止。

3.2.2 任务执行

执行命令提交作业

flink run -d -t yarn-per-job $FLINK_HOME/examples/streaming/TopSpeedWindowing.jar

早期版本也有另一种写法:

flink run -m yarn-cluster $FLINK_HOME/examples/streaming/TopSpeedWindowing.jar

注意这里是通过参数-m yarn-cluster指定向 YARN 集群提交任务。

在 YARN 的ResourceManager 界面查看执行情况,如图所示。

Flink on Yarn模式部署_第13张图片
点击可以打开 Flink Web UI 页面进行监控
Flink on Yarn模式部署_第14张图片
可以使用命令行查看作业

flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY

Flink on Yarn模式部署_第15张图片
取消作业

flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>

Flink on Yarn模式部署_第16张图片
这里的 application_XXXX_YY 是当前应用的 ID,是作业的 ID。注意如果取消作业,整个 Flink 集群也会停掉。

3.3 应用模式执行(yarn application)

应用模式同样非常简单,与单作业模式类似,直接执行 flink run-application 命令即可。

flink run-application -t yarn-application $FLINK_HOME/examples/streaming/TopSpeedWindowing.jar

在命令行中查看或取消作业

flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>

也可以通过yarn.provided.lib.dirs 配置选项指定位置,将 jar 上传到远程

flink run-application -t yarn-application -Dyarn.provided.lib.dirs="hdfs://mycluster/my-remote-flink-dist-dir" hdfs://mycluster/jars/my-application.jar

这种方式下 jar 可以预先上传到 HDFS,而不需要单独发送到集群,这就使得作业提交更加轻量了。

你可能感兴趣的:(flink,大数据,big,data,hadoop,flink)