原文:
https://ci.apache.org/projects/flink/flink-docs-release-1.9/zh/ops/jobmanager_high_availability.html#overview
JobManager高可用(HA)
概述
JobManager协调每个Flink部署。他负责调度和资源管理。
默认情况下,每个Flink cluster有一个JobManager。这将会导致单点故障(SPOF):在JobManager宕机的情况下,没有新的程序可以被提交且正在运行的程序将会失败。
通过JobManager的高可用,你可以从JobManager的失败状态恢复,因此而解决SPOF问题。可以在standalone和YARN两种环境下部署高可用。
standalone cluster高可用
standalone cluster中JobManager的高可用大致方案为在任一时刻有一个leading JobManager,多个standby JobManager。当leader JobManager宕机,standby manager将会重新选举。这就保证了不会出现单点故障,并且一旦备用JobManager接管了工作,程序就可以继续运行。备用和主JobManager实例之间没有明显的区别。每个JobManager可以充当主服务器或备用服务器。
举个例子,考虑在三个JobManager实例的情况下:
配置
为了激活JobManager的高可用,用户需要设置high-availability 模式为zookeeper,配置一个zookeeper选举人数以及在masters文件中配置所有的JobManager地址以及他们的web ui端口。
Flink通过zookeeper保证所有运行的JobManager实例之间的分布式协作。Zookeeper是一个独立的服务,通过leader选举以及轻量级状态存储来提供高可依赖的分布式协作功能。Flink包含了启动一个简单zookeeper的脚本。
Masters 文件(masters)
通过配置 conf/masters下的masters文件开启HA-cluster:
- masters file:masters 文件包括启动了JobManager所有的主机,以及用户访问的web端口。
jobManagerAddress1:webUIPort1
[...]
jobManagerAddressX:webUIPortX
默认情况下,JobManager将会选择一个随机端口进行进程间的通信。用户可以通过high-availability.jobmanager.port改变这个端口。这个字段可以配置单个端口(比如50010),范围端口(比如50000-50025),或者两者的组合(50010,50011,50020-50025,50050-50075)
config配置文件(flink-conf.yaml)
通过配置conf/flink-conf.yaml,实现高可用集群:
- high-availability模式(必须):high-availability模式需要在conf/flink-conf.yaml文件中配置成zookeeper。
high-availability: zookeeper
- ZooKeeper quorum(必须):一个zookeeper quorum就是zookeeper服务器的一个复制,提供分布式协作服务。
high-availability.zookeeper.quorum: address1:2181[,...],addressX:2181
- ZooKeeper root (推荐):zookeeper节点的根目录。
high-availability.zookeeper.path.root: /flink
- ZooKeeper cluster-id(推荐):
high-availability.cluster-id: /default_ns # important: customize per cluster
注意:在yarn上不要设置此属性。
- Storage directory(必须):JobManager的元数据在文件系统路径下存储。zookeeper只是维护了一个状态信息。
high-availability.storageDir: hdfs:///flink/recovery
storageDir存放了恢复出错JobManager所需要的元数据。
在完成了masters以及zookeeper quorum的配置后,用户可以使用cluster启动脚本启动Flink。这些脚本将会启动一个高可用集群。记住在你调用脚本之前需要保证zookeeper quorum已经在运行。同时也需要保证每个HA cluster在zookeeper上都有一个独立的根目录。
Example: Standalone Cluster with 2 JobManagers
- Configure high availability mode and ZooKeeper quorum in conf/flink-conf.yaml:
high-availability: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.zookeeper.path.root: /flink
high-availability.cluster-id: /cluster_one # important: customize per cluster
high-availability.storageDir: hdfs:///flink/recovery
- Configure masters in conf/masters:
localhost:8081
localhost:8082
- Configure ZooKeeper server in conf/zoo.cfg (currently it’s only possible to run a single ZooKeeper server per machine):
server.0=localhost:2888:3888
- Start ZooKeeper quorum:
$ bin/start-zookeeper-quorum.sh
Starting zookeeper daemon on host localhost.
- Start an HA-cluster:
$ bin/start-cluster.sh
Starting HA cluster with 2 masters and 1 peers in ZooKeeper quorum.
Starting standalonesession daemon on host localhost.
Starting standalonesession daemon on host localhost.
Starting taskexecutor daemon on host localhost.
- Stop ZooKeeper quorum and cluster:
$ bin/stop-cluster.sh
Stopping taskexecutor daemon (pid: 7647) on localhost.
Stopping standalonesession daemon (pid: 7495) on host localhost.
Stopping standalonesession daemon (pid: 7349) on host localhost.
$ bin/stop-zookeeper-quorum.sh
Stopping zookeeper daemon (pid: 7101) on host localhost.
YARN Cluster高可用
当使用yarn运行Flink cluster,不需要运行多个JobManager,仅仅一个就可以。当运行失败时,YARN负责重启。具体的行为依赖于用户的YARN版本。
配置
Application Master最大重试次数(yarn-site.xml)
用户需要为YARN的建立配置AppMaster的最大重试次数,配置文件为yarn-site.xml。
<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)
除了上文提到的YARN HA配置,用户需要在conf/flink-conf.yaml中配置程序的最大重试次数。
yarn.application-attempts: 10
这意味着,在YARN认为程序失败之前,应用自身会重试9次(9次重试+1次初始启动)。YARN会有额外的重启操作,相关的场景有:Preemption,节点硬件错误或重启,NodeManager同步。这些重启不会在
yarn.application-attempts上计数,详情可以阅读http://johnjianfang.blogspot.de/2015/04/the-number-of-maximum-attempts-of-yarn.html。认识到yarn.resourcemanager.am.max-attempts是应用重启的次数上限是很重要的一点。因此,Flink中设置的重启次数不应该超过YARN集群设置的次数。
容器shutdown行为
- YARN 2.3.0 < version < 2.4.0 当AppMaster失败,所有的容器都重启。
- YARN 2.4.0 < version < 2.6.0 在AppMaster失败的时候,TaskManager容器保持运行。这有启动更快的好处,并且用户不需要等待容器资源的再次分配。
- YARN 2.6.0 <= version 将尝试失败有效性间隔设置为Flinks的Akka超时值。尝试失败有效性区间表示,只有在系统在一个区间内看到应用程序尝试的最大次数之后,才会杀死应用程序。这避免了长时间的工作将耗尽它的应用程序尝试次数。
Example:YARN会话高可用
- Configure HA mode and ZooKeeper quorum in conf/flink-conf.yaml:
high-availability: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.storageDir: hdfs:///flink/recovery
high-availability.zookeeper.path.root: /flink
yarn.application-attempts: 10
- Configure ZooKeeper server in conf/zoo.cfg (currently it’s only possible to run a single ZooKeeper server per machine):
server.0=localhost:2888:3888
- Start ZooKeeper quorum:
$ bin/start-zookeeper-quorum.sh
Starting zookeeper daemon on host localhost.
- Start an HA-cluster:
$ bin/yarn-session.sh -n 2
Zookeeper安全配置
如果zookeeper通过使用Kerberos运行于安全模式下,用户可以覆盖flink-conf.yaml中的配置,如下:
zookeeper.sasl.service-name: zookeeper # default is "zookeeper". If the ZooKeeper quorum is configured
# with a different service name then it can be supplied here.
zookeeper.sasl.login-context-name: Client # default is "Client". The value needs to match one of the values
# configured in "security.kerberos.login.contexts".
启动Zookeeper
如果用户没有一个运行的Zookeeper环境,可以使用随着Flink发布的脚本。
conf/zoo.cfg是zookeeper配置的模板。用户可以按照Server.X的模式配置运行了Zookeeper的节点。其中X是节点的唯一编号。
server.X=addressX:peerPort:leaderPort
[...]
server.Y=addressY:peerPort:leaderPort
脚本bin/start-zookeeper-quorum.sh将会在每个配置的主机上运行zookeeper。启动的进程开启一个Flink wraper封装的zookeeper服务。Flink wrapper从conf/zoo.cfg读取配置信息,并方便的提供了一些默认配置。从产品的角度出发,推荐用户维护自己的zookeeper实例。