以前在 《從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 集羣中配置高可用。