简介:Apache Flink 是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行,以任意规模和内存级速度执行计算。
实现了Flink支持多种部署方式local,standalone,yarn以及k8s,现在大多数企业因为大数据平台都以yarn作为资源管理器,所以为了方便管理,很多企业选择了Flink on yarn这种集群部署模式。下面重点介绍现阶段Flink on yarn在企业中的部署实践。
1.目的
从官网文件了解到,Flink的常用部署模式主要有Standalone、Native Kubernetes和Yarn三种模式,本篇文章着重介绍Yarn模式的集群部署和测试过程。
2.软件需求
| 软件名称 | 版本 | 说明 |
|---|---|---|
| Java | 1.8.X | 或更高版本(64位) |
| Flink | 1.14.3 | 其他版本未测试 |
| Hadoop | 2.10.1 | 长期稳定版 |
| Zookeeper | 3.6.2 | 其他版本未测试 |
| Centos | 7.5 | 64位操作系统 |
本文是在以上软件环境的版本下测试完成的,由于软件版本的差异可能会导致组件兼容性问题,如果集群启动失败,可以根据Flink启动日志查找解决方案。
3.服务器规划
本次测试的分布式环境为:Master 1台,worker 1台
| Host Name | IP Address | Node Type | User Name | 配置 |
|---|---|---|---|---|
| master | 192.168.100.148 | StandaloneSessionClusterEntrypoint/TaskManagerRunner/QuorumPeerMain | root/root | 8C/8G |
| worker | 192.168.100.149 | TaskManagerRunner/QuorumPeerMain | root/root | 8C/8G |
4.安装步骤
安装测试环境需要基于Yarn,所以我们要首先搭建Hadoop环境,可参考另一篇文章hadoop分布式集群测试环境搭建,严格安装步骤完成后可继续Flink集群配置。
在flink的压缩包中,已经包含了zookeeper运行环境,只需要配置conf/zoo.cfg就可启动zookeeper服务以了。我们使用的是从zookeeper官网单独下载的压缩包,具体安装配置过程如下。
4.1安装Zookeeper
虽然Flink on YARN的HA利用了YARN的任务恢复机制,但我们这里也需要利用到Zookeeper恢复机制,主要是因为Flink ON YARN的虽然依赖YARN的任务恢复机制,但是Flink任务在恢复时,需要依赖检查点产生的快照,而这些快照虽然配置在HDFS上,但是其元数据信息保存在Zookeeper中,所有我们还需要首先配置Zookeeper的信息。
4.1.1解压zookeeper
[root@dbus-n2 soft]# tar -xvf apache-zookeeper-3.6.2-bin.tar.gz -C /opt/zookeeper-3.6.2
[root@dbus-n2 opt]# cd /opt/zookeeper-3.6.2/
[root@dbus-n2 zookeeper-3.6.2]# ll
total 8
drwxr-xr-x 2 1000 1000 161 Feb 16 16:17 bin
drwxr-xr-x 2 1000 1000 70 Feb 22 14:11 conf
drwxr-xr-x 3 root root 63 Feb 22 14:13 data
drwxr-xr-x 5 1000 1000 4096 Sep 4 2020 docs
drwxr-xr-x 2 root root 4096 Feb 16 15:26 lib
drwxr-xr-x 3 root root 91 Feb 22 14:10 logs
[root@dbus-n2 zookeeper-3.6.2]#
4.1.2配置zoo.cfg
在zookeeper目录下的conf目录中,打开zoo.cfg配置文件,修改如下参数
dataDir=/opt/zookeeper-3.6.2/data #数据目录,如果没有进行创建
dataLogDir=/opt/zookeeper-3.6.2/logs #日志目录,如果没有用mkdir进行创建
server.1=dbus-n2:2888:3888
server.2=dbus-n3:2888:3888
- tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime
- dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
- client:监听客户端连接的端口。
- initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
- syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
- server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址;
C:Zookeeper服务器之间的通信端口;
D:Leader选举的端口。
我们需要修改的第一个是 dataDir,在指定的位置处创建好目录。
第二个需要新增的是 server.A=B:C:D 配置,其中 A 对应下面我们即将介绍的myid 文件。B是集群的各个IP地址,C:D 是端口配置
4.1.3分发zookeeper目录至其他节点
[root@dbus-n2 opt]# scp -r zookeeper-3.6.2 root@dbus-n3:/opt/
通过scp命令将配置好的zk分发到dbus-n2服务器节点
4.1.4启动zookeeper
[root@dbus-n3 zookeeper-3.6.2]# ./bin/zkServer.sh start
这里注意,zookeeper每个节点都需要单独启动,启动完成后,查看启动日志,验证服务是否正常,也可以通过命令,查看节点服务状态。
[root@dbus-n2 zookeeper-3.6.2]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@dbus-n3 zookeeper-3.6.2]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
从查看状态的结果来看,dbus-n3为leader,dbus-n2为follower。同事jps命令下多了一个进程
[root@dbus-n3 zookeeper-3.6.2]# jps
1767 QuorumPeerMain
4.2安装Flink
4.2.1解压Flink安装包
[root@dbus-n2 soft]# tar -xvf flink-1.14.3-bin-scala_2.11.tgz -C /opt/
[root@dbus-n2 soft]# cd /opt/flink-1.14.3/
[root@dbus-n2 flink-1.14.3]# ll
total 16
drwxr-xr-x 2 501 games 4096 Feb 22 09:46 bin
drwxr-xr-x 2 501 games 263 Feb 22 14:20 conf
drwxr-xr-x 7 501 games 76 Feb 22 09:46 examples
drwxr-xr-x 2 501 games 4096 Feb 22 10:10 lib
drwxr-xr-x 2 501 games 4096 Feb 22 09:46 licenses
drwxr-xr-x 2 501 games 285 Feb 22 14:56 log
drwxr-xr-x 3 501 games 4096 Feb 22 09:46 opt
drwxr-xr-x 10 501 games 210 Feb 22 09:46 plugins
4.2.2修改配置文件flink-conf.yaml
进入解压目录,在conf中找到并修改flink-conf.yaml文件。
[root@dbus-n2 conf]# cd /opt/flink-1.14.3/
[root@dbus-n2 flink-1.14.3]# vim ./conf/flink-conf.yaml
修改内如如下
#==============================================================================
# Common
#==============================================================================
# 主节点名称
jobmanager.rpc.address: dbus-n2
# 每个机器可用的CPU数量
taskmanager.numberOfTaskSlots: 2
# 集群中总的CPU数量
parallelism.default: 2
#==============================================================================
# High Availability
#==============================================================================
# 配置使用zookeeper来开启高可用模式
high-availability: zookeeper
# 存储jobManager元数据地址,zookeeper上存储的只是指向元数据的指针信息,需要提前在hadoop上创建/flinkshare/ha/
high-availability.storageDir: hdfs://dbus-n2:9000/flinkshare/ha/
# 配置zookeeper的地址,采用zookeeper集群时,可以使用逗号来分隔多个节点地址
high-availability.zookeeper.quorum: dbus-n2:2181,dbus-n3:2181
#==============================================================================
# Fault tolerance and checkpointing
#==============================================================================
# hdfs文件系统
state.backend: filesystem
# 在hadoop上创建好目录/flinkshare/checkpoints
state.checkpoints.dir: hdfs://dbus-n2:9000/flinkshare/checkpoints
# 在hadoop上创建好目录/flinkshare/savepoints
state.savepoints.dir: hdfs://dbus-n2:9000/flinkshare/savepoints
jobmanager.execution.failover-strategy: region
4.2.3master和workers配置
修改conf目录下的master,将localhost修改为主机名称
[root@dbus-n2 conf]# vim masters
dbus-n2:8082
修改conf目录下的worker是, 增加各个节点名称
[root@dbus-n2 conf]# vim workers
dbus-n2
dbus-n3
4.2.4上传hadoop依赖包
作业归档需要记录在hdfs上,但是当前版本的flink把hadoop的一些依赖删除了,需要手动将jar包放到lib目录下 ,这里我用的是flink-shaded-hadoop-2-uber-2.7.5-8.0.jar和flink-shaded-zookeeper-3.4.14.jar
4.2.5配置环境变量
[root@dbus-n2 lib]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0
export HADOOP_HOME=/opt/hadoop-2.10.1
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_CLASSPATH='hadoop classpath'
export FLINK_HOME=/opt/flink-1.14.3
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$FLINK_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
通过source或 . 命令使环境变量生效
[root@dbus-n2 lib]# source /etc/profile
4.2.5分发配置
将配置好的flink目录和环境变量配置文件通过scp上传至其他节点。
[root@dbus-n2 opt]# scp -r flink-1.14.3 root@dbus-n3:/opt/
[root@dbus-n2 opt]# scp -r /etc/profile root@dbus-n3:/etc
[root@dbus-n2 opt]# ssh dbus-n3
Last login: Fri Feb 25 17:30:57 2022 from 192.168.10.42
[root@dbus-n3 ~]# . /etc/profile
注意:通过ssh免密登陆到dbus-n3后,让profile文件生效。
5.启动集群
接下来介绍整个集群的启动过程,如果有的集群已经启动,可以跳过。
5.1启动hadoop集群
在master节点上运行如下命令,启动hadoop集群。
[root@dbus-n2 sbin]# start-dfs.sh
[root@dbus-n2 sbin]# start-yarn.sh
创建hadoop目录
[root@dbus-n2 sbin]# hdfs dfs -mkdir -p /flinkshare/ha/
[root@dbus-n2 sbin]# hdfs dfs -mkdir -p /flinkshare/checkpoints
[root@dbus-n2 sbin]# hdfs dfs -mkdir -p /flinkshare/savepoints
5.2启动zookeeper集群
在每个zookeeper节点运行如下命令,启动集群
[root@dbus-n2 zookeeper-3.6.2]# ./bin/zkServer.sh start
5.3启动Flink集群
在master主节点上通过如下命令启动Flink集群。
[root@dbus-n2 flink-1.14.3]# ./bin/start-cluster.sh
5.4查看集群信息
5.4.1JPS进程查看集群启动
master主节点dbus-n2,通过JPS进程查看
[root@dbus-n2 opt]# jps
8785 Bootstrap
20354 Jps
21731 TaskManagerRunner
23428 SecondaryNameNode
21434 StandaloneSessionClusterEntrypoint
23210 NameNode
13166 QuorumPeerMain
23614 ResourceManager
分支节点dbus-n3,通过JPS进程查看
[root@dbus-n3 opt]# jps
3584 DataNode
3315 TaskManagerRunner
1767 QuorumPeerMain
27339 Jps
3711 NodeManager
5.4.2WEB UI查看Flink集群
在浏览器中输入http://masterIP:8082 回车后,可以看到flink任务管理器页面
5.4.3执行测试任务
使用flink安装目录下的example中的示例程序,测试集群的运行。
[root@dbus-n2 flink-1.14.3]# ./bin/flink run examples/batch/WordCount.jar --input /opt/tmp/words --output /opt/tmp/test1.txt
Job has been submitted with JobID 1de01b47b34c7fc6f4266cd0ac1437c5
Program execution finished
Job with JobID 1de01b47b34c7fc6f4266cd0ac1437c5 has finished.
Job Runtime: 834 ms
--input为flink测试示例的输入参数
--output为flink测试示例的输出参数
测试的输入输出参数也可以从hadoop文件系统中获取,如:
--input hdfs://dbus-n2:9000/user/root/test/LICENSE --output hdfs://dbus-n2:9000/user/root/test/result2.txt
6.Flink on yarn模式
前面五步主要介绍的是flink的standalone集群模式,接下来我们介绍介绍yarn模式运行Flink应用及测试过程。
6.1配置yarn环境
在hadoop安装目录下,找到配置文件目录中的mapred-site.xml和yarn-site.xml文件,分别加入如下配置。
6.1.1配置mapred-site.xml
[root@dbus-n2 hadoop-2.10.1]# vim etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定Hadoop的MapReduce运行在YARN环境 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6.1.2配置yarn-site.xml
[root@dbus-n2 hadoop-2.10.1]# vim etc/hadoop/yarn-site.xml
<configuration>
<!-- NodeManager获取数据方式:shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定YARN的master节点( ResourceManager) 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>dbus-n2</value>
</property>
<!--关闭nm的虚拟内存检测-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
6.1.3启动yarn
修改完配置后可以通过scp命令将配置文件同步到远程hadoop集群的其他节点,如本示例中的dbus-n3
[...]# scp -r ./etc/hadoop/mapred-site.xml root@dbus-n3:/opt/hadoop-2.10.1/etc/hadoop/
[...]# scp -r ./etc/hadoop/yarn-site.xml root@dbus-n3:/opt/hadoop-2.10.1/etc/hadoop/
运行hadoop安装目录sbin/start-yarn.sh 来启动yarn环境,如果修改配置文件之前已经启动,需要先运行stop-yarn.sh 停止yarn 然后再次启动,使配置文件生效。
6.1.4查看yarn
可以通过http://masterIP:8088 访问yarn或者resource manager,如下图
7.测试及结果
Flink on yarn的运行模式有两种,具体的原理和详细测试验证过程请移步Flink on yarn模式及测试过程。 在命令行输入如下
[root@dbus-n2 flink-1.14.3]# ./bin/flink run -m yarn-cluster -ys 2 -ynm ka examples/batch/WordCount.jar --input /opt/tmp/words --output /opt/tmp/test
部分运行成功的日志如下所示
可以从上面运行日志信息中看到ID为application_1645513746988_0003的Yran任务
运行完成后,我们可以看到结果如下