JobManager高可用性(HA)
作業管理器JobManager協調每個Flink部署組件,它負責調度以及資源管理。
默認情況下,每個Flink集羣只有一個獨立的JobManager實例,因此可能會產生單點故障(SPOF)。
使用JobManager High Availability,可以從JobManager的故障中恢復,從而消除SPOF。可以爲獨立(Standalone)集羣和YARN集羣配置高可用性。
獨立(Standalone)集羣高可用
獨立集羣的JobManager高可用性的一般概念是,任何時候都有一個獨立擁有leader角色的JobManager和多個備用(Standby)的JobManagers,以便在leader失敗時接管leader角色。這樣就保證了沒有單點故障,一旦備用JobManager取得領導角色,程序就可以正常運行。備用和主JobManager實例之間沒有明確的區別,每個JobManager都可以充當主服務器或備用服務器。
例如,請考慮以下三個JobManager實例的設置:
配置
要啓用JobManager高可用性,您必須將高可用性模式(high-availability mode)設置爲zookeeper,配置ZooKeeper仲裁併設置包含所有JobManagers主機及其Web UI端口的master文件。
Flink利用ZooKeeper在所有正在運行的JobManager實例之間進行分佈式協調。ZooKeeper是獨立於Flink之外的服務,通過領導者選舉和輕量級一致狀態存儲提供高度可靠的分佈式協調服務。有關ZooKeeper的更多信息,請查看ZooKeeper的入門指南。Flink包含用於引導簡單ZooKeeper安裝的腳本。
masters文件:
要啓動HA羣集,請在以下位置配置主文件conf/masters:
- masters文件: masters文件包括所有啓動JobManager的主機節點,以及web用戶界面綁定的端口號。
jobManagerAddress1:webUIPort1 [...] jobManagerAddressX:webUIPortX
默認情況下,JobManager將爲進程間通信(IPC)選擇一個隨機端口。可以通過
更改配置項high-availability.jobmanager.port 的值。此配置項接受單個端口(例如50010),範圍(50000-50025)或兩者的組合(50010,50011,50020-50025,50050-50075)。
flink-conf.yaml文件:
要啓動HA羣集,請將以下配置項添加到conf/flink-conf.yaml:
- high-availability mode (required):high-availability mode必須在conf/fink-conf.yaml文件中設置爲zookeeper,以啓用高可用模式。或者該選項可以設置爲Flink用來創建高可用服務實例的工廠類或者FQN。
high-availability: zookeeper
- ZooKeeper quorum (required): ZooKeeper仲裁是ZooKeeper服務的複製組,它提供分佈式協調服務。
high-availability.zookeeper.quorum: address1:2181[,...],addressX:2181
每個addressX:port指的是一個ZooKeeper服務,Flink可以通過給定的地址和端口訪問它。
- ZooKeeper root (recommended): ZooKeeper根節點,在該節點下放置所有集羣節點。
high-availability.zookeeper.path.root: /flink
- ZooKeeper cluster-id (recommended): ZooKeeper cluster-id 節點,在該節點下放置集羣所需的所有協調數據。
high-availability.cluster-id: /default_ns # important: customize per cluster ```集 > **重要**: 每個作業以一個YARN會話的形式在YARN集羣運行,或其他集羣管理器運行時,不應手動設置此值。在這些情況下,將會根據應用程序ID自動生成cluster-id。手動設置cluster-id會覆蓋YARN中的此行爲。反過來,使用“-z CLI”選項指定cluster-id會覆蓋此手動配置項。如果在裸機上運行多個Flink HA集羣,則必須爲每個羣集手動配置單獨的集羣ID。
- Storage directory (required): JobManager元數據保存在文件系統的storageDir中,而指向此狀態的指針存儲在ZooKeeper中。
high-availability.storageDir: hdfs:///flink/recovery
storageDir存儲所有元數據,恢復JobManager失敗需要的元數據。
配置主服務器和ZooKeeper仲裁後,可以像往常一樣使用提供的集羣啓動腳本。他們將啓動HA羣集。請記住,調用腳本時ZooKeeper仲裁必須運行,並確保要爲啓動的每個HA羣集配置單獨的ZooKeeper根路徑。
示例:擁有2個JobManager的獨立集羣
- 在文件conf/flink-conf.yaml中配置高可用模式以及zookeeper仲裁集羣
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
- 在文件conf/masters中配置masters
localhost:8081 localhost:8082
- 在文件conf/zoo.cfg中配置Zookeeper服務器(目前只能是在每個機器節點上運行單一的Zookeeper服務)
server.0=localhost:2888:3888
- 啓動Zookeeper仲裁
$ bin/start-zookeeper-quorum.sh Starting zookeeper daemon on host localhost.
- 啓動HA集羣
$ 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仲裁和集羣:
$ 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集羣高可用
運行高可用YARN集羣時,不會運行多個JobManager(ApplicationMaster)實例,而只運行一個,這些實例在發生故障時由YARN重新啓動。確切的行爲取決於使用YARN的特定版本。
配置
Application Master最大重試次數(yarn-site.xml)
必須配置YARN集羣的yarn-site.xml文件中的Application Master最大重試次數。
<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失敗。
Application Attempts (flink-conf.yaml)
除了前述的HA配置項,還必須在fink-conf.yaml文件中配置最大重試次數。
yarn.application-attempts: 10
這意味着在YARN使應用程序失敗之前,應用程序可以重新啓動9次以進行失敗嘗試(9次重試+ 1次初始嘗試)。如果YARN操作(搶佔,節點硬件故障或重新啓動,或NodeManager重新同步)需要,YARN可以執行其他重新啓動。這些重啓不計入yarn.application-attempts。重要的是要注意yarn.resourcemanager.am.max-attempts應用程序重新啓動的上限。因此,Flink中設置的應用程序嘗試次數不能超過啓動的YARN集羣設置。
容器關閉行爲
- YARN 2.3.0 < version < 2.4.0.如果Application Master失敗,則重啓所有的容器。
- YARN 2.4.0 < version < 2.6.0.TaskManager容器在Application Master故障期間保持活動狀態。具有以下優點:啓動時間更快並且用戶不必等待再次獲得容器資源。
- YARN 2.6.0 <= version.將嘗試失敗有效性間隔設置爲Flinks的Akka超時值。嘗試失敗有效性間隔表示系統在一個間隔期間看到最大應用程序嘗試次數後纔會終止應用程序。這避免了持久的作業會耗盡它的應用程序嘗試。
注意:Hadoop YARN 2.4.0有一個主要錯誤(在2.5.0中修復),阻止重新啓動的Application Master / Job Manager容器重啓容器。有關詳細信息,請參閱FLINK-4142。我們建議至少在YARN上使用Hadoop 2.5.0進行高可用性設置。示例:高可用的YARN會話
- 在文件conf/flink-conf.yaml中配置高可用模式以及zookeeper仲裁集羣
high-availability: zookeeper high-availability.zookeeper.quorum: localhost:2181 high-availability.zookeeper.path.root: /flink high-availability.storageDir: hdfs:///flink/recovery yarn.application-attempts: 10
- 在文件conf/zoo.cfg中配置Zookeeper服務器(目前只能是在每個機器節點上運行單一的Zookeeper服務)
server.0=localhost:2888:3888
- 啓動Zookeeper仲裁
$ bin/start-zookeeper-quorum.sh Starting zookeeper daemon on host localhost.
4.啓動HA集羣
$ bin/yarn-session.sh -n 2
- 在文件conf/flink-conf.yaml中配置高可用模式以及zookeeper仲裁集羣
Zookeeper啓用安全的配置
如果ZooKeeper使用Kerberos以安全模式運行,則可以根據需要覆蓋flink-conf.yaml中的以下配置:
# 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
有關Kerberos安全性的Flink配置的更多信息,請參閱此處。您還可以在此處找到有關Flink內部如何設置基於Kerberos的安全性的更多詳細信息。
引導Zookeeper
如果沒有正在運行的ZooKeeper安裝,則可以使用Flink附帶的幫助程序腳本。
有一個ZooKeeper配置模板conf/zoo.cfg。可以將主機配置爲使用server.X培香項運行ZooKeeper ,其中X是每個服務器的唯一ID:
server.X = addressX:peerPort:leaderPort
[...]
server.Y = addressY:peerPort:leaderPort
腳本bin/start-zookeeper-quorum.sh將在每個配置的主機上啓動ZooKeeper服務器。啓動的進程通過Flink包裝器啓動ZooKeeper服務器,該包裝器從conf/zoo.cfg中讀取配置,並確保爲方便起見設置一些必需的配置值。在生產環境中,建議部署管理獨立的ZooKeeper集羣。