Flink Yarn Cluster & HA

在一個企業中,為了最大化的利用集群資源,一般都會在一個集群中同時運行多種類型的 Workload。因此 Flink 也支持在 Yarn 上面運行。首先,讓我們了解下 Yarn 和 Flink 的關系。


1.png

在圖中可以看出,Flink 與 Yarn 的關系與 MapReduce 和 Yarn 的關系是一樣的。Flink 通過 Yarn 的接口實現了自己的 App Master。當在 Yarn 中部署了 Flink,Yarn 就會用自己的 Container 來啟動 Flink 的 JobManager(也就是 App Master)和 TaskManager。

啟動新的Flink YARN會話時,客戶端首先檢查所請求的資源(容器和內存)是否可用。之后,它將包含Flink和配置的jar上傳到HDFS(步驟1)。

客戶端的下一步是請求(步驟2)YARN容器以啟動ApplicationMaster(步驟3)。由于客戶端將配置和jar文件注冊為容器的資源,因此在該特定機器上運行的YARN的NodeManager將負責準備容器(例如,下載文件)。完成后,將啟動ApplicationMaster(AM)。

該JobManager和AM在同一容器中運行。一旦它們成功啟動,AM就知道JobManager(它自己的主機)的地址。它正在為TaskManagers生成一個新的Flink配置文件(以便它們可以連接到JobManager)。該文件也上傳到HDFS。此外,AM容器還提供Flink的Web界面。YARN代碼分配的所有端口都是臨時端口。這允許用戶并行執行多個Flink YARN會話。

之后,AM開始為Flink的TaskManagers分配容器,這將從HDFS下載jar文件和修改后的配置。完成這些步驟后,即可建立Flink并準備接受作業。

修改環境變量
export  HADOOP_CONF_DIR= /opt/module/hadoop-2.7.6/etc/hadoop
部署啟動
$ yarn-session.sh -d -s 1 -tm 800 -n 2

-n : TaskManager的數量,相當于executor的數量

-s : 每個JobManager的core的數量,executor-cores。建議將slot的數量設置每臺機器的處理器數量

-tm : 每個TaskManager的內存大小,executor-memory

-jm : JobManager的內存大小,driver-memory

上面的命令的意思是,同時向Yarn申請3個container,其中 2 個 Container 啟動 TaskManager(-n 2),每個 TaskManager 擁有兩個 Task Slot(-s 2),并且向每個 TaskManager 的 Container 申請 800M 的內存,以及一個ApplicationMaster(Job Manager)。

Flink部署到Yarn Cluster后,會顯示Job Manager的連接細節信息。

Flink on Yarn會覆蓋下面幾個參數,如果不希望改變配置文件中的參數,可以動態的通過-D選項指定,如

-Dfs.overwrite-files=true -Dtaskmanager.network.numberOfBuffers=16368

jobmanager.rpc.address:因為JobManager會經常分配到不同的機器上

taskmanager.tmp.dirs:使用Yarn提供的tmp目錄

parallelism.default:如果有指定slot個數的情況下

yarn-session.sh會掛起進程,所以可以通過在終端使用CTRL+C或輸入stop停止yarn-session。

如果不希望Flink Yarn client長期運行,Flink提供了一種detached YARN session,啟動時候加上參數-d或—detached

在上面的命令成功后,我們就可以在 Yarn Application 頁面看到 Flink 的紀錄。

如果在虛擬機中測試,可能會遇到錯誤。這里需要注意內存的大小,Flink 向 Yarn 會申請多個 Container,但是 Yarn 的配置可能限制了 Container 所能申請的內存大小,甚至 Yarn 本身所管理的內存就很小。這樣很可能無法正常啟動 TaskManager,尤其當指定多個 TaskManager 的時候。因此,在啟動 Flink 之后,需要去 Flink 的頁面中檢查下 Flink 的狀態。這里可以從 RM 的頁面中,直接跳轉(點擊 Tracking UI)。

yarn-session.sh啟動命令參數如下:

$ yarn-session.sh --help

Usage:

Required

-n,--container <arg>   Number of YARN container to allocate (=Number of Task Managers)

Optional

-D <property=value>             use value for given property

-d,--detached                   If present, runs the job in detached mode

-h,--help                       Help for the Yarn session CLI.

-id,--applicationId <arg>       Attach to running YARN session

-j,--jar <arg>                  Path to Flink jar file

