以前在 《从0到1学习Flink》—— Flink 配置文件详解 讲过 Flink 的配置,可是后面陆续有人来问我一些配置相关的东西,在加上我如今对 Flink 也更熟悉了些,这里我就再写下 Flink JobManager 的配置相关信息。服务器
在 《从0到1学习Flink》—— Apache Flink 介绍 一文中介绍过了 Flink Job 的运行架构图:session
JobManager 协调每一个 Flink 做业的部署。它负责调度和资源管理。架构
默认状况下,每一个 Flink 集群都有一个 JobManager 实例。这会产生单点故障(SPOF):若是 JobManager 崩溃,则没法提交新做业且运行中的做业也会失败。app
若是咱们使用 JobManager 高可用模式,能够避免这个问题。您能够为 standalone 集群和 YARN 集群配置高可用模式。jsp
standalone 集群的 JobManager 高可用性的概念是,任什么时候候都有一个主 JobManager 和 多个备 JobManagers,以便在主节点失败时有新的 JobNamager 接管集群。这样就保证了没有单点故障,一旦备 JobManager 接管集群,做业就能够依旧正常运行。主备 JobManager 实例之间没有明确的区别。每一个 JobManager 均可以充当主备节点。分布式
例如,请考虑如下三个 JobManager 实例的设置:学习
要启用 JobManager 高可用性功能,您必须将高可用性模式设置为 zookeeper,配置 ZooKeeper quorum,将全部 JobManagers 主机及其 Web UI 端口写入配置文件。spa
Flink 利用 ZooKeeper 在全部正在运行的 JobManager 实例之间进行分布式协调。ZooKeeper 是独立于 Flink 的服务,经过 leader 选举和轻量级一致性状态存储提供高可靠的分布式协调服务。Flink 包含用于 Bootstrap ZooKeeper 安装的脚本。
他在咱们的 Flink 安装路径下面 /conf/zoo.cfg 。指针
要启动 HA 集群,请在如下位置配置 Masters 文件 conf/masters:server
1 2 |
localhost:8081 xxx.xxx.xxx.xxx:8081 |
masters 文件包含启动 JobManagers 的全部主机以及 Web 用户界面绑定的端口,上面一行写一个。
默认状况下,job manager 选一个随机端口做为进程通讯端口。您能够经过 high-availability.jobmanager.port 更改此设置。此配置接受单个端口(例如 50010),范围(50000-50025)或二者的组合(50010,50011,50020-50025,50050-50075)。
要启动 HA 集群,请将如下配置键添加到 conf/flink-conf.yaml:
高可用性模式(必需):在 conf/flink-conf.yaml中,必须将高可用性模式设置为 zookeeper,以打开高可用模式。
1 |
high-availability: zookeeper |
ZooKeeper quorum(必需):ZooKeeper quorum 是一组 ZooKeeper 服务器,它提供分布式协调服务。
1 |
high-availability.zookeeper.quorum: ip1:2181 [,...],ip2:2181 |
每一个 ip:port 都是一个 ZooKeeper 服务器的 ip 及其端口,Flink 能够经过指定的地址和端口访问 zookeeper。
另外就是高可用存储目录,JobManager 元数据保存在文件系统 storageDir 中,在 ZooKeeper 中仅保存了指向此状态的指针, 推荐这个目录是 HDFS, S3, Ceph, nfs 等,该 storageDir 中保存了 JobManager 恢复状态须要的全部元数据。
1 |
high-availability.storageDir: hdfs:///flink/ha/ |
配置 master 文件和 ZooKeeper 配置后,您可使用提供的集群启动脚本。他们将启动 HA 集群。请注意,启动 Flink HA 集群前,必须启动 Zookeeper 集群,并确保为要启动的每一个 HA 集群配置单独的 ZooKeeper 根路径。
具备 2 个 JobManagers 的 Standalone 集群:
一、在 conf/flink-conf.yaml 中配置高可用模式和 Zookeeper :
1 2 3 |
high-availability: zookeeper high-availability.zookeeper.quorum: localhost:2181 high-availability.storageDir: hdfs:///flink/recovery |
二、在 conf/masters 中 配置 masters:
1 2 |
localhost:8081 localhost:8082 |
三、在 conf/zoo.cfg 中配置 Zookeeper 服务:
1 |
server.0=localhost:2888:3888 |
四、启动 ZooKeeper 集群:
1 2 |
$ bin/start-zookeeper-quorum.sh Starting zookeeper daemon on host localhost. |
五、启动一个 Flink HA 集群:
1 2 3 4 5 |
$ bin/start-cluster.sh Starting HA cluster with 2 masters and 1 peers in ZooKeeper quorum. Starting jobmanager daemon on host localhost. Starting jobmanager daemon on host localhost. Starting taskmanager daemon on host localhost. |
六、中止 ZooKeeper 和集群:
1 2 3 4 5 6 7 |
$ bin/stop-cluster.sh Stopping taskmanager daemon (pid: 7647) on localhost. Stopping jobmanager daemon (pid: 7495) on host localhost. Stopping jobmanager daemon (pid: 7349) on host localhost. $ bin/stop-zookeeper-quorum.sh Stopping zookeeper daemon (pid: 7101) on host localhost. |
上面的执行脚本以下图可见:
当运行高可用的 YARN 集群时,咱们不会运行多个 JobManager 实例,而只会运行一个,该 JobManager 实例失败时,YARN 会将其从新启动。Yarn 的具体行为取决于您使用的 YARN 版本。
在 YARN 配置文件 yarn-site.xml 中,须要配置 application master 的最大重试次数:
1 2 3 4 5 6 7 |
<property> <name>yarn.resourcemanager.am.max-attempts</name> <value>4</value> <description> The maximum number of application master execution attempts. </description> </property> |
当前 YARN 版本的默认值为 2(表示容许单个 JobManager 失败两次)。
除了上面能够配置最大重试次数外,你还能够在 flink-conf.yaml 配置以下:
1 |
yarn.application-attempts: 10 |
这意味着在若是程序启动失败,YARN 会再重试 9 次(9 次重试 + 1 次启动),若是启动 10 次做业还失败,yarn 才会将该任务的状态置为失败。若是由于节点硬件故障或重启,NodeManager 从新同步等操做,须要 YARN 继续尝试启动应用。这些重启尝试不计入 yarn.application-attempts 个数中。
一、配置 HA 模式和 Zookeeper 集群 在 conf/flink-conf.yaml:
1 2 3 |
high-availability: zookeeper high-availability.zookeeper.quorum: localhost:2181 yarn.application-attempts: 10 |
二、配置 ZooKeeper 服务 在 conf/zoo.cfg:
1 |
server.0=localhost:2888:3888 |
三、启动 Zookeeper 集群:
1 2 |
$ bin/start-zookeeper-quorum.sh Starting zookeeper daemon on host localhost. |
四、启动 HA 集群:
1 |
$ bin/yarn-session.sh -n 2 |
本篇文章再次写了下 Flink JobManager 的高可用配置,如何在 standalone 集群和 YARN 集群中配置高可用。