1.下載Flink壓縮包
下載地址:http://flink.apache.org/downloads.html。
我集羣環境是hadoop2.6,Scala2.11版本的,所以下載的是:
flink-1.3.1-bin-hadoop26-scala_2.11.tgz。
2.解壓
上傳至五個節點的相同目錄,執行如下命令解壓:
tar xzf flink-1.3.1-bin-hadoop26-scala_2.11.tgz |
3.配置master節點
選擇一個 master節點(JobManager)然後在conf/flink-conf.yaml中設置jobmanager.rpc.address 配置項爲該節點的IP 或者主機名。確保所有節點有有一樣的jobmanager.rpc.address 配置。
4.配置slaves
將所有的 worker 節點 (TaskManager)的IP 或者主機名(一行一個)填入conf/slaves 文件中。
5.啓動flink集羣
bin/start-cluster.sh |
6.注意
問https://ci.apache.org/projects/flink/flink-docs-release-1.0/setup/config.html查看更多可用的配置項。爲了使Flink 更高效的運行,還需要設置一些配置項。
以下都是非常重要的配置項:
1、TaskManager總共能使用的內存大小(taskmanager.heap.mb)
2、每一臺機器上能使用的 CPU 個數(taskmanager.numberOfTaskSlots)
3、集羣中的總 CPU個數(parallelism.default)
4、臨時目錄(taskmanager.tmp.dirs)
7.示例
下面的例子闡述了三個節點的集羣部署(IP地址從10.0.0.1 到10.0.0.3,主機名分別爲master, worker1, worker2)。並且展示了配置文件,以及所有機器上一致的可訪問的安裝路徑。
8.Flink On Yarn配置
你可以很方便地將 Flink部署在現有的YARN集羣上,操作如下:
1、下載 Flink Hadoop2包: Flink with Hadoop 2
2、確保你的 HADOOP_HOME (或YARN_CONF_DIR 或HADOOP_CONF_DIR) __環境變量__設置成你的YARN 和HDFS 配置。
3、運行 YARN客戶端:./bin/yarn-session.sh。你可以帶參數運行客戶端 -n 10 -tm 8192表示分配 10個 TaskManager,每個擁有8 GB 的內存。
flink集羣安裝部署
yarn集羣模式
- 快速開始
- 在yarn上啓動一個一直運行的flink集羣
- 在yarn上運行一個flink job
- flink yarn session
- 啓動flink session
- 提交任務到flink
- 在yarn上運行一個獨立的flink job
- 用戶依賴jar包和classpath
- flink on yarn的故障恢復
- 調試一個失敗的yarn session
- 日誌文件
- yarn client控制檯和web界面
- 針對指定的hadoop版本構建yarn client
- 在yarn上運行flink使用防火牆
- flink on yarn 內部實現
快速開始
在yarn上啓動一個一直運行的flink集羣
啓動一個yarn session使用4個taskmanager(每個節點4GB內存)
注意:如果自己的虛擬機沒有這麼大內存的話,可以吧-n設置小一點,對應的後面的內存-jm -tm也設置小一點,否則,如果內存不夠用,會導致啓動失敗。
-
tar xvzf flink-1.4.2-bin-hadoop2.tgz
-
cd flink-1.4.2/
-
./bin/yarn-session.sh -n 4 -jm 1024 -tm 4096
通過-s參數指定每一個taskmanager分配多少個slots(處理進程)。我們建議設置爲每個機器的CPU核數。
一旦session創建成功,你可以使用./bin/flink工具向集羣提交任務。
在yarn上運行一個flink job
-
tar xvzf flink-1.4.2-bin-hadoop2.tgz
-
cd flink-1.4.2/
-
./bin/flink run -m yarn-cluster -yn 4 -yjm 1024 -ytm 4096 ./examples/batch/WordCount.jar
flink yarn session
yarn是一個集羣資源管理框架。它運行在集羣之上運行各種分佈式應用程序。flink像其他程序一樣,也可以在yarn上運行。用戶不需要設置或者安裝任何東西,如果已經有一個安裝配置好的yarn。
必須的依賴
- 至少是hadoop2.2
- hdfs(或者是其它支持hadoop的分佈式文件系統)
如果你在使用flink yarn client的時候有什麼問題,可以到這裏查找答案。
啓動flink session
按照下面的步驟來學習如何在yarn集羣上啓動一個flink session
一個session將會包含所有必須的flink 服務(jobmanager和taskmanager),這樣你就可以向這個集羣提交程序了。注意:每個session會話你可以運行多個程序。
下載flink
下載hadoop2對應的flink安裝包,點此下載。它包含了必須的文件。
使用下面命令解壓:
-
tar xvzf flink-1.4.2-bin-hadoop2.tgz
-
cd flink-1.4.2/
啓動一個session
使用下面命令啓動一個session
./bin/yarn-session.sh
這個命令將會輸出下面內容:
-
用法:
-
必選
-
-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必須要設置YARN_CONF_DIR或者HADOOP_CONF_DIR環境變量,通過這個環境變量來讀取YARN和HDFS的配置信息,否則啓動會失敗。
經試驗發現,其實如果配置的有HADOOP_HOME環境變量的話也是可以的。HADOOP_HOME ,YARN_CONF_DIR,HADOOP_CONF_DIR 只要配置的有任何一個即可。
例子:下面的命令會申請10個taskmanager,每個8G內存和32個solt
./bin/yarn-session.sh -n 10 -tm 8192 -s 32
該系統默認會使用這個配置文件:conf/flink-conf.yaml。如果你想修改一些參數,請查看我們的配置指南。
flink on yarn模式將會覆蓋一些配置文件 jobmanager.rpc.address(因爲jobmanager總是分配在不同的機器),taskmanager.tmp.dirs(我們使用yarn提供的臨時目錄)和parallelism.default 如果solts的數量已經被指定。
如果你不想修改配置文件去改變參數,有一個選擇是通過動態的參數-D 來指定。所以你可以傳遞參數:-Dfs.overwrite-files=true -Dtaskmanager.network.memory.min=536346624
上面的例子將會啓動11個容器(即使僅請求10個容器),因爲有一個額外的容器來啓動ApplicationMaster 和 job manager
一旦flink在你的yarn集羣上部署,它將會顯示job manager的連接詳細信息。
停止yarn session通過停止unix進程(使用CTRL+C)或者在client中輸入stop。
Flink on yarn只會啓動請求的資源,如果集羣資源充足。大多數yarn調度器請求容器的內存,一些也會請求cpu。默認,cpu的核數等於slots的數量,通過-s參數指定。這個參數yarn.containers.vcores的值允許使用一個自定義值來進行覆蓋。
後臺 yarn session
如果你不希望flink yarn client一直運行,也可以啓動一個後臺運行的yarn session。使用這個參數:-d 或者 --detached
在這種情況下,flink yarn client將會只提交任務到集羣然後關閉自己。注意:在這種情況下,無法使用flink停止yarn session。
使用yarn 工具 來停止yarn session
yarn application -kill <applicationId>
附着到一個已存在的session
使用下面命令啓動一個session
./bin/yarn-session.sh
執行這個命令將會顯示下面內容:
-
用法:
-
必須
-
-id,--applicationId <yarnAppId> YARN集羣上的任務id
正如前面提到的,YARN_CONF_DIR或者HADOOP_CONF_DIR環境變量必須是可以讀取到YARN和HDFS配置的。
例如:發出下面命令可以附着到一個運行中的flink yarn session
./bin/yarn-session.sh -id application_1463870264508_0029
附着到一個運行的session使用yarn resourcemanager來確定job Manager 的RPC端口。
停止yarn session通過停止unix進程(使用CTRL+C)或者在client中輸入stop
提交任務到flink
使用下面的命令提交一個flink程序到yarn集羣
./bin/flink
請參考客戶端命令行操作文檔
這個命令將會向你展示一個這樣一個幫助菜單
"run" 參數可以編譯和運行一個程序
-
用法: run [OPTIONS] <jar-file> <arguments>
-
"run" 操作參數:
-
-c,--class <classname> 如果沒有在jar包中指定入口類,則需要在這裏通過這個參數指定
-
-m,--jobmanager <host:port> 指定需要連接的jobmanager(主節點)地址
-
使用這個參數可以指定一個不同於配置文件中的jobmanager
-
-p,--parallelism <parallelism> 指定程序的並行度。可以覆蓋配置文件中的默認值。
使用run 命令向yarn集羣提交一個job。客戶端可以確定jobmanager的地址。當然,你也可以通過-m參數指定jobmanager。jobmanager的地址在yarn控制檯上可以看到。
例子:【注意:下面的命令官網文檔提供的有問題,執行失敗】
-
wget -O LICENSE-2.0.txt http://www.apache.org/licenses/LICENSE-2.0.txt
-
hadoop fs -copyFromLocal LICENSE-2.0.txt hdfs:/// ...
-
【注意:下面的命令官網文檔提供的有問題,執行失敗】
-
./bin/flink run ./examples/batch/WordCount.jar \
-
hdfs:///..../LICENSE-2.0.txt hdfs:///.../wordcount-result.txt
-
查看flink源碼發現,wordCount.jar可以不提供參數,或者提供參數,提供參數的時候需要使用input和output參數指定:
-
上面的命令需要修改爲如下格式才能正常執行[傳遞的兩個參數需要使用-input和 -output來指定]
-
./bin/flink run ./examples/batch/WordCount.jar -input hdfs://hostname:port/LICENSE-2.0.txt -output hdfs://hostname:port/wordcount-result.txt
如果有以下錯誤,確保所有taskmanager是否已經啓動:
-
Exception in thread "main" org.apache.flink.compiler.CompilerException:
-
Available instances could not be determined from job manager: Connection timed out.
你可以在jobmanager的web界面上檢查taskmanager的數量。這個web界面的地址會打印在yarn session的控制檯上。
如果沒有發現taskmanager,你應該通過日誌文件來檢查問題。
在yarn上運行一個獨立的flink job
這個文檔描述瞭如何在一個hadoop yarn環境中啓動flink集羣。也可以在yarn中啓動只執行單個任務的flink。
請注意:client期望設置-yn 參數(taskmanager的數量)
例子:
./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar
yarn session命令行的選項也可以使用./bin/flink 工具獲得。它們都有一個y或者yarn的前綴
注意:通過爲每個任務設置不同的環境變量 FLINK_CONF_DIR,可以爲每個任務使用不同的配置目錄。從 Flink 分發包中複製 conf 目錄,然後修改配置,例如,每個任務不同的日誌設置
用戶依賴jar包和classpath
默認情況下,當運行一個獨立的job的時候,這個flink job將包含用戶依賴的jar包。可以通過參數yarn.per-job-cluster.include-user-jar來控制。
當設置爲 DISABLED ,flink將會包含用戶classpath下面的jar包。
用戶jar包在類路徑中的位置可以通過下面參數來控制:
-
* ORDER: (默認) 添加jar包到系統類路徑下面,按照字典順序.
-
* FIRST: 將jar添加到類路徑的前面.
-
* LAST: 將jar添加到類路徑的最後.
flink on yarn的故障恢復
flink 的 yarn 客戶端通過下面的配置參數來控制容器的故障恢復。這些參數可以通過conf/flink-conf.yaml 或者在啓動yarn session的時候通過-D參數來指定。
- yarn.reallocate-failed:這個參數控制了flink是否應該重新分配失敗的taskmanager容器。默認是true。
- yarn.maximum-failed-containers:applicationMaster可以接受的容器最大失敗次數,達到這個參數,就會認爲yarn session失敗。默認這個次數和初始化請求的taskmanager數量相等(-n 參數指定的)。
- yarn.application-attempts:applicationMaster重試的次數。如果這個值被設置爲1(默認就是1),當application master失敗的時候,yarn session也會失敗。設置一個比較大的值的話,yarn會嘗試重啓applicationMaster。
調試一個失敗的yarn session
一個flink yarn session部署失敗可能會有很多原因。一個錯誤的hadoop配置(hdfs 權限,yarn配置),版本不兼容(使用cdh中的hadoop運行flink),或者其他的錯誤。
日誌文件
在某種情況下,flink yarn session 部署失敗是由於它自身的原因,用戶必須依賴於yarn的日誌來進行分析。最有用的就是yarn log aggregation 。啓動它,用戶必須在yarn-site.xml文件中設置yarn.log-aggregation-enable 屬性爲true。一旦啓用了,用戶可以通過下面的命令來查看一個失敗的yarn session的所有詳細日誌。
yarn logs -applicationId <application ID>
yarn client控制檯和web界面
flink yarn client也會打印一些錯誤信息在控制檯上,如果錯誤發生在運行時(例如如果一個taskmanager停止工作了一段時間)
除此之外,yarn resource manager的web界面(默認端口是8088)。resource manager的端口是通過yarn.resourcemanager.webapp.address參數來配置的。
它運行在yarn 程序運行的時候查看日誌和程序失敗的時候查看日誌用戶查找問題。
針對指定的hadoop版本構建yarn client
用戶可以使用hadoop發行版。例如,hortonworks,CDH或者MapR等版本去構建 flink。請參考構建指南獲取詳細信息
在yarn上運行flink使用防火牆
一些yarn 集羣使用防火牆來控制集羣的網絡和其他網絡的通信。在這種設置下,flink只能通過集羣的網絡來提交任務到yarn session。針對生產環境下使用是不可行的,flink允許配置所有相關服務的端口範圍,通過這些端口範圍的配置,用戶也可以透過防火牆來提交flink job。
目前,兩個服務都需要提交任務:
- jobmanager(yarn中的applicationMaster)
- jobmanager內部運行的blobserver
當向flink提交一個任務的時候,blobserver將會把用戶的代碼分發到所有工作節點(taskManagers)。jobmanager接收任務本身,並觸發執行。
以下兩個配置參數可以指定端口:
- yarn.application-master.port
- blob.server.port
這兩個配置選項接收單一的端口(例如:"50010"),區間("50000-50025"),或者同時指定多個("50010,50011,50020-50025,50050-50075")。
(hadoop也使用的是類似的機制,例如:yarn.app.mapreduce.am.job.client.port-range)
flink on yarn 內部實現
本節主要描述flink和yarn是如何交互的
YARN 客戶端需要訪問 Hadoop 配置,從而連接 YARN 資源管理器和 HDFS。可以使用下面的策略來決定 Hadoop 配置:
- 測試 YARN_CONF_DIR, HADOOP_CONF_DIR 或 HADOOP_CONF_PATH 環境變量是否設置了(按該順序測試)。如果它們中有一個被設置了,那麼它們就會用來讀取配置。
- 如果上面的策略失敗了(如果正確安裝了 YARN 的話,這不應該會發生),客戶端會使用 HADOOP_HOME 環境變量。如果該變量設置了,客戶端會嘗試訪問 $HADOOP_HOME/etc/hadoop (Hadoop 2) 和 $HADOOP_HOME/conf(Hadoop 1)。
當啓動一個新的 Flink YARN Client會話,客戶端首先會檢查所請求的資源(容器和內存)是否可用。之後,它會上傳包含了 Flink 配置和 jar文件到 HDFS(步驟 1)。
客戶端的下一步是請求(步驟 2)一個 YARN 容器啓動 ApplicationMaster (步驟 3)。因爲客戶端將配置和jar 文件作爲容器的資源註冊了,所以運行在特定機器上的 YARN 的 NodeManager 會負責準備容器(例如,下載文件)。一旦這些完成了,ApplicationMaster (AM) 就啓動了。
JobManager 和 AM 運行在同一個容器中。一旦它們成功地啓動了,AM 知道 JobManager 的地址(它自己)。它會爲 TaskManager 生成一個新的 Flink 配置文件(這樣它們才能連上 JobManager)。該文件也同樣會上傳到 HDFS。另外,AM 容器同時提供了 Flink 的 Web 界面服務。Flink 用來提供服務的端口是由用戶 + 應用程序 id 作爲偏移配置的。這使得用戶能夠並行執行多個 Flink YARN 會話。
之後,AM 開始爲 Flink 的 TaskManager 分配容器,這會從 HDFS 下載 jar 文件和修改過的配置文件。一旦這些步驟完成了,Flink 就安裝完成並準備接受任務了。