Flink 架構(gòu)

前言

Flink 是一個(gè)多功能框架,能夠以組合形式適配許多不同的部署場(chǎng)景。
在接下來(lái)的文章中,我們大致介紹了 Flink 集群的組成部分,它們的作用以及不同的實(shí)現(xiàn)方法。

1、架構(gòu)總覽

下圖展示了 Flink 集群的組成架構(gòu)。


Flink 架構(gòu)總覽
  • client:處理 Flink 應(yīng)用代碼,將代碼轉(zhuǎn)換成 JobGraph 形式然后提交給 JobManager
  • JobManager:分發(fā)工作,將各 Job 的任務(wù)分發(fā)給各個(gè) TaskManager
  • TaskManager:真正處理工作的組件,運(yùn)行 sources、transformations 以及 sinks 等算子

在實(shí)際部署 Flink 的過(guò)程中,通常每個(gè)組件都有多種實(shí)現(xiàn),我們會(huì)在后文中進(jìn)行介紹。

2、Flink 固有組件

2.1 Flink Client

2.1.1 作用

  • 將批處理或者流處理應(yīng)用編譯成 dataflow graph
  • 將 JobGraph 提交給 JobManager

2.1.2 實(shí)現(xiàn)

2.2 JobManager

2.2.1 作用

JobManager 被稱為 Flink 的中心工作調(diào)度組件。根據(jù)資源提供商的不同,在 HA、資源分配以及不同作業(yè)提交模式的支持性方面均有不同的實(shí)現(xiàn)方法。
相關(guān)進(jìn)程從功能上可以分為以下3類:

  • ResourceManager:負(fù)責(zé) Flink 集群中的資源(即:task slots,集群資源調(diào)度的基本單元)調(diào)配工作。僅能調(diào)度已有的 slots,無(wú)法自己?jiǎn)?dòng)新的 TaskManagers。
  • Dispatcher:提供一個(gè) REST 風(fēng)格的接口用以提交 Flink 應(yīng)用的執(zhí)行請(qǐng)求。為每個(gè)提交過(guò)來(lái)的 job 啟動(dòng)一個(gè) JobMaster 進(jìn)程。同時(shí)提供 Flink WebUI 用以提供集群中 job 的執(zhí)行情況。
  • JobMaster:負(fù)責(zé)管理單個(gè) JobGraph 的執(zhí)行過(guò)程。同一個(gè)集群中可以同時(shí)運(yùn)行多個(gè) job,每個(gè) job 都有自己的 JobMaster。

Flink 集群中至少會(huì)有一個(gè) JobManager,如果開(kāi)啟了高可用模式,則會(huì)有多個(gè),其中一個(gè)是 leader,其他的是 standby 狀態(tài)。

根據(jù)不同的作業(yè)提交模式,JobManager 可以分為以下三種模式:

  • Application Mode:?jiǎn)渭褐慌軉螒?yīng)用。job 的 main 方法在 JobManagers 上執(zhí)行,且支持多次調(diào)用應(yīng)用的 execute/executeAsync 接口
  • Per-Job Mode:?jiǎn)渭褐慌軉?job。job 的 main 方法在 client 端執(zhí)行
  • Session Mode:一個(gè)集群運(yùn)行多個(gè)應(yīng)用,各應(yīng)用的 jobs 共享集群資源

2.2.2 實(shí)現(xiàn)

2.3 TaskManager

2.3.1 作用

TaskManager 又被稱為 workers,每個(gè) TaskManager 其實(shí)就是一個(gè) JVM 進(jìn)程,通過(guò)不同線程處理不同的子任務(wù),對(duì)數(shù)據(jù)流中的數(shù)據(jù)執(zhí)行各種算子、緩存并交換數(shù)據(jù)流。
集群中最少要有一個(gè) TaskManager,TaskManager 中最小的調(diào)度單元被稱為 task slot,TaskManager 中的 task slot 數(shù)量體現(xiàn)了可以同時(shí)處理 task 的數(shù)量,默認(rèn)情況下一個(gè) TaskManager 進(jìn)程有一個(gè) job slot,通過(guò)配置 taskmanager.numberOfTaskSlots可以設(shè)置更多的 job slot。注意,同一個(gè) task slot 中可能會(huì)執(zhí)行多個(gè)算子。

