003 基于 YARN 模式部署 Flink 服務

這將是一套完整詳細且持續更新的、長期維護的 原創 Flink系列教程、文檔,其中會包含各種商用實例詳解、Flink源碼講解、機制剖析、周邊組件講解等,旨在幫助開發者快速融入Flink開發,或作為工具文檔參閱。也希望更多的開發者可以參與到大數據相關的技術討論中來,共同商討疑難雜癥,豐富社區。——盡際

本文標題: 基于 YARN 模式部署 Flink 服務

文章作者: 盡際

發布時間: 2019年07月28日 - 23:02:30

最后更新: 2019年07月28日 - 23:02:30

原始鏈接:

許可協議: 署名-非商業性使用-禁止演繹 4.0 國際 轉載請保留原文鏈接及作者。


三、 基于 YARN 模式部署 Flink 服務

3.1 基于 YARN 運行 Flink 服務的原理

在 YARN 上啟動 Flink 服務的過程如圖3-1 所示(Flink 官方圖示)。

  • 圖3-1 在 YARN 上啟動 Flink 服務的過程
    YARN 上啟動 Flink 服務的過程.png

3.1.1 Flink-Session 方式

下面將對圖3-1 所示內容進行闡述。

  1. 準備資源

    • 發現配置

      想要讓 Flink 服務運行與 YARN 之上,首先需要讓 Flink 能夠發現 YARN 和 HDFS 的相關配置,因此,需要通過 YARN_CONF_DIRHADOOP_CONF_DIRHADOOP_CONF_PATH 屬性來指定 Hadoop 配置文件所在目錄。

      提示:上述 3 個屬性,指定其中之一即可,如果全部指定,將按照指定順序加載。習慣上,常用 HADOOP_CONF_DIR 屬性指定。

    • 檢查可用物理資源

      檢查 YARN 集群中的可用內存虛擬機CPU內核是否充足,如果充足,則進行下一步。

    • 上傳資源。

      然后,啟動 Flink 服務時,會根據 Hadoop 配置,將 Flink 服務依賴的 Jar 包和配置文件上傳至 HDFS。

  2. 裝配Application Master容器

    此時為了開啟 YARN 的 Application Master 服務,需要一個準備好的 Container 實例。這個過程會伴隨如下步驟。

    • 注冊 Container 所需資源

      將上一步上傳的配置文件和 jar 包(統稱為Container外部資源)注冊為即將創建的 Container 內部的資源。這個過程其實是將 外部資源的存放路徑(HDFS上)賦值給 Container 內部的變量。

    • 分配 NodeManager 并實例化 Container

      根據 Container 中注冊(存儲)的外部資源的路徑,下載對應配置文件和 Jar 包到 Container 所在的機器節點,然后完成該 Container 的實例化。

    • 啟動 Application Master

      該 Container 實例化完成后(在某個NodeManager上),即可啟動 Application Master 服務。

  3. 啟動 JobManager 服務

    Application Master 服務啟動成功后,會啟動 Flink 的 JobManager 服務,它將與 ApplicationMaster 服務在同一個 Container 上運行,因此與 ApplicationMaster 通信的客戶端(YarnClusterClient)就可以將 JobManager的地址(與ApplicationMaster相同)暴露返回給客戶端。從而在后續提交 Job 的過程中,可以知道向哪個 JobManager 提交 Flink Job。

    提示:由于ApplicationMaster 和 JobManager 是隨機(某種程度上)在某個 NodeManager 的 Container 上運行的,因此,一個 YARN 集群可以運行多個 ApplicationMaster 和 JobManager 實例。

    至此,已經完成了在 YARN 上開啟一個 Flink Session 的過程。

  4. 提交 Flink Job

    在向 JobManager 提交 Flink Job 時,才會分配 TaskManager 所需的 Container(容器),具體步驟如下。

    • 提交任務

      找到某個已經開啟的 Flink Session,并找到該 Session 下的 JobManager 通信地址,然后發起提交Flink Job 請求。

    • 分配 Container 開啟 TaskManager

      根據 Flink Job 中配置的相關參數,開啟指定個數,指定內存占用的 TaskManager,并開始執行任務,執行完畢后,回收該 TaskManager 及 Containner。注意,此時并不會回收 JobManager,因而,在這種方式下,同一個 Flink Session 可以用于執行多個 Flink Job。

    至此,在 YARN 上啟動 Flink Session 并提交運行 Flink Job 的過程就結束了。

