flink實戰教程-集羣的部署

MiniCluster

這種模式我們一般是在用IDE調試程序的時候用到,當我們在本地用IDE開發程序的時候,執行main方法,flink會在本地啓動一個包含jobmanager和taskmanager的進程的minicluster,程序運行完成之後,這個cluster進程退出。

Standalone

這種模式就是直接在物理機上啓動flink集羣。我們可以通過 FLINKHOME/bin/startcluster.shjobmanagertaskmanager,使flink{FLINK_HOME}/bin/start-cluster.sh 命令 啓動帶有一個jobmanager和一個taskmanager的集羣,此時使用的flink的配置是{FLINK_HOME}/conf/flink-conf.yaml.
此外,我們可以用 ${FLINK_HOME}/bin/taskmanager.sh start 再啓動一個taskmanager。

這時我們通過jps命令查看一下啓動的進程

76085 StandaloneSessionClusterEntrypoint
76331 TaskManagerRunner
76846 TaskManagerRunner

我們看到這時候啓動了兩個taskmanager

這種部署模式對flink集羣的資源管理是flink自己維護的,在生產環境下用的不多,所以我們也不做過多描述.

yarn

yarn session

  • 部署在yarn集羣上的flink集羣都是把資源的管理交給了yarn來管理。
  • yarn session的部署模式就是先預先在yarn集羣上啓動一個flink集羣,我們可以把我們寫好的flink任務直接提到這個集羣上。

啓動集羣的命令如下:


${FLINK_HOME}/bin/yarn-session.sh

這個命令有很多的參數,可以在後面加 -h 看下,我這裏着重介紹一下 -d參數。
加上-d之後,指的是隔離模式,也就是啓動之後和客戶端就斷了聯繫,如果要停止集羣,需要通過yarn application -kill {applicationId} 來停止集羣.

  • 如果沒指定-d,這種情況集羣會和客戶端一直保持着連接,客戶端退出之後,集羣也會退出。

  • 提交任務
    往yarn session集羣提交任務,只需要在相應的客戶端機器上,通過${FLINK_HOME}/bin/flink run -d user.jar 這樣的命令就可以提交到session集羣.

    此外我們還可以通過web ui最後一項來提交任務

  • 這種session模式一般適用於批任務,也就是執行一段時間以後可以終止的任務,因爲對於這種短時間執行的任務,可以避免在申請資源方面浪費過多時間。

  • 集羣啓動之後,是沒有給flink集羣分配資源的,當提交任務之後,yarn集羣會根據請求再給任務分配資源,任務執行完成之後,系統隔一段時間會釋放相應的資源.(這個時間是可配置的,爲了防止馬上有任務又來了,重新申請資源)

yarn per job

  • 我們上面講了session模式部署集羣,這種模式可以在一個集羣裏跑很多的任務,這些任務共享了flink集羣的資源,隔離性做的不是很好,所以flink還提供了另外一種執行模式:yarn per job模式。

  • 這種模式會在yarn上爲每個flink任務都建立一個單獨的集羣,優勢就是每個任務單獨的進行資源管理,和其他任務資源隔離。這種模式適用於對啓動時間不太敏感,需要長時間運行的流任務。

  • 啓動命令


${FLINK_HOME}/bin/flink run -d -p 4 -ys 2 -m yarn-cluster -c com.example.Test userjar.jar arg1 arg2

提交成功之後,我們會在yarn的管理頁面看到一個類似的任務

這個啓動命令也有很多的參數,我就不一一講解了,我用大白話講講我認爲最核心的幾個參數。

  1. -d 採用分離模式
  2. -p 程序的並行度
  3. -ys 每個taskmanager有幾個slot,我們可以簡單的理解爲flink會把taskmanager的內存分成幾份,在某些條件下,程序可以共用slot,提高效率,至於slot的概念,我們後續再講,今天就不多說了。用並行度除以這個值,然後就會得到flink會啓動幾個taskmanager
    ,所以爲了避免有多餘的slot,我們最好設置並行度除以這個ys值能整除。
  4. -c 程序的入口類,我們可以在程序打包的時候指定入口類,如果沒有指定或者程序中有很多類,我們就需要通過這個-c參數來指定入口類了。
  5. 在命令行最後的參數是用戶jar包的參數.
  • 停止命令
    第一,我們可以在flink的頁面上通過停止flink的任務來停止集羣,在我們停止了flink任務之後,yarn會自動釋放相應的資源。

第二,通過命令行來停止:

${FLINK_HOME}/bin/flink stop -m yarn-cluster -yid application_1592386606716_0005 c8ee546129e8480809ee62a4ce7dd91d

這個時候需要指定yarn applicationId和flink job id
第三,通過程序來停止

https://blog.csdn.net/zhangjun5965/article/details/106820591

如果我們做了一個實時平臺這樣的系統,就不能手工通過命令行來停止了,可以調用相應的api來停止任務.

  • 啓動流程
    當我們執行完相應的命令之後,系統會把flink的jar、相關的配置文件、用戶的jar都上傳到hdfs
    的一個臨時目錄,默認是/user/{USER}/.flink/{applicationId},
    然後再構建flink集羣的時候,再去找個目錄去獲取,程序部署成功之後,刪除相應的臨時目錄

application模式

這種模式是在flink 1.11 版本中提供的,flink的yarn per job模式啓動的時候會把本地的flink的jar和用戶的jar都上傳到hdfs,這個過程非常的消耗網絡的帶寬,如果同時有多個人提交任務的話,那麼對網絡的影響就更大,此外,每次提交任務的時候flink的jar包是一樣的,也不用每次都拷來拷去的,所以flink提供了一種新的application模式,可以把flink的jar和用戶的jar都預先放到hdfs上,這樣就能省去yarn per job模式提交任務的jar包拷貝工作,節省了帶寬,加快了提交任務的速度.

具體的命令如下:


./bin/flink run-application -p 1 -d -t yarn-application \
-yD yarn.provided.lib.dirs="hdfs://localhost/data/flink/libs/" \
hdfs://localhost/data/flink/user-lib/TopSpeedWindowing.jar

-yD yarn.provided.lib.dirs :用來指定存放flink jar的目錄
最後一個參數是用戶的jar在hdfs上的路徑.

說一下題外話,其實我們當時在做實時平臺的時候,這個提交慢的問題我也發現了,當時我的想法是先啓動一個flink集羣,然後再把程序的JobGraph提交到這個yarn集羣,不過後來嘛,由於 *%%$$#^& 的原因,也沒弄.

k8s

對於把服務容器化,也越來越成爲一種趨勢,所以k8s部署也越來越受大家的重視。 對於k8s部署flink這塊說實話我研究的不是很深,也就不多說了。

其他

我們還可以將程序部署到mesos或者使用docker,這個我沒有去實際調研過,但是從flink的郵件列表大家溝通的問題或者是網上查到的資料看,這種模式部署應該不多,所以這裏就不詳細描述了。

歡迎關注我的公衆號【大數據技術與應用實戰】,獲取更多大數據實戰案例.
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章