關(guān)于 Tasks 與 算子鏈
為實(shí)現(xiàn)分布式執(zhí)行,F(xiàn)link 會(huì)將算子的 subtasks 鏈接成 task,每個(gè) task 都用一個(gè)線程來(lái)執(zhí)行。這是一個(gè)很有用的策略:它減少了線程之間切換和緩沖的開(kāi)銷,在降低延遲的同時(shí)提高了整體吞吐量。鏈接行為是可以配置的,詳情點(diǎn)此

3、Flink 外部組件

3.1 HA 服務(wù)提供商

Flink 的 JobManager 組件可以以 HA 模式運(yùn)行,該模式允許 Flink 能夠從 JobManager 故障中自動(dòng)恢復(fù)。為了保證更快的故障恢復(fù),會(huì)啟動(dòng)多個(gè)備份 JobManager 實(shí)例,隨時(shí)做好準(zhǔn)備。
目前已有下面兩種實(shí)現(xiàn):

3.2 文件存儲(chǔ)及持久性實(shí)現(xiàn)

Flink 依賴外部文件存儲(chǔ)系統(tǒng)來(lái)實(shí)現(xiàn)其 checkpoint 機(jī)制,即:流式作業(yè)的恢復(fù)機(jī)制,詳見(jiàn) FileSystems

3.3 資源提供商

Flink 可以部署到多種資源提供商平臺(tái),如:Kubernetes、YARN 以及 Mesos。
各平臺(tái)具體實(shí)現(xiàn)參考 JobManager。

3.4 指標(biāo)存儲(chǔ)

Flink 各組件報(bào)告指標(biāo),且 Flink job 還會(huì)額外報(bào)告 job 本身特有的指標(biāo)。
詳見(jiàn) Metrics Reporter。

3.5 應(yīng)用數(shù)據(jù) Sources 以及 Sinks

Sources:數(shù)據(jù)來(lái)源,如文件、目錄、sockets 等
Sinks:Flink 生成數(shù)據(jù)去向,如寫(xiě)入文件、打印到標(biāo)準(zhǔn)輸出或者 sockets 等

嚴(yán)格意義上來(lái)說(shuō),在部署 Flink 集群時(shí),應(yīng)用數(shù)據(jù)的 Sources 以及 Sinks 并不屬于任何組件,而是在設(shè)計(jì)新 Flink 生產(chǎn)集群之初就要考慮進(jìn)去的。將常用數(shù)據(jù)與 Flink 合并可以獲得顯著的性能優(yōu)勢(shì)。

3.5.1 常用的 Sources 以及 Sinks:

詳見(jiàn) Connectors。

4、部署模式

Flink 可以通過(guò)以下三種方法來(lái)運(yùn)行應(yīng)用:

  • Application Mode
  • Per-Job Mode
  • Session Mode

不同之處在于:

  • 集群生命周期以及資源隔離保障
  • 應(yīng)用main方法的執(zhí)行位置:在 client 端還是在集群中
Flink 部署模式

4.1 Application Mode

在其他運(yùn)行模式中,應(yīng)用的main方法都是在 client 端執(zhí)行的,執(zhí)行過(guò)程包括本地下載應(yīng)用的依賴、執(zhí)行main方法并將應(yīng)用轉(zhuǎn)換成 Flink 運(yùn)行時(shí)可以理解的形式(如: JobGraph),然后將依賴以及 JobGraph 提交給集群。這個(gè)過(guò)程需要大量的寬帶來(lái)完成依賴下載以及二進(jìn)制文件的提交工作,同時(shí)需要 CPU 來(lái)執(zhí)行main方法,使得 Client 成為了一個(gè)資源消耗大頭,當(dāng) Client 被多個(gè)用戶共享時(shí),這個(gè)問(wèn)題將變得尤其明顯。

基于上述問(wèn)題的考慮,Application Mode 采取了不同的處理機(jī)制,在此模式下,F(xiàn)link 會(huì)為每個(gè)應(yīng)用創(chuàng)建一個(gè)集群,并且選擇在 JobManager 上運(yùn)行該應(yīng)用的main方法。新創(chuàng)建的集群資源,只會(huì)被同一個(gè)應(yīng)用的 job 共享使用,并且當(dāng)應(yīng)用執(zhí)行結(jié)束時(shí),集群也會(huì)隨之被釋放。通過(guò)這種架構(gòu),用戶能夠像 Per-Job Mode 一樣實(shí)現(xiàn)資源隔離以及負(fù)載均衡,當(dāng)然是從應(yīng)用的粒度來(lái)說(shuō)。

