默认情况下,Flink 只有一个JobManager,这将导致单点故障,使用JobManager HA ,集群可以从单点故障中恢复,从而避免单点故障,我们可以在Standalone 或 Flink on Yarn 集群下配置Flink集群HA(高可用性)。而Flink on Yarn的高可用性其实主要是利用Yarn的任务恢复机制实现的。生产环境推荐使用Yarn。
首先,在集群运行时,可能会有很多的集群实例包括MapReduce、Spark、Flink等等,那么如果它们全基于on Yarn就可以完成资源分配,减少单个实例集群的维护,提高集群的利用率。
其次,Flink 是大数据计算框架,不是资源调度框架,这并不是它的强项;所以还是应该让专业的框架做专业的事,和其他资源调度框架集成更靠谱。而在目前大数据生态中,国内应用最为广泛的资源管理平台就是 YARN 了。在强大的 YARN 平台上 Flink 是如何集成部署的。整体来说,YARN 上部署的过程是:客户端把 Flink 应用提交给 Yarn 的 ResourceManager,Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器。在这些容器上,Flink 会部署JobManager 和 TaskManager 的实例,从而启动集群。Flink 会根据运行在 JobManger 上的作业所需要的 Slot 数量动态分配 TaskManager 资源。
而且,Flink on Yarn模式安装部署要做的其实不多,正常的步骤:上传二进制包 ,解压,更改文件名称,配置环境变量。
再有,Fink on Yarn 有两种内存管理模式。
内存集中管理模式:在Yarn中初始化一个Flink集群,开辟指定的资源,之后我们提交的Flink Jon都在这个Flink yarn-session中,也就是说不管提交多少个job,这些job都会共用开始时在yarn中申请的资源。这个Flink集群会常驻在Yarn集群中,除非手动停止。
内存Job管理模式【推荐使用】:在Yarn中,每次提交job都会创建一个新的Flink集群,任务之间相互独立,互不影响并且方便管理。任务执行完成之后创建的集群也会消失。
hadoop100,hadoop101,hadoop102,hadoop103,hadoop104 五台虚拟机(虚拟机配置见虚拟机环境搭建)及补充
登录root 用户,创建hadoop用户(useradd hadoop)
修改hadoop密码(passwd hadoop)
给hadoop用赋予root 权限
修改 /etc/passwd 文件,找到如下行,把用户ID修改为 0 ,如下所示:
admin:x:500:500:admin:/home/tommy:/bin/bash
改为:
admin:x:0:500:admin:/home/tommy:/bin/bash
[root@hadoop100 ~]# vi /etc/hostname
[root@hadoop100 ~]# vi /etc/hosts
免密登录参考
[root@hadoop100 ~]# systemctl disable firewalld
[root@hadoop100 ~]# chkconfig iptables off
规划安装目录:/home/hadoop/apps
规划数据目录:/home/hadoop/data
注:apps和data文件夹需要自己单独创建
https://www.oracle.com/java/technologies/downloads/#java8
下载 jdk-8u371-linux-x64.tar.gz
将安装包上传到hadoop100 /home/hadoop/apps 目录下,没有则创建它。
解压
[root@hadoop100 apps]# tar -zxvf jdk-8u371-linux-x64.tar.gz
改名
[root@hadoop100 apps]# mv jdk1.8.0_371 jdk1.8
配置JAVA_HOME
[root@hadoop100 apps]# vi /etc/profile
末尾加上
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
[root@hadoop100 apps]# source /etc/profile
[root@hadoop100 apps]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
分发该目录到其它四个节点并让环境生效
[root@hadoop100 apps]# scp -r /home/hadoop/apps/ hadoop101:/home/hadoop/apps/
[root@hadoop100 apps]# scp -r /etc/profile hadoop101:/etc/
[root@hadoop101 ~]# source /etc/profile
Hadoop 节点:hadoop100,hadoop101,hadoop102
下载地址 https://hadoop.apache.org/releases.html
Binary 已编辑好 ,source 需要编辑
将 hadoop-2.10.1.tar.gz 拷贝到 app 目录下,hadoop用户
解压
[root@hadoop100 apps]# tar -zxvf hadoop-2.10.1.tar.gz
[root@hadoop100 apps]# cd hadoop-2.10.1/etc/hadoop/
配置hadoop-env.sh
[root@hadoop100 hadoop]# vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export HADOOP_LOG_DIR=/home/hadoop/data/hadoop_repo/logs/hadoop
配置yarn-env.sh
[root@hadoop100 hadoop]# vi yarn-env.sh
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export YARN_LOG_DIR=/home/hadoop/data/hadoop_repo/logs/yarn
配置core-site.xml
[root@hadoop100 hadoop]# vi core-site.xml
fs.defaultFS</name>
hdfs://hadoop100:9000</value>
</property>
hadoop.tmp.dir</name>
/home/hadoop/data/hadoop_repo</value>
</property>
</configuration>
配置hdfs-site.xml
[root@hadoop100 hadoop]# vi hdfs-site.xml
dfs.replication</name>
2</value>
HDFS 的数据块的副本存储个数, 默认是3</description>
</property>
dfs.secondary.http.address</name>
hadoop100:50090</value>
secondarynamenode 运行节点的信息,和 namenode 不同节点</description>
</property>
</configuration>
配置 yarn-site.xml
[root@hadoop100 hadoop]# vi yarn-site.xml
yarn.resourcemanager.hostname</name>
hadoop100</value>
</property>
yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
YARN 集群为 MapReduce 程序提供的 shuffle 服务</description>
</property>
</configuration>
配置mapred-site.xml
改名
[root@hadoop100 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@hadoop100 hadoop]# vi mapred-site.xml
mapreduce.framework.name</name>
yarn</value>
</property>
</configuration>
配置slaves
[root@hadoop100 hadoop]# vi slaves
hadoop101
hadoop102
将hadoop100上修改的后的Hadoop安装目录复制到其它两个节点hadoop101,hadoop102
[root@hadoop100 apps]# scp -r hadoop-2.10.1 hadoop101:/home/hadoop/apps/
在hadoop100 上进行格式化
在 /home/hadoop/apps/hadoop-2.10.1目录下
[root@hadoop100 hadoop-2.10.1]# bin/hdfs namenode -format
[root@hadoop100 hadoop-2.10.1]# sbin/start-all.sh
[root@hadoop100 hadoop-2.10.1]# jps
7248 NameNode
7444 SecondaryNameNode
7597 ResourceManager
7869 Jps
[root@hadoop101 hadoop]# jps
7204 Jps
6667 DataNode
7080 NodeManager
[root@hadoop102 hadoop]# jps
6697 DataNode
6810 NodeManager
6942 Jps
为了后面操作方便,配置hadoop100 的HADOOP_HOME
在前面JAVA_HOME基础上添加
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.10.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
在hadoop100、hadoop101 、hadoop102配置ZooKeeper集群
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz
需要下载bin包, apache-zookeeper-3.8.1-bin.tar.gz
hadoop用户登录(已有root权限)
[root@hadoop100 apps]# tar -zxvf apache-zookeeper-3.8.1-bin.tar.gz
文件更名
[root@hadoop100 apps]# mv apache-zookeeper-3.8.1-bin zookeeper-3.8.1
配置文件更名
[root@hadoop100 apps]# cd apache-zookeeper-3.8.1-bin/conf
[root@hadoop100 conf]# mv zoo_sample.cfg zoo.cfg
配置zoo.cfg
没有data,log目录创建,注:端口后面不能有空格
dataDir=/home/hadoop/apps/zookeeper-3.8.1/data
dataLogDir=/home/hadoop/apps/zookeeper-3.8.1/log
server.1=hadoop100:2888:3888
server.2=hadoop101:2888:3888
server.3=hadoop102:2888:3888
创建myid文件,并在文件中输入数字0
进入data目录
[root@hadoop100 data]# vi myid
1
为方便管理,在hadoop100上添加zookeeper环境变量(在前面环境变量基础上)
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.10.1
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.8.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
环境变量生效
[root@hadoop100 apps]# source /etc/profile
将配置好的安装包复制到hadoop101,hadoop102节点
[root@hadoop100 apps]# scp -r zookeeper-3.8.1/ hadoop101:/home/hadoop/apps/
修改hadoop101,hadoop102节点上的myid
分别为 2和3
将修改好的环境变量文件分发到hadoop101,hadoop102
注意:改集群环境变量为专用,如果安装有其它应用,小心环境变量被覆盖,就只能单独修改
[root@hadoop100 apps]# scp /etc/profile hadoop101:/etc/
source 让hadoop101,hadoop102上环境变量生效
分别在hadoop100、hadoop101、hadoop102启动ZooKeeper
[root@hadoop100 apps]# zkServer.sh start
5040 SecondaryNameNode
6914 QuorumPeerMain
6949 Jps
4838 NameNode
5196 ResourceManager
看到QuorumPeerMain进程表示启动成功
[root@hadoop100 conf]# zkServer.sh status
分别在三台主机上查看,发现
ZooKeeper 有一个 leader,两个 follower 节点
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集群相互影响
我们先对hadoop100 中 yarn-site.xml 设置提交应用程序的最大尝试次数,设置不检查虚拟内存的值,不然内存不够会报错
在/home/hadoop/apps/hadoop-2.10.1/etc/hadoop目录下
[root@hadoop100 hadoop]# vi yarn-site.xml
yarn.resourcemanager.am.max-attempts</name>
4</value>
The maximum number of application master execution attempts.
</description>
</property>
<!-- 设置不检查虚拟内存的值,不然内存不够会报错 -->
yarn.nodemanager.pmem-check-enabled</name>
false</value>
</property>
yarn.nodemanager.vmem-check-enabled</name>
false</value>
</property>
将修改后的配置文件分发到hadoop101、hadoop102
[root@hadoop100 hadoop]# scp yarn-site.xml hadoop101:/home/hadoop/apps/hadoop-2.10.1/etc/hadoop/
重启hadoop及zookeeper集群
https://www.apache.org/dyn/closer.lua/flink/flink-1.17.0/flink-1.17.0-bin-scala_2.12.tgz
首先在hadoop100上解压一份新的Flink安装包
[root@BIGDATA ~] tar -zxvf flink-1.17.0-bin-scala_2.12.tgz
[root@BIGDATA ~]cd flink-1.17.0/
在前面基础上增加环境变量
[root@hadoop100 apps]# vi /etc/profile
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.10.1
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.8.1
export HADOOP_CLASSPATH=`hadoop classpath`
export FLINK_HOME=/home/hadoop/apps/flink-1.17.0export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$FLINK_HOME/bin
环境生效
[root@hadoop100 apps]# source /etc/profile
配置flink-conf.yaml
[root@hadoop100 conf]# vi flink-conf.yaml
high-availability.type: zookeeper
# JobManager元数据保留在文件系统storageDir中 指向此状态的指针存储在ZooKeeper中
high-availability.storageDir: hdfs://hadoop100:9000/flink/ha-yarn
#
# # Zookeeper集群 修改自己的集群
high-availability.zookeeper.quorum: hadoop100:2181,hadoop101:2181
#
# # 在zookeeper下的根目录
high-availability.zookeeper.path.root: /flink_yarn
#
# # zookeeper节点下的集群ID 该节点下放置了集群所需的所有协调数据 多个flink集群连接同一套zookeeper集群需要配置各自不同的集群ID,官方建议这个配置最好去掉,因为在 Yarn(以及Mesos)模式下,cluster-id 如果不配置的话,会配置成 Yarn 上的 Application ID ,从而可以保证唯一性。 (不配,如果配的话,启动两个及以上job会报错)
#high-availability.cluster-id: /default_yarn
#
# # 单个flink job重启次数 必须小于等于yarn-site.xml中Application Master配置的尝试次数
yarn.application-attempts: 4
#
#如果 ZooKeeper 在 Kerberos 的安全模式下运行
#
## default is "zookeeper". If the ZooKeeper quorum is configured
## with a different service name then it can be supplied here.
#
#zookeeper.sasl.service-name: zookeeper
#
## default is "Client". The value needs to match one of the values
## configured in "security.kerberos.login.contexts".
#zookeeper.sasl.login-context-name: Client
在前面环境变量基础上添加
export HADOOP_CLASSPATH=`hadoop classpath`
[root@hadoop100 ~]# vi /etc/profile
export HADOOP_CLASSPATH=`hadoop classpath`
export JAVA_HOME=/home/hadoop/apps/jdk1.8
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.10.1
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.8.1
export HADOOP_CLASSPATH=`hadoop classpath`
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
分配置完的解压包 发到hadoop101、hadoop102
在yarn上启动一个Flink主要有两种方式:
启动一个Yarn session(在yarn集群内部初始化一个Flink集群常驻,一直运行)
直接在yarn上提交运行Flink作业(每次提交一个job到yarn集群,yarn集群开辟资源初始化一个Flink集合)
Flink提供了yarn上运行的3模式,分别为Application Mode(1.12), Session-Cluster和Per-Job-Cluster模式。
Application Mode会在Yarn上启动集群, 应用jar包的main函数(用户类的main函数)将会在JobManager上执行. 只要应用程序执行结束, Flink集群会马上被关闭. 也可以手动停止集群。与Per-Job-Cluster的区别: 就是Application Mode下, 用户的main函数是在集群中(job manager)执行的。
官方建议:
出于生产的需求, 我们建议使用Per-job or Application Mode,因为他们给应用提供了更好的隔离!
一个Job会对应一个Flink集群,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。每次提交都会创建一个新的flink集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。
Yarn模式的高可用和Standalone模式的高可用原理不一样.
Standalone模式中, 同时启动多个Jobmanager, 一个为leader其他为standby, 当leader挂了, 其他的才会有一个成为leader。
yarn的高可用是同时只启动一个Jobmanager, 当这个Jobmanager挂了之后, yarn会再次启动一个, 其实是利用的yarn的重试次数来实现的高可用。
在hadoop100上启动Flink on yarn HA集群
在/home/hadoop/apps/flink-1.17.0目录下
[root@hadoop100 flink-1.17.0]# bin/yarn-session.sh -n 2
http://192.168.220.100:8088/cluster
https://blog.51cto.com/u_12902538/5394081
https://blog.csdn.net/wuxintdrh/article/details/106885847