多機部署Flink standalone 集羣
部署前要注意的要點
- 每臺機器上配置好java以及
JAVA_HOME
環境變量 - 最好挑選一臺機器,和其他機器ssh 打通
- 每臺機器上部署的Flink binary的目錄要保證是同一個目錄
- 如果需要用hdfs,需要配置
HADOOP_CONF_DIR
環境變量配置上
配置
- JobManager機器:master
- TaskManager機器:node1,node2,node3
修改Flink binary
目錄的conf
子目錄中的masters
和slaves
兩個文件:
$cat conf/masters
master:8081
$cat conf/slaves
node1
node2
node3
修改conf/flink-conf.yaml
配置
jobmanager.rpc.address: master
然後把修改後的這三個文件同步到其他機器的相同conf
目錄下.
然後啓動flink集羣:
./bin/start-cluster.sh
提交WordCount
作業
./bin/flink run examples/streaming/WordCount.jar
上傳WordCount
的input
文件:
hdfs dfs -copyFromLocal story /test_dir/input_dir/story
提交讀寫hdfs的WordCount作業:
./bin/flink run examples/streaming/WordCount.jar --input hdfs:///test_dir/input_dir/story --output
hdfs:///test_dir/output_dir/output
增加WordCount作業的併發度(注意輸出文件重名會提交失敗):
./bin/flink run examples/streaming/WordCount.jar --input hdfs:///test_dir/input_dir/story --output
hdfs:///test_dir/output_dir/output --parallelism 20
standalone 模式的HighAvailability(HA)部署和配置
JobManager是整個系統中最可能導致系統不可用的角色。一個TaskManager掛了,如果資源足夠(空閒TaskSlot足夠)的話,則只需要把相關task調度到其他空閒TaskSlot上,然後job從checkpoint中恢復即可。而如果當前集羣中只配置了一個JobManager,則一旦JobManager掛了,就必須等待這個JobManager重新恢復,如果恢復時間過長,就可能導致整個job失敗。
官方HA部署說明
所需環境
flink-1.10
zookeeper
hadoop
flink
內部也提供了zookeeper
插件,通過修改/conf/zoo.cfg
文件即可,啓動命令在/bin/start-zookeeper-quorum.sh
配置
conf/flink-conf.yaml
# 高可用相關重要配置
# 配置high-availability mode
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
state.checkpoints.dir: hdfs:///flink/checkpoints
state.savepoints.dir: hdfs:///flink/savepoints
conf/masters
和slaves
master1:8081
master2:8081
slave001
slave002
slave003
conf/zoo.cfg
server.1=slave001:2888:3888
server.2=slave002:2888:3888
server.3=slave003:2888:3888
修改完成後,再把這幾個文件同步到不同機器到相同conf目錄下。
- 啓動zookeeper(如果已經有zookeeper集羣可以不使用flink自帶的)
$ bin/start-zookeeper-quorum.sh
- 啓動
HA-cluster
$ bin/start-cluster.sh
分別打開:
http://master1:8081
http://master2:8081
可以看到兩個頁面最後都轉到了同一個地址上,這個地址就是當前主JobManager所在機器,另一個就是standby JobManager。
當我們知道主JobManager後,我們可以把主JobManager進程kill掉,比如當前主JobManager在matser1這個機器上,就把這個進程殺掉.
- 關閉zookeeper和flink
$ bin/stop-cluster.sh
$ bin/stop-zookeeper-quorum.sh
注意事項
flink-1.10.0
與hadoop
集成
- 配置環境變量
vi /etc/profile
# 添加如下內容:
export HADOOP_CONF_DIR=/home/hadoop-2.6.5/etc/hadoop
# 使環境變量生效
source /etc/profile
- 添加hadoop依賴
flink-shaded-hadoop-2-uber-2.6.5-10.0.jar
下載jar
包放到/flink-1.10.0/lib
目錄下.
使用yarn模式跑flink job
什麼情況下適合使用yarn模式跑flink job?
相對於standalone模式,yarn模式允許flink job的好處有:
- 資源按需使用,提高集羣的資源利用率
- 任務有優先級,根據優先級運行作業
- 基於YARN調度系統,能夠自動化地處理各個角色的failover
- JobManager進程和TaskManager進程都由Yarn NodeManager監控
- 如果JobManager進程異常退出,則Yarn ResourceManager會重新調度JobManager到其他機器
- 如果TaskManager進程異常退出,JobManager會收到消息並重新向Yarn ResourceManager申請資源,重新啓動TaskManager
在YARN上啓動long running的flink集羣(yarn session)
- Highly Available YARN Session模式
- yarn是一個集羣資源管理框架。它運行在集羣之上運行各種分佈式應用程序。flink像其他程序一樣,也可以在yarn上運行。用戶不需要設置或者安裝任何東西,如果已經有一個安裝配置好的yarn。
- 一個session將會包含所有必須的flink 服務(jobmanager和taskmanager),這樣你就可以向這個集羣提交程序了。注意:每個session會話你可以運行多個程序。
YARN Session
模式只會啓動一個JobManager
,如果啓動失敗會重啓.- 啓動一個session命令:
./bin/yarn-session.sh
命令參數用法:
# 查看命令參數
./bin/yarn-session.sh -h
# 用法:
必選
-n,--container <arg> 分配多少個yarn容器 (=taskmanager的數量)
可選
-D <arg> 動態屬性
-d,--detached 獨立運行
-jm,--jobManagerMemory <arg> JobManager的內存 [in MB]
-nm,--name 在YARN上爲一個自定義的應用設置一個名字
-q,--query 顯示yarn中可用的資源 (內存, cpu核數)
-qu,--queue <arg> 指定YARN隊列.
-s,--slots <arg> 每個TaskManager使用的slots數量
-tm,--taskManagerMemory <arg> 每個TaskManager的內存 [in MB]
-z,--zookeeperNamespace <arg> 針對HA模式在zookeeper上創建NameSpace
client必須要設置
HADOOP_HOME
,YARN_CONF_DIR
或者HADOOP_CONF_DIR
環境變量,通過這個環境變量來讀取YARN
和HDFS
的配置信息,否則啓動會失敗。
創建一個YARN模式的flink集羣:
./bin/yarn-session.sh -n 4 -jm 1024m -tm 4096m
提交一個flink job到flink集羣:
./bin/flink run examples/streaming/WordCount.jar --input hdfs:///test_dir/input_dir/story --output hdfs:///test_dir/output_dir/output
這次提交
flink job
,雖然沒有指定對應yarn application
的信息,確可以提交到對應的flink集羣,原因在於/tmp/.yarn-properties-${user}
文件中保存了上一次創建yarn session的集羣信息。所以如果同一用戶在同一機器上再次創建一個yarn session
,則這個文件會被覆蓋掉。
那如果刪掉
/tmp/.yarn-properties-${user}
或者在另一個機器上提交作業能否提交到預期到yarn session
中呢?這也是可以的,如果配置了HighAvailability
,則可以根據cluster-id
,從zookeeper上獲取到JobManager的地址和端口,從而提交作業。
high-availability.cluster-id
如果Yarn session沒有配置HA,又該如何提交呢?這個時候就必須要在提交flink job的命令中指明YARN上的
application id
,通過“-yid”參數傳入:
/bin/flink run -yid application_1548056325049_0048 examples/streaming/WordCount.jar --
input hdfs:///test_dir/input_dir/story --output hdfs:///test_dir/output_dir/output
我們可以發現,每次跑完任務不久,
TaskManager
就沒有了,下次在提交任務的時候,TaskManager
又會重新拉起來。如果希望TaskManager
啓動後就持續運行,可以在conf/flink-conf.yaml
文件中配置下面這個參數,單位是milliseconds
,默認值是30000L
,即30秒
:
resourcemanager.taskmanager-timeout
在YARN上運行單個flink job
如果你只想運行單個flink job後就退出,那麼可以用下面這個命令:
./bin/flink run -m yarn-cluster -yn 2 examples/streaming/WordCount.jar --input hdfs:///test_dir/input_dir/story --output hdfs:///test_dir/output_dir/output
常用的配置有:
- -yn,–yarncontainer Number of Task Managers
- -yqu,–yarnqueue Specify YARN queue.
- -ys,–yarnslots Number of slots per TaskManager
- -yqu,–yarnqueue Specify YARN queue.
可以通過help命令查看run的可用參數:
./bin/flink run -h
參考鏈接
- https://blog.csdn.net/xu470438000/article/details/79576989