3.1.2 Flink Single Job 方式

Flink Single Job 方式,也稱之為 Flink Per Job 方式。這種方式與 Flink Session 方式大體相同,不同的是Single Job 方式不必提前在 YARN 上開啟 JobManager,而是每次提交 Flink Job 的時候,動態創建 JobManager(也在Containner中),然后啟動 TaskManager(Container中) 執行任務。然后再Flink Job 結束后,銷毀釋放本次 Job 所使用的 JobManager 和 TaskManager。可以理解為是一次性的 Flink Session。

了解完上述內容之后,我們將基于兩種方式在 YARN 上創建 Flink 服務并提交 Flink Job。

3.2 基于 YARN 模式部署 Flink 服務(Flink-Session 方式)

了解了 Flink on YARN 的基本概念后,開始根據如下步驟部署服務吧。

在本例中,YARN 服務分布情況見表3-1。

  • 表3-1 YARN 服務分布情況

    linux01 linux02 linux03
    - Resourcemanager -
    NodeManager NodeManager NodeManager

    提示:需要開啟 YARN 高可用開發者可參考筆者之前的文章自行配置。此時開發者必須確保 YARN 服務已經正常運行,并且開啟了 Hadoop 的 JobHistoryServer 服務

  1. 解壓 Flink 壓縮包

    將Flink壓縮包上傳至第一臺虛擬機的 ~/softwares/installations 目錄后,使用如下命令進行解壓:

    $ tar -zxf tar -zxf ~/softwares/installations/flink-1.8.1-bin-scala_2.11.tgz -C ~/modules/
    
  2. 為當前會話設置 Hadoop 環境變量

    當前會話是指通過 ssh 訪問 Linux的客戶端,比如 xShell 中的某一個窗口,或者 CRT 中的某個窗口。

    想要讓 Flink 服務運行與 YARN 之上,首選,需要讓 Flink 能夠發現 Hadoop 的相關配置,操作命令如下:

    $ pwd
    /home/admin/modules/flink-1.8.1
    $ export HADOOP_CONF_DIR=/home/admin/modules/hadoop-2.7.2/etc/hadoop
    $ export HADOOP_HOME=/home/admin/modules/hadoop-2.7.2
    $ export HADOOP_CLASSPATH=`/home/admin/modules/hadoop-2.7.2/bin/hadoop classpath`
    

    完成上述命令后,在當前會話中可以通過如下命令查看對應的變量是否被正確賦值:

    $ echo $HADOOP_CLASSPATH
    輸出如下:
    /home/admin/modules/hadoop-2.7.2/etc/hadoop:/home/admin/modules/hadoop-2.7.2/share/hadoop/common/lib/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/common/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/hdfs:/home/admin/modules/hadoop-2.7.2/share/hadoop/hdfs/lib/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/hdfs/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/yarn/lib/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/yarn/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/mapreduce/lib/*:/home/admin/modules/hadoop-2.7.2/share/hadoop/mapreduce/*:/home/admin/modules/hadoop-2.7.2/contrib/capacity-scheduler/*.jar
    

    輸出上述內容后,即證明為當前會話成功配置了 Hadoop 環境變量。

    提示:在生產環境中,也多用這種臨時導入Hadoop環境變量的方式進行配置,即每次新的 ssh 會話中操作Flink on YARN都會提前 export Hadoop相關的環境變量。開發者也可選擇將上述命令封裝到某個腳本中,以方便后續操作。

  3. 合理配置依賴包

    • 添加 Flink-Table 依賴包

      在生產環境中,開發者開發的 Flink 應用程序可能會伴隨 Table API 的操作(支持以 SQL 的方式進行數據分析),因此,開發者需要將 Flink 安裝目錄下的 opt 中的 flink-table_2.11-1.8.1.jar 包拷貝到 lib 目錄中。操作命令如下所示:

      $ pwd
      /home/admin/modules/flink-1.8.1
      $ cp -a opt/flink-table_2.11-1.8.1.jar lib/
      
    • 添加 Hadoop 依賴包

      將之前下載好的 flink-shaded-hadoop-2-uber-2.7.5-7.0.jar 包移動至 Flink 安裝目錄的 lib 目錄中,使 Flink 能夠支持對 Hadoop 的操作。操作命令如下所示:

      $ pwd
      /home/admin/modules/flink-1.8.1
      $ cp -a ~/softwares/installations/flink-shaded-hadoop-2-uber-2.7.5-7.0.jar ./lib/
      

    以上操作完成后,即可看到 lib 目錄下的內容如下所示:

    $ ll lib/
    flink-dist_2.11-1.8.1.jar
    flink-shaded-hadoop-2-uber-2.7.5-7.0.jar
    flink-table_2.11-1.8.1.jar
    log4j-1.2.17.jar
    slf4j-log4j12-1.7.15.jar
    

提示:Flink on YARN模式中,不需要每臺節點都安裝 Flink,只需要在操作的節點上,安裝 Flink 即可。

  1. 在 YARN 上啟動 Flink-Session

    在 YARN 上運行一個 Flink-Session,操作命令如下:

    ${FLINK_HOME}/bin/yarn-session.sh […]
    

    例如:

    $ pwd
    /home/admin/modules/flink-1.8.1
    $ bin/yarn-session.sh -n 2 -jm 512m -tm 1024m
    

    上述命令執行完畢后,即可在 YARN 的 8088 端口(Resourcemanager 后臺管理頁面)看到有一個 YARN 任務處于正在運行的狀態,如圖3-2 所示。

    • 圖3-2 Resourcemanager 后臺管理頁面
      Resourcemanager 后臺管理頁面.png

此時,單擊 ApplicationMaser 按鈕,即可進入 Flink 的后臺管理頁面,如圖3-3 所示。

  • 圖3-3 Flink 后臺管理頁面
    Flink 后臺管理頁面.png

提示:由于現在沒有運行任何 Flink Job,因此,該Flink-Session 中還沒有分配 Container 來運行 TaskManager。因此,在上圖中看到的 TaskManager 數量為 0。

如果此時需要關閉該 Flink-Session,在控制臺輸入 stop 即可。

但是,如果在啟動Flink-Session時,通過添加 -d 參數,開啟了 detached,則可以通過 YARN 的 kill 命令,來關閉該 Flink-Session,命令如下:

$ {HADOOP_HOME}/bin/yarn application -kill <application_id>
  1. 提交 Flink Job 到指定的 Flink-Session中

    首先,查看剛才啟動 Flink-Session 時,控制臺返回的 JobManager 通信地址為 linux01:42535(或記錄當前Flink-Session 的 applicaitonID為 application_1564330446958_0001),如圖3-4 所示。

    • 圖3-4 Flink-Session 中 JobManager 的通信地址
      Flink-Session地址.png

然后,開啟一個新的 ssh 會話,重新導入 Hadoop 環境變量,命令如下:

$ export HADOOP_CONF_DIR=/home/admin/modules/hadoop-2.7.2/etc/hadoop
$ export HADOOP_HOME=/home/admin/modules/hadoop-2.7.2
$ export HADOOP_CLASSPATH=`~/modules/hadoop-2.7.2/bin/hadoop classpath`

接著,提交 Flink Job 到指定的 Flink-Session上運行,命令如下(-m 參數的方式):

$ pwd
/home/admin/modules/flink-1.8.1
$ bin/flink run \
-m linux01:42535 \
-p 1 \
./examples/batch/WordCount.jar

或者,使用命令如下(-yid 參數的方式):

$ pwd
/home/admin/modules/flink-1.8.1
$ bin/flink run \
-yid application_1564330446958_0001 \
-p 1 \
./examples/batch/WordCount.jar

提示:如果在提交 Flink Job 到 Flink-Session 的過程中,沒有通過 -m 或 -yid 參數指定目標 Session,則默認將Flink Job 提交到最后一個開啟的 Flink-Session 上。

上述兩條命令分別運行測試后,即可在 Job Manager的后臺管理頁面看到如圖3-5 所示內容。

  • 圖3-5 Flink Job 在 Session 上運行成功
    Flink Job 運行成功.png

3.3 基于 YARN 模式部署 Flink 服務(Flink-Single[Per] Job 方式)

  1. 前置準備

    這部分的準備工作與3.2 小節中的 1~3 的操作內容一致,不再贅述。

  2. 在 YARN 上啟動并提交 Flink-Single Job

    前文提到過,Single Job這種方式為一次性執行,即,當前 Flink Job 執行完畢,立即釋放銷毀 JobManager 和 TaskManager。因此,它的操作過程將非常簡單。這種模式一般多用于執行長期運行的流式處理作業(Flink Streaming Job)。

    在這種方式下,開啟服務并提交 Flink Job 的命令如下:

    $ export HADOOP_CONF_DIR=/home/admin/modules/hadoop-2.7.2/etc/hadoop
    $ export HADOOP_HOME=/home/admin/modules/hadoop-2.7.2
    $ export HADOOP_CLASSPATH=`~/modules/hadoop-2.7.2/bin/hadoop classpath`
    $ bin/flink run \
    -m yarn-cluster \
    -p 10 \
    -yn 5 \
    ./examples/batch/WordCount.jar
    

    提示:Single Job 這種方式下,-m 參數的固定值為 yarn-cluster,-p 參數為任務并行度,-yn 為開啟的TaskManager 個數。

    運行后,查看 Job 狀態的方式與 3.2 小節相同。

3.4 相關重要參數說明

3.4.1 開啟 Flink-Session 的重要參數

重要參數見表3-2 。

  • 表3-2 開啟 Flink-Session 的重要參數

    參數名 含義
    -d 開啟detached模式。
    -jm JobManager的內存,單位:MB。
    -nm 該Flink Cluster在YARN上對應的application名稱。
    -s 每一個TaskManager上的slots數量。
    -tm 每一個TaskManager的內存,單位:MB。
    -nm 當前Application的名稱。

3.4.2 向 Flink-Session 提交 Flink Job 的重要參數

重要參數見表3-3。

  • 表3-3 向 Flink-Session 提交 Flink Job 的重要參數

    參數名 含義
    -m JobManager地址。-m 與 -yid 二選一。
    -yid YARN 的 ApplicationId。-m 與 -yid 二選一。

    關于提交 Flink Job 的其余重要參數見 3.4.3 小結。

3.4.3 提交 Single Job 的重要參數

重要參數見表3-4。

  • 表3-4 提交 Single Job 的重要參數

    參數名 含義
    -m 固定為yarn-cluster
    -yj Flink jar的所在目錄。一般為Flink根目錄下的lib目錄。
    -yjm 指定JobManager所在的Container內存。單位:MB。
    -yn 為TaskManager數量。
    -ynm YARN中application的名稱。
    -ys 每一個TaskManager中slots的數量。
    -ytm 每一個TaskManager Container的內存,單位MB。
    -c 指定Job對應的jar包中主函數所在類名。

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

推薦閱讀更多精彩內容