1.下載Flink壓縮包
下載地址:http://flink.apache.org/downloads.html。
CDH集群環(huán)境 hadoop2.6,Scala2.11,所以下載:flink-1.5.0-bin-hadoop26-scala_2.11.tgz
2.解壓
[root@hadoop2 opt]# tar -zxf flink-1.5.0-bin-hadoop26-scala_2.11.tgz
[root@hadoop2 opt]# cd flink-1.5.0
3.選擇一個(gè)master節(jié)點(diǎn), 配置conf/flink-conf.yaml
[root@hadoop2 flink-1.5.0]# vi conf/flink-conf.yaml
# 設(shè)置jobmanager.rpc.address 配置項(xiàng)為該節(jié)點(diǎn)的IP 或者主機(jī)名
jobmanager.rpc.address: 10.108.4.202
4.配置slaves
將所有的worker節(jié)點(diǎn)(TaskManager)的IP或者主機(jī)名(一行一個(gè))填入conf/slaves 文件中。
[root@hadoop2 flink-1.5.0]# vi conf/slaves
10.108.4.203
10.108.4.204
5.啟動(dòng)flink集群
[root@hadoop2 flink-1.5.0]# bin/start-cluster.sh
6.停止flink集群
[root@hadoop2 flink-1.5.0]# bin/stop-cluster.sh
7. 查看更多可用的配置項(xiàng):
https://ci.apache.org/projects/flink/flink-docs-release-1.5/ops/config.html
以下都是非常重要的配置項(xiàng):
1、TaskManager總共能使用的內(nèi)存大小(taskmanager.heap.mb)
2、每一臺(tái)機(jī)器上能使用的 CPU 個(gè)數(shù)(taskmanager.numberOfTaskSlots)
3、集群中的總 CPU個(gè)數(shù)(parallelism.default)
4、臨時(shí)目錄(taskmanager.tmp.dirs)
以上就完成了一個(gè)簡(jiǎn)單的Flink集群。
添加JobManager或TaskManager實(shí)例到集群
可以使用bin/jobmanager.sh
和bin/taskmanager.sh
腳本為運(yùn)行中的集群添加JobManager和TaskManager實(shí)例
添加jobmanager:
bin/jobmanager.sh ((start|start-foreground) cluster) | stop | stop-all
添加taskmanager:
bin/taskmanager.sh start | start-foreground | stop | stop-all
生產(chǎn)中基本很少使用這種模式的,大多數(shù)都是基于YARN來進(jìn)行提交任務(wù),下面主要給出YARN的任務(wù)提交配置方式。
Flink On YARN
設(shè)置Hadoop環(huán)境變量:
[root@hadoop2 flink-1.5.0]# vi /etc/profile
export HADOOP_CONF_DIR=/opt/cloudera/parcels/CDH-5.13.3-1.cdh5.13.3.p0.2/lib/hadoop/etc/hadoop
查看使用方法:
[root@hadoop2 flink-1.5.0]# bin/yarn-session.sh -h
Usage:
Required
-n,--container <arg> 為YARN分配容器的數(shù)量 (=Number of Task Managers)
Optional
-D <property=value> 動(dòng)態(tài)屬性
-d,--detached 以分離模式運(yùn)行作業(yè)
-h,--help Yarn session幫助.
-id,--applicationId <arg> 連接到一個(gè)正在運(yùn)行的YARN session
-j,--jar <arg> Flink jar文件的路徑
-jm,--jobManagerMemory <arg> JobManager的內(nèi)存大小,driver-memory [in MB]
-m,--jobmanager <arg> Address of the JobManager (master) to which to connect. Use this flag to connect to a different JobManager than the one specified in the configuration.
-n,--container <arg> TaskManager的數(shù)量,相當(dāng)于executor的數(shù)量
-nm,--name <arg> 設(shè)置YARN應(yīng)用自定義名稱
-q,--query 顯示可用的YARN資源 (memory, cores)
-qu,--queue <arg> 指定YARN隊(duì)列
-s,--slots <arg> 每個(gè)JobManager的core的數(shù)量,executor-cores。建議將slot的數(shù)量設(shè)置每臺(tái)機(jī)器的處理器數(shù)量
-st,--streaming 在流模式下啟動(dòng)Flink
-t,--ship <arg> 在指定目錄中傳送文件(t for transfer)
-tm,--taskManagerMemory <arg> 每個(gè)TaskManager的內(nèi)存大小,executor-memory [in MB]
-yd,--yarndetached 如果存在,則以分離模式運(yùn)行作業(yè) (deprecated; use non-YARN specific option instead)
-z,--zookeeperNamespace <arg> 為高可用性模式創(chuàng)建Zookeeper子路徑的命名空間
1. 以集群模式提交任務(wù),每次都會(huì)新建flink集群
[root@hadoop2 flink-1.5.0]# ./bin/flink run -m yarn-cluster -c com.demo.florian.WordCount $DEMO_DIR/target/flink-demo-1.0-SNAPSHOT.jar --port 9000
2.啟動(dòng)Session flink集群,提交任務(wù)
- 啟動(dòng)一個(gè)YARN session用2個(gè)TaskManager(每個(gè)TaskManager分配1GB的堆空間)
[root@hadoop2 flink-1.5.0]# ./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 -s 2
- YARN session啟動(dòng)之后就可以使用bin/flink來啟動(dòng)提交作業(yè)
[root@hadoop2 flink-1.5.0]# ./bin/flink run -c com.demo.florian.WordCount $DEMO_DIR/target/flink-demo-1.0.SNAPSHOT.jar --port 9000
用法: run [OPTIONS] <jar-file> <arguments>
"run" 操作參數(shù):
-c,--class <classname> 如果沒有在jar包中指定入口類,則需要在這里通過這個(gè)參數(shù)指定
-m,--jobmanager <host:port> 指定需要連接的jobmanager(主節(jié)點(diǎn))地址
使用這個(gè)參數(shù)可以指定一個(gè)不同于配置文件中的jobmanager
-p,--parallelism <parallelism> 指定程序的并行度。可以覆蓋配置文件中的默認(rèn)值。
使用run 命令向yarn集群提交一個(gè)job。客戶端可以確定jobmanager的地址。當(dāng)然,你也可以通過-m參數(shù)指定jobmanager。jobmanager的地址在yarn控制臺(tái)上可以看到。
后臺(tái) yarn session
如果你不希望flink yarn client一直運(yùn)行,也可以啟動(dòng)一個(gè)后臺(tái)運(yùn)行的yarn session。使用這個(gè)參數(shù):-d 或者 --detached
在這種情況下,flink yarn client將會(huì)只提交任務(wù)到集群然后關(guān)閉自己。注意:在這種情況下,無法使用flink停止yarn session。
使用yarn 工具 來停止yarn session
yarn application -kill <applicationId>
附著到一個(gè)已存在的session
下面命令可以附著到一個(gè)運(yùn)行中的flink yarn session:
[root@hadoop2 flink-1.5.0]# ./bin/yarn-session.sh -id <yarnAppId>
附著到一個(gè)運(yùn)行的session使用yarn resourcemanager來確定job Manager 的RPC端口。
停止yarn session通過停止unix進(jìn)程(使用CTRL+C)或者在client中輸入stop
flink on yarn的故障恢復(fù)
flink 的 yarn 客戶端通過下面的配置參數(shù)來控制容器的故障恢復(fù)。這些參數(shù)可以通過conf/flink-conf.yaml 或者在啟動(dòng)yarn session的時(shí)候通過-D參數(shù)來指定。
yarn.reallocate-failed:這個(gè)參數(shù)控制了flink是否應(yīng)該重新分配失敗的taskmanager容器。默認(rèn)是true。
yarn.maximum-failed-containers:applicationMaster可以接受的容器最大失敗次數(shù),達(dá)到這個(gè)參數(shù),就會(huì)認(rèn)為yarn session失敗。默認(rèn)這個(gè)次數(shù)和初始化請(qǐng)求的taskmanager數(shù)量相等(-n 參數(shù)指定的)。
yarn.application-attempts:applicationMaster重試的次數(shù)。如果這個(gè)值被設(shè)置為1(默認(rèn)就是1),當(dāng)application master失敗的時(shí)候,yarn session也會(huì)失敗。設(shè)置一個(gè)比較大的值的話,yarn會(huì)嘗試重啟applicationMaster。
日志文件
在某種情況下,flink yarn session 部署失敗是由于它自身的原因,用戶必須依賴于yarn的日志來進(jìn)行分析。最有用的就是yarn log aggregation 。啟動(dòng)它,用戶必須在yarn-site.xml文件中設(shè)置yarn.log-aggregation-enable 屬性為true。一旦啟用了,用戶可以通過下面的命令來查看一個(gè)失敗的yarn session的所有詳細(xì)日志。
yarn logs -applicationId <application ID>
yarn client控制臺(tái)和web界面
flink yarn client也會(huì)打印一些錯(cuò)誤信息在控制臺(tái)上,如果錯(cuò)誤發(fā)生在運(yùn)行時(shí)(例如如果一個(gè)taskmanager停止工作了一段時(shí)間)
除此之外,yarn resource manager的web界面(默認(rèn)端口是8088)。resource manager的端口是通過yarn.resourcemanager.webapp.address參數(shù)來配置的。
它運(yùn)行在yarn 程序運(yùn)行的時(shí)候查看日志和程序失敗的時(shí)候查看日志用戶查找問題。
flink on yarn 內(nèi)部實(shí)現(xiàn)
Flink在YARN集群上運(yùn)行時(shí):Flink YARN Client負(fù)責(zé)與YARN RM通信協(xié)商資源請(qǐng)求,F(xiàn)link JobManager和Flink TaskManager分別申請(qǐng)到Container去運(yùn)行各自的進(jìn)程。
YARN AM與Flink JobManager在同一個(gè)Container中,這樣AM可以知道Flink JobManager的地址,從而AM可以申請(qǐng)Container去啟動(dòng)Flink TaskManager。待Flink成功運(yùn)行在YARN集群上,F(xiàn)link YARN Client就可以提交Flink Job到Flink JobManager,并進(jìn)行后續(xù)的映射、調(diào)度和計(jì)算處理。
YARN客戶端需要訪問Hadoop配置來連接YARN資源管理器和HDFS。它使用下面的策略來確定Hadoop的配置:
YARN_CONF_DIR,HADOOP_CONF_DIR,HADOOP_CONF_PATH.其中一個(gè)變量被設(shè)置,就能讀取配置
如果上面的策略失敗(在正確的yarn 設(shè)置中不應(yīng)該出來這種情況),客戶端使用HADOOP_HOME環(huán)境變量。如果設(shè)置了,那么客戶端就會(huì)嘗試訪問$HADOOP_HOME/tect/hadoop
step1 : 當(dāng)啟動(dòng)一個(gè)新的Flink YARN session時(shí),客戶端首先檢查資源(container和memory)是否可用。然后,上傳一個(gè)包含F(xiàn)link和配置的jar包到HDFS上。
客戶端請(qǐng)求(step 2)YARN container啟動(dòng)ApplicationMaster(step 3).由于客戶端將配置和jar文件注冊(cè)到容器,在特定機(jī)器上運(yùn)行的YARN的NodeManager將負(fù)責(zé)準(zhǔn)備container(例如下載文件)。一旦完成,ApplicationMaster就被啟動(dòng)了。
JobManager和ApplicationMaster運(yùn)行在同一個(gè)container上。一旦他們被成功啟動(dòng),AM就知道JobManager的地址(AM它自己所在的機(jī)器)。它就會(huì)為TaskManager生成一個(gè)新的Flink配置文件(他們就可以連接到JobManager)。這個(gè)配置文件也被上傳到HDFS上。此外,AM容器也提供了Flink的web服務(wù)接口。YARN所分配的所有端口都是臨時(shí)端口,這允許用戶并行執(zhí)行多個(gè)Flink session。
最后,AM開始為Flink的任務(wù)TaskManager分配container,它將從HDFS加載jar文件和修改的配置文件。一旦這些步驟完成,F(xiàn)link就準(zhǔn)備好接口Job的提交了
Flink任務(wù)處理過程
當(dāng)Flink系統(tǒng)啟動(dòng)時(shí),首先啟動(dòng)JobManager和一至多個(gè)TaskManager。JobManager負(fù)責(zé)協(xié)調(diào)Flink系統(tǒng),TaskManager則是執(zhí)行并行程序的worker。當(dāng)系統(tǒng)以本地形式啟動(dòng)時(shí),一個(gè)JobManager和一個(gè)TaskManager會(huì)啟動(dòng)在同一個(gè)JVM中。
當(dāng)一個(gè)程序被提交后,系統(tǒng)會(huì)創(chuàng)建一個(gè)Client來進(jìn)行預(yù)處理,將程序轉(zhuǎn)變成一個(gè)并行數(shù)據(jù)流的形式,交給JobManager和TaskManager執(zhí)行。