Standalone Cluster HA
前面我们配置的 Standalone 集群实际上只有一个 JobManager,此时是存在单点故障的,所以官方提供了 Standalone Cluster HA 模式来实现集群高可用。
1. 前置条件
在 Standalone Cluster HA 模式下,集群可以由多个 JobManager,但只有一个处于 active 状态,其余的则处于备用状态,Flink 使用 ZooKeeper 来选举出 Active JobManager,并依赖其来提供一致性协调服务,所以需要预先安装 ZooKeeper 。
另外在高可用模式下,还需要使用分布式文件系统来持久化存储 JobManager 的元数据,最常用的就是 HDFS,所以 Hadoop 也需要预先安装。
使用该模式前,需要确保所有服务器间都已经配置好 SSH 免密登录服务。这里我以三台服务器为例,hadoop001,hadoop002,hadoop003。
2. 搭建步骤
角色分配:
主机名 | master | worker | 进程名 |
hadoop001 | √ | √ | StandaloneSessionClusterEntrypoint、TaskManagerRunner |
hadoop002 | √ | √ | StandaloneSessionClusterEntrypoint、TaskManagerRunner |
hadoop003 | √ | TaskManagerRunner |
Flink 所有版本的安装包可以直接从其官网进行下载,这里我下载的 Flink 的版本为 1.12.4
,要求的 JDK 版本为 1.8.x +
。 下载后解压到指定目录:
tar -zxvf flink-1.12.4-bin-scala_2.11.tgz -C /usr/apps
修改 conf/masters
文件,将 hadoop001 和 hadoop002 都配置为 master 节点:
hadoop001:8081
hadoop002:8081
修改 conf/workers
文件,将hadoop001、hadoop002和hadoop003配置为workers节点:
hadoop001
hadoop002
hadoop003
修改 conf/flink-conf.yaml
文件,增加如下配置:
//配置参数本机名
jobmanager.rpc.address: hadoop001
# 配置使用zookeeper来开启高可用模式
high-availability: zookeeper
# 配置zookeeper的地址,采用zookeeper集群时,可以使用逗号来分隔多个节点地址
high-availability.zookeeper.quorum: hadoop001:2181,hadoop002:2181,hadoop003:2181
# 在zookeeper上存储flink集群元信息的路径
high-availability.zookeeper.path.root: /flink
# 集群id
high-availability.cluster-id: /standalone_cluster_one
# 持久化存储JobManager元数据的地址,zookeeper上存储的只是指向该元数据的指针信息
high-availability.storageDir: hdfs://hadoop001:9000/flink/ha
#如果默认端口8081被占用,可以去更改默认端口为8082,同时masters的web端口也修改为8082
#rest.port: 8082
修改zoo.cfg如下,或将zookeeper/conf目录下的zoo.cfg复制到flink的conf目录下。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial synchronization phase can take
initLimit=10
# The number of ticks that can pass between sending a request and getting an acknowledgement
syncLimit=5
# The directory where the snapshot is stored.
# dataDir=/tmp/zookeeper
# The port at which the clients will connect
clientPort=2181
# ZooKeeper quorum peers
server.0=hadoop001:2888:3888
server.1=hadoop002:2888:3888
server.2=hadoop003:2888:3888
将配置好的 Flink 安装包分发到其他两台服务器上:
scp -r /usr/app/flink-1.12.4 hadoop002:/usr/apps
scp -r /usr/app/flink-1.12.4 hadoop003:/usr/apps
确保 Hadoop 和 ZooKeeper 已经启动后,在 hadoop001 上使用如下命令来启动集群:
bin/start-cluster.sh
此时输出如下:
//启动之后会显示如下日志信息
Starting HA cluster with 2 masters.
Starting standalonesession daemon on host hadoop001.
Starting standalonesession daemon on host hadoop002.
Starting taskexecutor daemon on host hadoop001.
Starting taskexecutor daemon on host hadoop002.
Starting taskexecutor daemon on host hadoop003.
可以看到集群已经以 HA 的模式启动,此时还需要在各个节点上使用 jps
命令来查看进程是否启动成功,正常情况如下:
//已经有了
$ jps
16596 NameNode
9959 ResourceManager
16888 SecondaryNameNode
17016 QuorumPeerMain
17976 Jps
10073 NodeManager
16698 DataNode
8349 StandaloneSessionClusterEntrypoint
8396 TaskManagerRunner
只有 hadoop001 和 hadoop002 的 JobManager 进程StandaloneSessionClusterEntrypoint,hadoop001、hadoop002 和 hadoop003 上的 TaskManager 进程TaskManagerRunner都已经完全启动,才表示 Standalone Cluster HA 模式搭建成功。
3. 常见异常
如果进程没有启动,可以通过查看 log
目录下的日志来定位错误,常见的一个错误如下:
2022-03-17 17:18:35,877 INFO org.apache.flink.runtime.entrypoint.ClusterEntrypoint
- Shutting StandaloneSessionClusterEntrypoint down with application status FAILED. Diagnostics
java.io.IOException: Could not create FileSystem for highly available storage (high-availability.storageDir)
.......
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file
system implementation for scheme 'hdfs'. The scheme is not directly supported by Flink and no
Hadoop file system to support this scheme could be loaded.
.....
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Hadoop is not in
the classpath/dependencies.
......
可以看到是因为在 classpath 目录下找不到 Hadoop 的相关依赖,此时需要检查是否在环境变量中配置了 Hadoop 的安装路径,如果路径已经配置但仍然存在上面的问题,可以从 Flink 官网下载对应版本的 Hadoop 组件包:
下载完成后,将该 JAR 包上传至所有 Flink 安装目录的 lib
目录,重新启动集群即可。
flink-conf.yaml参数说明:
参数 | 值 | 说明 |
jobmanager.rpc.address | centoshadoop1 | jobmanager所在节点 |
jobmanager.rpc.port | 6123 | jobManager端口,默认为6123 |
jobmanager.heap.size | 2048m | jobmanager可用内存 |
taskmanager.heap.size | 4096m | 每个TaskManager可用内存,根据集群情况指定 |
taskmanager.numberOfTaskSlots | 3 | 每个taskmanager的并行度(5以内) |
parallelism.default | 2 | 启动应用的默认并行度(该应用所使用总的CPU数) |
rest.port | 8081 | 如果Flink web UI默认端口与spark的端口8081冲突,更改为8082或其他没被占用的端口 |
访问web界面 http://hadoop001:8081 可以对 flink 集群和任务进行监控管理。