把應(yīng)用main方法的執(zhí)行過(guò)程放到 JobManager 上可以節(jié)省 CPU,也減少了本地下載依賴的寬帶開(kāi)銷。同時(shí),由于本應(yīng)用所有 Job 都共享一個(gè) JobManager,集群在下載應(yīng)用程序的依賴項(xiàng)時(shí),可以更均勻地平衡網(wǎng)絡(luò)負(fù)載。

注意:由于 Application Mode 將main方法的執(zhí)行過(guò)程安排在集群里而不是 client 端,這可能會(huì)對(duì)應(yīng)用的代碼有影響。舉個(gè)例子,代碼中使用registerCachedFile()方法注冊(cè)的所有路徑,都必須能夠被本應(yīng)用所屬集群的 JobManager 訪問(wèn)。

相比于 Per-Job Mode,Application Mode 允許 client 提交包含多個(gè) jobs 的應(yīng)用。應(yīng)用中各 job 的執(zhí)行順序由該 job 的觸發(fā)方式?jīng)Q定。如果使用execute()方法觸發(fā) job,執(zhí)行過(guò)程會(huì)阻塞,只有上一個(gè) job 完成后,下一個(gè) job 才會(huì)被執(zhí)行到。如果使用executeAsync()方法觸發(fā) job,執(zhí)行過(guò)程不會(huì)阻塞,不管上一個(gè) job 是否已完成,這個(gè) job 都會(huì)開(kāi)始執(zhí)行。

注意:當(dāng)應(yīng)用中包含多個(gè) job 時(shí),集群將不支持 HA

4.2 Per-Job Mode

Per-Job Mode 利用 YARN、Kubernetes 這樣的資源提供框架為每個(gè) client 提交的 job 創(chuàng)建一個(gè)集群,以實(shí)現(xiàn)更好的資源隔離機(jī)制。創(chuàng)建的集群,僅限該 job 使用,當(dāng) job 執(zhí)行完成后,集群就會(huì)被釋放,包括所有的資源(文件等)。這種情況下,job 執(zhí)行異常時(shí),破壞的也僅僅是它自己的 TaskManagers,可以帶來(lái)更好的資源隔離體驗(yàn)。除此之外,由于每個(gè) job 的集群是獨(dú)立的,JobManagers 之間的 book-keeping 負(fù)載開(kāi)銷也更均衡。也正是由于這些原因,Per-Job 模式下的資源分配模型更加受許多生產(chǎn)環(huán)境實(shí)施的喜愛(ài)。

4.3 Session Mode

Session Mode 假設(shè)已經(jīng)有一個(gè)運(yùn)行的集群,并且使用該集群的資源來(lái)執(zhí)行所有提交的應(yīng)用。
集群中應(yīng)用共享集群資源,并因此產(chǎn)生競(jìng)態(tài),這樣做的好處是,你不必費(fèi)力為每個(gè)提交的 job 創(chuàng)建集群,但是,如果某個(gè) job 執(zhí)行異?;蛘邠p壞了某個(gè) TaskManager,該 TaskManager 上運(yùn)行的其他所有 job 也會(huì)受影響,因此除了那個(gè)執(zhí)行異常的 job 受影響之外,通常還意味著出現(xiàn)大規(guī)模的恢復(fù)過(guò)程,所有重啟的 job 都會(huì)讀取文件系統(tǒng),造成其他服務(wù)無(wú)法訪問(wèn)。除此之外,在單集群中運(yùn)行多個(gè) job 會(huì)給 JobManager 帶來(lái)更高的負(fù)載,因?yàn)樗枰?book-keeping 集群中所有的 job。

4.4 總結(jié)

Session Mode 模式 Flink 集群的生命周期跟集群中運(yùn)行的 job 無(wú)關(guān),是獨(dú)立運(yùn)行的,集群資源被所有 job 共享。
Per-Job 模式為了提供更好的資源隔離體驗(yàn),犧牲精力為每個(gè)提交的 job 創(chuàng)建集群,因此,集群的生命周期是與一個(gè)個(gè)的 job 綁定在一起的。
Application 模式為每個(gè)應(yīng)用創(chuàng)建一個(gè)會(huì)話集群,并且在集群里執(zhí)行該應(yīng)用的main方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容