Flink基礎系列2-Flink部署 一. Standalone模式 二.yarn模式 三. Kubernetes部署 參考:

一. Standalone模式

1.1 Standalone模式概述

  1. Flink 中每一個 TaskManager 都是一個JVM進程,它可能會在獨立的線程上執行一個或多個 subtask
  2. 爲了控制一個 TaskManager 能接收多少個 task, TaskManager 通過 task slot 來進行控制(一個 TaskManager 至少有一個 slot)
  3. 每個task slot表示TaskManager擁有資源的一個固定大小的子集。假如一個TaskManager有三個slot,那麼它會將其管理的內存分成三份給各個slot(注:這裏不會涉及CPU的隔離,slot僅僅用來隔離task的受管理內存)
  4. 可以通過調整task slot的數量去自定義subtask之間的隔離方式。如一個TaskManager一個slot時,那麼每個task group運行在獨立的JVM中。而當一個TaskManager多個slot時,多個subtask可以共同享有一個JVM,而在同一個JVM進程中的task將共享TCP連接和心跳消息,也可能共享數據集和數據結構,從而減少每個task的負載。
  1. 默認情況下,Flink 允許子任務共享 slot,即使它們是不同任務的子任務(前提是它們來自同一個job)。 這樣的結果是,一個 slot 可以保存作業的整個管道。
  2. Task Slot 是靜態的概念,是指 TaskManager 具有的併發執行能力,可以通過參數taskmanager.numberOfTaskSlots進行配置;而並行度parallelism是動態概念,即TaskManager運行程序時實際使用的併發能力,可以通過參數parallelism.default進行配置。
    舉例:如果總共有3個TaskManager,每一個TaskManager中分配了3個TaskSlot,也就是每個TaskManager可以接收3個task,這樣我們總共可以接收9個TaskSot。但是如果我們設置parallelism.default=1,那麼當程序運行時9個TaskSlot將只有1個運行,8個都會處於空閒狀態,所以要學會合理設置並行度!具體圖解如下:



conf/flink-conf.yaml配置文件中

taskmanager.numberOfTaskSlots
parallelism.default

默認值

# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.

taskmanager.numberOfTaskSlots: 1

# The parallelism used for programs that did not specify and other parallelism.

parallelism.default: 1

注:Flink存儲State用的是堆外內存,所以web UI裏JVM Heap Size和Flink Managed MEM是兩個分開的值。

1.2 standalone模式任務提交

1.2.1 Web UI提交Job

啓動Flink後,可以在Web UI的Submit New Job提交jar包,然後指定Job參數。

  1. Entry Class
    程序的入口,指定入口類(類的全限制名)

  2. Program Arguments
    程序啓動參數,例如--host localhost --port 7777

  3. Parallelism
    設置Job並行度。
    Ps:並行度優先級(從上到下優先級遞減)
    1)代碼中算子setParallelism()
    2)ExecutionEnvironment env.setMaxParallelism()
    3)設置的Job並行度
    4)集羣conf配置文件中的parallelism.default
    ps:socket等特殊的IO操作,本身不能並行處理,並行度只能是1

  4. Savepoint Path
    savepoint是通過checkpoint機制爲streaming job創建的一致性快照,比如數據源offset,狀態等。
    (savepoint可以理解爲手動備份,而checkpoint爲自動備份)
    ps:提交job要注意分配的slot總數是否足夠使用,如果slot總數不夠,那麼job執行失敗。(資源不夠調度)

1.2.2 命令行提交job

  1. 查看已提交的所有job
    如果有運行的job,此處可以查看到具體的job id
D:\flink\flink-1.9.0\bin>flink list
log4j:WARN No appenders could be found for logger (org.apache.flink.client.cli.CliFrontend).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Waiting for response...
No running jobs.
No scheduled jobs.
  1. 提交job
    -c指定入口類
    -p指定job的並行度
bin/flink run -c <入口類> -p <並行度> <jar包路徑> <啓動參數>

舉例:

$ bin/flink run -c wc.StreamWordCount -p 3 /tmp/Flink_Tutorial-1.0-SNAPSHOT.jar --host localhost --port 7777
Job has been submitted with JobID 33a5d1f00688a362837830f0b85fd75e
  1. 取消job
    bin/flink cancel <Job的ID>
$ bin/flink cancel 30d9dda946a170484d55e41358973942
Cancelling job 30d9dda946a170484d55e41358973942.
Cancelled job 30d9dda946a170484d55e41358973942.