-jm,--jobManagerMemory <arg>    Memory for JobManager Container with optional unit (default: 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>            Number of YARN container to allocate (=Number of Task Managers)

-nl,--nodeLabel <arg>           Specify YARN node label for the YARN application

-nm,--name <arg>                Set a custom name for the application on YARN

-q,--query                      Display available YARN resources (memory, cores)

-qu,--queue <arg>               Specify YARN queue.

-s,--slots <arg>                Number of slots per TaskManager

-st,--streaming                 Start Flink in streaming mode

-t,--ship <arg>                 Ship files in the specified directory (t for transfer)

-tm,--taskManagerMemory <arg>   Memory per TaskManager Container with optional unit (default: MB)

-yd,--yarndetached              If present, runs the job in detached mode (deprecated; use non-YARN specific option instead)

-z,--zookeeperNamespace <arg>   Namespace to create the Zookeeper sub-paths for high availability mode
提交任務

之后,我們可以通過這種方式提交我們的任務

$ ./bin/flink run -m yarn-cluster -yn2 ./examples/batch/WordCount.jar --input /opt/wcinput/wc.txt --output /opt/wcoutput/

bin/flink run -m yarn-cluster -yn2 examples/batch/WordCount.jar --input /input/ --output /Andy

以上命令在參數前加上y前綴,-yn表示TaskManager個數。

在這個模式下,同樣可以使用-m yarn-cluster提交一個"運行后即焚"的detached yarn(-yd)作業到yarn cluster。

停止yarn cluster
yarn application -kill application_1539058959130_0001
Yarn模式的HA

應用最大嘗試次數(yarn-site.xml),您必須配置為嘗試應用的最大數量的設置yarn-site.xml,當前YARN版本的默認值為2(表示允許單個JobManager失敗)。

<property>

 <name>yarn.resourcemanager.am.max-attempts</name>

 <value>4</value>

 <description>The maximum number of application master execution attempts</description>

</property>

申請嘗試(flink-conf.yaml),您還必須配置最大嘗試次數
conf/flink-conf.yaml

yarn.application-attempts:10

示例:高度可用的YARN會話

配置HA模式和zookeeper法定人數在conf/flink-conf.yaml

high-availability: zookeeper

high-availability.zookeeper.quorum: bigdata11:2181,bigdata12:2181,bigdata13:2181

high-availability.storageDir: hdfs:///flink/recovery

high-availability.zookeeper.path.root: /flink

yarn.application-attempts: 10

配置ZooKeeper的服務器中conf/zoo.cfg(目前它只是可以運行每臺機器的單一的ZooKeeper服務器):

server.1=bigdata11:2888:3888
server.2=bigdata12:2888:3888
server.3=bigdata13:2888:3888

啟動ZooKeeper仲裁:

$ bin / start-zookeeper-quorum.sh

啟動HA群集:

$ bin / yarn-session.sh -n 2

錯誤異常

1.身份認證失敗

flink run examples/streaming/SocketWindowWordCount.jar --port 9000

Starting execution of program

------------------------------------------------------------

The program finished with the following exception:

org.apache.flink.client.program.ProgramInvocationException: Job failed. (JobID: b7a99ac5db242290413dbebe32ba52b0) at org.apache.flink.client.program.rest.RestClusterClient.submitJob(RestClusterClient.java:267) at org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:486) at org.apache.flink.streaming.api.environment.StreamContextEnvironment.execute(StreamContextEnvironment.java:66) at org.apache.flink.streaming.examples.socket.SocketWindowWordCount.main(SocketWindowWordCount.java:92) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:529) at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:421) at org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:426) at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:804) at org.apache.flink.client.cli.CliFrontend.runProgram(CliFrontend.java:280) at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:215)
at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:1044)

   at org.apache.flink.client.cli.CliFrontend.lambda$main$11(CliFrontend.java:1120)

 at java.security.AccessController.doPrivileged(Native Method)

 at javax.security.auth.Subject.doAs(Subject.java:422)

 at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754) at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)

 at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1120)

Caused by: java.net.ConnectException: Connection refused (Connection refused)

  at java.net.PlainSocketImpl.socketConnect(Native Method)

   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)

   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

   at java.net.Socket.connect(Socket.java:589)

通過查看日志,發現有如下報錯

ERRORorg.apache.flink.shaded.curator.org.apache.curator.ConnectionState  - Authentication failed

解決法案:添加定時任務認證kerberos

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。