注:Total Task Slots只要不小於Job中Parallelism最大值即可。
eg:這裏我配置文件設置taskmanager.numberOfTaskSlots: 4,實際Job運行時總Tasks顯示9,但是裏面具體4個任務步驟分別需求(1,3,3,2)數量的Tasks,4>3,滿足最大的Parallelism即可運行成功。

二.yarn模式

以Yarn模式部署Flink任務時,要求Flink是有 Hadoop 支持的版本,Hadoop 環境需要保證版本在 2.2 以上,並且集羣中安裝有 HDFS 服務。

2.1 Flink on yarn

Flink提供了兩種在yarn上運行的模式,分別爲Session-Cluster和Per-Job-Cluster模式。

2.1.1 Session-Cluster模式

Session-Cluster 模式需要先啓動集羣,然後再提交作業,接着會向 yarn 申請一塊空間後,資源永遠保持不變。如果資源滿了,下一個作業就無法提交,只能等到 yarn 中的其中一個作業執行完成後,釋放了資源,下個作業纔會正常提交。所有作業共享 Dispatcher 和 ResourceManager;共享資源;適合規模小執行時間短的作業。



在 yarn 中初始化一個 flink 集羣,開闢指定的資源,以後提交任務都向這裏提交。這個 flink 集羣會常駐在 yarn 集羣中,除非手工停止。

2.1.2 Per-Job-Cluster模式

一個 Job 會對應一個集羣,每提交一個作業會根據自身的情況,都會單獨向 yarn 申請資源,直到作業執行完成,一個作業的失敗與否並不會影響下一個作業的正常提交和運行。獨享 Dispatcher 和 ResourceManager,按需接受資源申請;適合規模大長時間運行的作業。

每次提交都會創建一個新的 flink 集羣,任務之間互相獨立,互不影響,方便管理。任務執行完成之後創建的集羣也會消失。

2.2 Session Cluster

  1. 啓動hadoop集羣(略)

  2. 啓動yarn-session
    ./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
    其中:
    1)-n(--container):TaskManager的數量。
    2)-s(--slots):每個TaskManager的slot數量,默認一個slot一個core,默認每個taskmanager的slot的個數爲1,有時可以多一些taskmanager,做冗餘。
    3)-jm:JobManager的內存(單位MB)。
    4)-tm:每個taskmanager的內存(單位MB)。
    5)-nm:yarn 的appName(現在yarn的ui上的名字)。
    6)-d:後臺執行。

  3. 執行任務
    ./flink run -c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar --host lcoalhost –port 7777

  4. 去 yarn 控制檯查看任務狀態


  5. 取消 yarn-session
    yarn application --kill application_1577588252906_0001

2.3 Per-Job-Cluster

  1. 啓動hadoop集羣(略)
  2. 不啓動yarn-session,直接執行job
/flink run –m yarn-cluster -c com.atguigu.wc.StreamWordCount FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar --host lcoalhost –port 7777

三. Kubernetes部署

容器化部署時目前業界很流行的一項技術,基於Docker鏡像運行能夠讓用戶更加方便地對應用進行管理和運維。容器管理工具中最爲流行的就是Kubernetes(k8s),而Flink也在最近的版本中支持了k8s部署模式。

  1. 搭建Kubernetes集羣(略)
  2. 配置各組件的yaml文件
    在k8s上構建Flink Session Cluster,需要將Flink集羣的組件對應的docker鏡像分別在k8s上啓動,包括JobManager、TaskManager、JobManagerService三個鏡像服務。每個鏡像服務都可以從中央鏡像倉庫中獲取。
  3. 啓動Flink Session Cluster
// 啓動jobmanager-service 服務
kubectl create -f jobmanager-service.yaml
// 啓動jobmanager-deployment服務
kubectl create -f jobmanager-deployment.yaml
// 啓動taskmanager-deployment服務
kubectl create -f taskmanager-deployment.yaml
  1. 訪問Flink UI頁面
    集羣啓動後,就可以通過JobManagerServicers中配置的WebUI端口,用瀏覽器輸入以下url來訪問Flink UI頁面了:
http://{JobManagerHost:Port}/api/v1/namespaces/default/services/flink-jobmanager:ui/proxy

參考:

  1. https://ashiamd.github.io/docsify-notes/#/study/BigData/Flink/%E5%B0%9A%E7%A1%85%E8%B0%B7Flink%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0?id=_3-flink%e9%83%a8%e7%bd%b2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章