一文詳解Flink知識(shí)體系
本文目錄:
一、Flink簡介
二、Flink 部署及啟動(dòng)
三、Flink 運(yùn)行架構(gòu)
四、Flink 算子大全
五、流處理中的 Time 與 Window
六、Flink 狀態(tài)管理
七、Flink 容錯(cuò)
八、Flink SQL
九、Flink CEP
十、Flink CDC
十一、基于 Flink 構(gòu)建全場(chǎng)景實(shí)時(shí)數(shù)倉
十二、Flink 大廠面試題
Flink 涉及的知識(shí)點(diǎn)如下圖所示,本文將逐一講解:
本文檔參考了 Flink 的官網(wǎng)及其他眾多資料整理而成,為了整潔的排版及舒適的閱讀,對(duì)于模糊不清晰的圖片及黑白圖片進(jìn)行重新繪制成了高清彩圖。
一、Flink 簡介1. Flink 發(fā)展
這幾年大數(shù)據(jù)的飛速發(fā)展,出現(xiàn)了很多熱門的開源社區(qū),其中著名的有 Hadoop、Storm,以及后來的 Spark,他們都有著各自專注的應(yīng)用場(chǎng)景。Spark 掀開了內(nèi)存計(jì)算的先河,也以內(nèi)存為賭注,贏得了內(nèi)存計(jì)算的飛速發(fā)展。Spark 的火熱或多或少的掩蓋了其他分布式計(jì)算的系統(tǒng)身影。就像 Flink,也就在這個(gè)時(shí)候默默的發(fā)展著。
在國外一些社區(qū),有很多人將大數(shù)據(jù)的計(jì)算引擎分成了 4 代,當(dāng)然,也有很多人不會(huì)認(rèn)同。我們先姑且這么認(rèn)為和討論。
首先第一代的計(jì)算引擎,無疑就是 Hadoop 承載的 MapReduce。這里大家應(yīng)該都不會(huì)對(duì) MapReduce 陌生,它將計(jì)算分為兩個(gè)階段,分別為 Map 和 Reduce。對(duì)于上層應(yīng)用來說,就不得不想方設(shè)法去拆分算法,甚至于不得不在上層應(yīng)用實(shí)現(xiàn)多個(gè) Job 的串聯(lián),以完成一個(gè)完整的算法,例如迭代計(jì)算。
由于這樣的弊端,催生了支持 DAG 框架的產(chǎn)生。因此,支持 DAG 的框架被劃分為第二代計(jì)算引擎。如 Tez 以及更上層的 Oozie。這里我們不去細(xì)究各種 DAG 實(shí)現(xiàn)之間的區(qū)別,不過對(duì)于當(dāng)時(shí)的 Tez 和 Oozie 來說,大多還是批處理的任務(wù)。
接下來就是以 Spark 為代表的第三代的計(jì)算引擎。第三代計(jì)算引擎的特點(diǎn)主要是 Job 內(nèi)部的 DAG 支持(不跨越 Job),以及強(qiáng)調(diào)的實(shí)時(shí)計(jì)算。在這里,很多人也會(huì)認(rèn)為第三代計(jì)算引擎也能夠很好的運(yùn)行批處理的 Job。
隨著第三代計(jì)算引擎的出現(xiàn),促進(jìn)了上層應(yīng)用快速發(fā)展,例如各種迭代計(jì)算的性能以及對(duì)流計(jì)算和 SQL 等的支持。Flink 的誕生就被歸在了第四代。這應(yīng)該主要表現(xiàn)在 Flink 對(duì)流計(jì)算的支持,以及更一步的實(shí)時(shí)性上面。當(dāng)然 Flink 也可以支持 Batch 的任務(wù),以及 DAG 的運(yùn)算。
總結(jié):
第 1 代:Hadoop MapReduc 批處理 Mapper、Reducer 2;
第 2 代:DAG 框架(Oozie 、Tez),Tez + MapReduce 批處理 1 個(gè) Tez = MR(1) + MR(2) + ... + MR(n) 相比 MR 效率有所提升;
第 3 代:Spark 批處理、流處理、SQL 高層 API 支持 自帶 DAG 內(nèi)存迭代計(jì)算、性能較之前大幅提;
第 4 代:Flink 批處理、流處理、SQL 高層 API 支持 自帶 DAG 流式計(jì)算性能更高、可靠性更高。
2. 什么是 Flink
Flink 起源于 Stratosphere 項(xiàng)目,Stratosphere 是在 2010~2014 年由 3 所地處柏林的大學(xué)和歐洲的一些其他的大學(xué)共同進(jìn)行的研究項(xiàng)目,2014 年 4 月 Stratosphere 的代碼被復(fù)制并捐贈(zèng)給了 Apache 軟件基金會(huì),參加這個(gè)孵化項(xiàng)目的初始成員是 Stratosphere 系統(tǒng)的核心開發(fā)人員,2014 年 12 月,Flink 一躍成為 Apache 軟件基金會(huì)的頂級(jí)項(xiàng)目。
在德語中,Flink 一詞表示快速和靈巧,項(xiàng)目采用一只松鼠的彩色圖案作為 logo,這不僅是因?yàn)樗墒缶哂锌焖俸挽`巧的特點(diǎn),還因?yàn)榘亓值乃墒笥幸环N迷人的紅棕色,而 Flink 的松鼠 logo 擁有可愛的尾巴,尾巴的顏色與 Apache 軟件基金會(huì)的 logo 顏色相呼應(yīng),也就是說,這是一只 Apache 風(fēng)格的松鼠。
Flink 主頁在其頂部展示了該項(xiàng)目的理念:“Apache Flink 是為分布式、高性能、隨時(shí)可用以及準(zhǔn)確的流處理應(yīng)用程序打造的開源流處理框架”。
Apache Flink 是一個(gè)框架和分布式處理引擎,用于對(duì)無界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計(jì)算。Flink 被設(shè)計(jì)在所有常見的集群環(huán)境中運(yùn)行,以內(nèi)存執(zhí)行速度和任意規(guī)模來執(zhí)行計(jì)算。
3. Flink 流處理特性
支持高吞吐、低延遲、高性能的流處理
支持帶有事件時(shí)間的窗口(Window)操作
支持有狀態(tài)計(jì)算的 Exactly-once 語義
支持高度靈活的窗口(Window)操作,支持基于 time、count、session,以及 data-driven 的窗口操作
支持具有 Backpressure 功能的持續(xù)流模型
支持基于輕量級(jí)分布式快照(Snapshot)實(shí)現(xiàn)的容錯(cuò)
一個(gè)運(yùn)行時(shí)同時(shí)支持 Batch on Streaming 處理和 Streaming 處理
Flink 在 JVM 內(nèi)部實(shí)現(xiàn)了自己的內(nèi)存管理
支持迭代計(jì)算
支持程序自動(dòng)優(yōu)化:避免特定情況下 Shuffle、排序等昂貴操作,中間結(jié)果有必要進(jìn)行緩存
4. Flink 基石
Flink 之所以能這么流行,離不開它最重要的四個(gè)基石:Checkpoint、State、Time、Window。
首先是 Checkpoint 機(jī)制,這是 Flink 最重要的一個(gè)特性。Flink 基于Chandy-Lamport算法實(shí)現(xiàn)了一個(gè)分布式的一致性的快照,從而提供了一致性的語義。Chandy-Lamport 算法實(shí)際上在 1985 年的時(shí)候已經(jīng)被提出來,但并沒有被很廣泛的應(yīng)用,而 Flink 則把這個(gè)算法發(fā)揚(yáng)光大了。
Spark 最近在實(shí)現(xiàn) Continue streaming,Continue streaming 的目的是為了降低它處理的延時(shí),其也需要提供這種一致性的語義,最終采用 Chandy-Lamport 這個(gè)算法,說明 Chandy-Lamport 算法在業(yè)界得到了一定的肯定。
提供了一致性的語義之后,Flink 為了讓用戶在編程時(shí)能夠更輕松、更容易地去管理狀態(tài),還提供了一套非常簡單明了的 State API,包括里面的有 ValueState、ListState、MapState,近期添加了 BroadcastState,使用 State API 能夠自動(dòng)享受到這種一致性的語義。
除此之外,Flink 還實(shí)現(xiàn)了 Watermark 的機(jī)制,能夠支持基于事件的時(shí)間的處理,或者說基于系統(tǒng)時(shí)間的處理,能夠容忍數(shù)據(jù)的延時(shí)、容忍數(shù)據(jù)的遲到、容忍亂序的數(shù)據(jù)。
另外流計(jì)算中一般在對(duì)流數(shù)據(jù)進(jìn)行操作之前都會(huì)先進(jìn)行開窗,即基于一個(gè)什么樣的窗口上做這個(gè)計(jì)算。Flink 提供了開箱即用的各種窗口,比如滑動(dòng)窗口、滾動(dòng)窗口、會(huì)話窗口以及非常靈活的自定義的窗口。
5. 批處理與流處理
批處理的特點(diǎn)是有界、持久、大量,批處理非常適合需要訪問全套記錄才能完成的計(jì)算工作,一般用于離線統(tǒng)計(jì)。流處理的特點(diǎn)是無界、實(shí)時(shí),流處理方式無需針對(duì)整個(gè)數(shù)據(jù)集執(zhí)行操作,而是對(duì)通過系統(tǒng)傳輸?shù)拿總(gè)數(shù)據(jù)項(xiàng)執(zhí)行操作,一般用于實(shí)時(shí)統(tǒng)計(jì)。
在 Spark 生態(tài)體系中,對(duì)于批處理和流處理采用了不同的技術(shù)框架,批處理由 SparkSQL 實(shí)現(xiàn),流處理由 Spark Streaming 實(shí)現(xiàn),這也是大部分框架采用的策略,使用獨(dú)立的處理器實(shí)現(xiàn)批處理和流處理,而 Flink 可以同時(shí)實(shí)現(xiàn)批處理和流處理。
Flink 是如何同時(shí)實(shí)現(xiàn)批處理與流處理的呢?答案是,Flink 將批處理(即處理有限的靜態(tài)數(shù)據(jù))視作一種特殊的流處理。
Flink 的核心計(jì)算架構(gòu)是下圖中的 Flink Runtime 執(zhí)行引擎,它是一個(gè)分布式系統(tǒng),能夠接受數(shù)據(jù)流程序并在一臺(tái)或多臺(tái)機(jī)器上以容錯(cuò)方式執(zhí)行。
Flink Runtime 執(zhí)行引擎可以作為 YARN(Yet Another Resource Negotiator)的應(yīng)用程序在集群上運(yùn)行,也可以在 Mesos 集群上運(yùn)行,還可以在單機(jī)上運(yùn)行(這對(duì)于調(diào)試 Flink 應(yīng)用程序來說非常有用)。
上圖為 Flink 技術(shù)棧的核心組成部分,值得一提的是,Flink 分別提供了面向流式處理的接口(DataStream API)和面向批處理的接口(DataSet API)。因此,Flink 既可以完成流處理,也可以完成批處理。Flink 支持的拓展庫涉及機(jī)器學(xué)習(xí)(FlinkML)、復(fù)雜事件處理(CEP)、以及圖計(jì)算(Gelly),還有分別針對(duì)流處理和批處理的 Table API。
能被 Flink Runtime 執(zhí)行引擎接受的程序很強(qiáng)大,但是這樣的程序有著冗長的代碼,編寫起來也很費(fèi)力,基于這個(gè)原因,Flink 提供了封裝在 Runtime 執(zhí)行引擎之上的 API,以幫助用戶方便地生成流式計(jì)算程序。Flink 提供了用于流處理的 DataStream API 和用于批處理的 DataSet API。值得注意的是,盡管 Flink Runtime 執(zhí)行引擎是基于流處理的,但是 DataSet API 先于 DataStream API 被開發(fā)出來,這是因?yàn)楣I(yè)界對(duì)無限流處理的需求在 Flink 誕生之初并不大。
DataStream API 可以流暢地分析無限數(shù)據(jù)流,并且可以用 Java 或者 Scala 等來實(shí)現(xiàn)。開發(fā)人員需要基于一個(gè)叫 DataStream 的數(shù)據(jù)結(jié)構(gòu)來開發(fā),這個(gè)數(shù)據(jù)結(jié)構(gòu)用于表示永不停止的分布式數(shù)據(jù)流。
Flink 的分布式特點(diǎn)體現(xiàn)在它能夠在成百上千臺(tái)機(jī)器上運(yùn)行,它將大型的計(jì)算任務(wù)分成許多小的部分,每個(gè)機(jī)器執(zhí)行一部分。Flink 能夠自動(dòng)地確保發(fā)生機(jī)器故障或者其他錯(cuò)誤時(shí)計(jì)算能夠持續(xù)進(jìn)行,或者在修復(fù) bug 或進(jìn)行版本升級(jí)后有計(jì)劃地再執(zhí)行一次。這種能力使得開發(fā)人員不需要擔(dān)心運(yùn)行失敗。Flink 本質(zhì)上使用容錯(cuò)性數(shù)據(jù)流,這使得開發(fā)人員可以分析持續(xù)生成且永遠(yuǎn)不結(jié)束的數(shù)據(jù)(即流處理)。
二、Flink 部署及啟動(dòng)
Flink 支持多種安裝模式:
local(本地)——單機(jī)模式,一般不使用;
standalone——獨(dú)立模式,Flink 自帶集群,開發(fā)測(cè)試環(huán)境使用;
yarn——計(jì)算資源統(tǒng)一由 Hadoop YARN 管理,生產(chǎn)環(huán)境使用。
Flink 集群的安裝不屬于本文檔的范疇,如安裝 Flink,可自行搜索資料進(jìn)行安裝。
本節(jié)重點(diǎn)在 Flink 的 Yarn 部署模式。
在一個(gè)企業(yè)中,為了最大化的利用集群資源,一般都會(huì)在一個(gè)集群中同時(shí)運(yùn)行多種類型的 Workload,可以使用 YARN 來管理所有計(jì)算資源。
1. Flink 在 Yarn 上的部署架構(gòu)
從圖中可以看出,Yarn 的客戶端需要獲取 hadoop 的配置信息,連接 Yarn 的 ResourceManager。所以要設(shè)置 YARN_CONF_DIR 或者 HADOOP_CONF_DIR 或者 HADOOP_CONF_PATH,只要設(shè)置了其中一個(gè)環(huán)境變量,就會(huì)被讀取。如果讀取上述的變量失敗了,那么將會(huì)選擇 hadoop_home 的環(huán)境變量,會(huì)嘗試加載$HADOOP_HOME/etc/hadoop 的配置文件。
當(dāng)啟動(dòng)一個(gè) Flink Yarn 會(huì)話時(shí),客戶端首先會(huì)檢查本次請(qǐng)求的資源(存儲(chǔ)、計(jì)算)是否足夠。資源足夠?qū)?huì)上傳包含 HDFS 及 Flink 的配置信息和 Flink 的 jar 包到 HDFS;
客戶端向 RM 發(fā)起請(qǐng)求;
RM 向 NM 發(fā)請(qǐng)求指令,創(chuàng)建 container,并從 HDFS 中下載 jar 以及配置文件;
啟動(dòng) ApplicationMaster 和 jobmanager,將 jobmanager 的地址信息寫到配置文件中,再發(fā)到 hdfs 上;
同時(shí),AM 向 RM 發(fā)送心跳注冊(cè)自己,申請(qǐng)資源(cpu、內(nèi)存);
創(chuàng)建 TaskManager 容器,從 HDFS 中下載 jar 包及配置文件并啟動(dòng);
各 task 任務(wù)通過 jobmanager 匯報(bào)自己的狀態(tài)和進(jìn)度,AM 和 jobmanager 在一個(gè)容器上,AM 就能掌握各任務(wù)的運(yùn)行狀態(tài),從而可以在任務(wù)失敗時(shí),重新啟動(dòng)任務(wù);
任務(wù)完成后,AM 向 RM 注銷并關(guān)閉自己;
2. 啟動(dòng)集群修改 hadoop 的配置參數(shù):vim etc/hadoop/yarn-site.xml
添加:
修改 Hadoop 的 yarn-site.xml,添加該配置表示內(nèi)存超過分配值,是否將任務(wù)殺掉。
默認(rèn)為 true。運(yùn)行 Flink 程序,很容易內(nèi)存超標(biāo),這個(gè)時(shí)候 yarn 會(huì)自動(dòng)殺掉 job。
修改全局變量 /etc/profile:
添加:export HADOOP_CONF_DIR=/export/servers/hadoop/etc/Hadoop
YARN_CONF_DIR 或者 HADOOP_CONF_DIR 必須將環(huán)境變量設(shè)置為讀取 YARN 和 HDFS 配置
啟動(dòng) HDFS、zookeeper(如果是外置 zookeeper)、YARN 集群;
使用 yarn-session 的模式提交作業(yè)。
Yarn Session 模式提交作業(yè)有兩種方式:yarn-session 和 yarn-cluster
3. 模式一: yarn-session
特點(diǎn):
使用 Flink 中的 yarn-session(yarn 客戶端),會(huì)啟動(dòng)兩個(gè)必要服務(wù) JobManager 和 TaskManagers;
客戶端通過 yarn-session 提交作業(yè);
yarn-session 會(huì)一直啟動(dòng),不停地接收客戶端提交的任務(wù);
如果擁有有大量的小作業(yè),適合使用這種方式。
在 flink 目錄啟動(dòng) yarn-session:
bin/yarn-session.sh -n 2 -tm 800 -jm 800 -s 1 -d
-n 表示申請(qǐng) 2 個(gè)容器
-s 表示每個(gè)容器啟動(dòng)多少個(gè) slot 離模式,表示以后臺(tái)程
-tm 表示每個(gè) TaskManager 申請(qǐng) 800M 內(nèi)存
-d 分序方式運(yùn)行
使用 flink 提交任務(wù):
bin/flink run examples/batch/WordCount.jar
如果程序運(yùn)行完了,可以使用 yarn application -kill application_id 殺掉任務(wù):
yarn application -kill application_1554377097889_0002
bin/yarn-session.sh -n 2 -tm 800 -s 1 -d 意思是:
同時(shí)向 Yarn 申請(qǐng) 3 個(gè) container(即便只申請(qǐng)了兩個(gè),因?yàn)?ApplicationMaster 和 Job Manager 有一個(gè)額外的容器。一旦將 Flink 部署到 YARN 群集中,它就會(huì)顯示 Job Manager 的連接詳細(xì)信息),其中 2 個(gè) Container 啟動(dòng) TaskManager(-n 2),每個(gè) TaskManager 擁有兩個(gè) Task Slot(-s 1),并且向每個(gè) TaskManager 的 Container 申請(qǐng) 800M 的內(nèi)存,以及一個(gè) ApplicationMaster(Job Manager)。
4. 模式二: yarn-cluster
特點(diǎn):
直接提交任務(wù)給 YARN;
大作業(yè),適合使用這種方式;
會(huì)自動(dòng)關(guān)閉 session。
使用 flink 直接提交任務(wù):
bin/flink run -m yarn-cluster -yn 2 -yjm 800 -ytm 800 /export/servers/flink-1.6.0/examples/batch/WordCount.jar
-yn 表示 TaskManager 的個(gè)數(shù)
注意:
在創(chuàng)建集群的時(shí)候,集群的配置參數(shù)就寫好了,但是往往因?yàn)闃I(yè)務(wù)需要,要更改一些配置參數(shù),這個(gè)時(shí)候可以不必因?yàn)橐粋(gè)實(shí)例的提交而修改 conf/flink-conf.yaml;
可以通過:-D
-Dfs.overwrite-files=true -Dtaskmanager.network.numberOfBuffers=16368
如果使用的是 flink on yarn 方式,想切換回 standalone 模式的話,需要?jiǎng)h除:/tmp/.yarn-properties-root,因?yàn)槟J(rèn)查找當(dāng)前 yarn 集群中已有的 yarn-session 信息中的 jobmanager。三、Flink 運(yùn)行架構(gòu)1. Flink 程序結(jié)構(gòu)
Flink 程序的基本構(gòu)建塊是流和轉(zhuǎn)換(請(qǐng)注意,Flink 的 DataSet API 中使用的 DataSet 也是內(nèi)部流 )。從概念上講,流是(可能永無止境的)數(shù)據(jù)記錄流,而轉(zhuǎn)換是將一個(gè)或多個(gè)流作為一個(gè)或多個(gè)流的操作。輸入,并產(chǎn)生一個(gè)或多個(gè)輸出流。
Flink 應(yīng)用程序結(jié)構(gòu)就是如上圖所示:
Source: 數(shù)據(jù)源,Flink 在流處理和批處理上的 source 大概有 4 類:基于本地集合的 source、基于文件的 source、基于網(wǎng)絡(luò)套接字的 source、自定義的 source。自定義的 source 常見的有 Apache kafka、RabbitMQ 等,當(dāng)然你也可以定義自己的 source。
Transformation:數(shù)據(jù)轉(zhuǎn)換的各種操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select等,操作很多,可以將數(shù)據(jù)轉(zhuǎn)換計(jì)算成你想要的數(shù)據(jù)。
Sink:接收器,Flink 將轉(zhuǎn)換計(jì)算后的數(shù)據(jù)發(fā)送的地點(diǎn) ,你可能需要存儲(chǔ)下來,Flink 常見的 Sink 大概有如下幾類:寫入文件、打印出來、寫入 socket 、自定義的 sink 。自定義的 sink 常見的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定義自己的 sink。
2. Flink 并行數(shù)據(jù)流
Flink 程序在執(zhí)行的時(shí)候,會(huì)被映射成一個(gè) Streaming Dataflow,一個(gè) Streaming Dataflow 是由一組 Stream 和 Transformation Operator 組成的。在啟動(dòng)時(shí)從一個(gè)或多個(gè) Source Operator 開始,結(jié)束于一個(gè)或多個(gè) Sink Operator。
Flink 程序本質(zhì)上是并行的和分布式的,在執(zhí)行過程中,一個(gè)流(stream)包含一個(gè)或多個(gè)流分區(qū),而每一個(gè) operator 包含一個(gè)或多個(gè) operator 子任務(wù)。操作子任務(wù)間彼此獨(dú)立,在不同的線程中執(zhí)行,甚至是在不同的機(jī)器或不同的容器上。operator 子任務(wù)的數(shù)量是這一特定 operator 的并行度。相同程序中的不同 operator 有不同級(jí)別的并行度。
一個(gè) Stream 可以被分成多個(gè) Stream 的分區(qū),也就是 Stream Partition。一個(gè) Operator 也可以被分為多個(gè) Operator Subtask。如上圖中,Source 被分成 Source1 和 Source2,它們分別為 Source 的 Operator Subtask。每一個(gè) Operator Subtask 都是在不同的線程當(dāng)中獨(dú)立執(zhí)行的。一個(gè) Operator 的并行度,就等于 Operator Subtask 的個(gè)數(shù)。上圖 Source 的并行度為 2。而一個(gè) Stream 的并行度就等于它生成的 Operator 的并行度。
數(shù)據(jù)在兩個(gè) operator 之間傳遞的時(shí)候有兩種模式:
One to One 模式:兩個(gè) operator 用此模式傳遞的時(shí)候,會(huì)保持?jǐn)?shù)據(jù)的分區(qū)數(shù)和數(shù)據(jù)的排序;如上圖中的 Source1 到 Map1,它就保留的 Source 的分區(qū)特性,以及分區(qū)元素處理的有序性。
Redistributing (重新分配)模式:這種模式會(huì)改變數(shù)據(jù)的分區(qū)數(shù);每個(gè)一個(gè) operator subtask 會(huì)根據(jù)選擇 transformation 把數(shù)據(jù)發(fā)送到不同的目標(biāo) subtasks,比如 keyBy()會(huì)通過 hashcode 重新分區(qū),broadcast()和 rebalance()方法會(huì)隨機(jī)重新分區(qū);
3. Task 和 Operator chain
Flink的所有操作都稱之為Operator,客戶端在提交任務(wù)的時(shí)候會(huì)對(duì)Operator進(jìn)行優(yōu)化操作,能進(jìn)行合并的Operator會(huì)被合并為一個(gè)Operator,合并后的Operator稱為Operator chain,實(shí)際上就是一個(gè)執(zhí)行鏈,每個(gè)執(zhí)行鏈會(huì)在TaskManager上一個(gè)獨(dú)立的線程中執(zhí)行。
4. 任務(wù)調(diào)度與執(zhí)行
當(dāng)Flink執(zhí)行executor會(huì)自動(dòng)根據(jù)程序代碼生成DAG數(shù)據(jù)流圖;
ActorSystem創(chuàng)建Actor將數(shù)據(jù)流圖發(fā)送給JobManager中的Actor;
JobManager會(huì)不斷接收TaskManager的心跳消息,從而可以獲取到有效的TaskManager;
JobManager通過調(diào)度器在TaskManager中調(diào)度執(zhí)行Task(在Flink中,最小的調(diào)度單元就是task,對(duì)應(yīng)就是一個(gè)線程);
在程序運(yùn)行過程中,task與task之間是可以進(jìn)行數(shù)據(jù)傳輸?shù)摹?/p>
Job Client:
主要職責(zé)是提交任務(wù), 提交后可以結(jié)束進(jìn)程, 也可以等待結(jié)果返回;Job Client 不是 Flink 程序執(zhí)行的內(nèi)部部分,但它是任務(wù)執(zhí)行的起點(diǎn);Job Client 負(fù)責(zé)接受用戶的程序代碼,然后創(chuàng)建數(shù)據(jù)流,將數(shù)據(jù)流提交給 Job Manager 以便進(jìn)一步執(zhí)行。執(zhí)行完成后,Job Client 將結(jié)果返回給用戶。
JobManager:
主要職責(zé)是調(diào)度工作并協(xié)調(diào)任務(wù)做檢查點(diǎn);集群中至少要有一個(gè) master,master 負(fù)責(zé)調(diào)度 task,協(xié)調(diào)checkpoints 和容錯(cuò);高可用設(shè)置的話可以有多個(gè) master,但要保證一個(gè)是 leader, 其他是standby;Job Manager 包含 Actor System、Scheduler、CheckPoint三個(gè)重要的組件;JobManager從客戶端接收到任務(wù)以后, 首先生成優(yōu)化過的執(zhí)行計(jì)劃, 再調(diào)度到TaskManager中執(zhí)行。
TaskManager:
主要職責(zé)是從JobManager處接收任務(wù), 并部署和啟動(dòng)任務(wù), 接收上游的數(shù)據(jù)并處理;Task Manager 是在 JVM 中的一個(gè)或多個(gè)線程中執(zhí)行任務(wù)的工作節(jié)點(diǎn);TaskManager在創(chuàng)建之初就設(shè)置好了Slot, 每個(gè)Slot可以執(zhí)行一個(gè)任務(wù)。5. 任務(wù)槽和槽共享
每個(gè)TaskManager是一個(gè)JVM的進(jìn)程, 可以在不同的線程中執(zhí)行一個(gè)或多個(gè)子任務(wù)。為了控制一個(gè)worker能接收多少個(gè)task。worker通過task slot來進(jìn)行控制(一個(gè)worker至少有一個(gè)task slot)。
1) 任務(wù)槽
每個(gè)task slot表示TaskManager擁有資源的一個(gè)固定大小的子集。
flink將進(jìn)程的內(nèi)存進(jìn)行了劃分到多個(gè)slot中。
圖中有2個(gè)TaskManager,每個(gè)TaskManager有3個(gè)slot的,每個(gè)slot占有1/3的內(nèi)存。
內(nèi)存被劃分到不同的slot之后可以獲得如下好處:
TaskManager最多能同時(shí)并發(fā)執(zhí)行的任務(wù)是可以控制的,那就是3個(gè),因?yàn)椴荒艹^slot的數(shù)量。
slot有獨(dú)占的內(nèi)存空間,這樣在一個(gè)TaskManager中可以運(yùn)行多個(gè)不同的作業(yè),作業(yè)之間不受影響。
2) 槽共享
默認(rèn)情況下,Flink允許子任務(wù)共享插槽,即使它們是不同任務(wù)的子任務(wù),只要它們來自同一個(gè)作業(yè)。結(jié)果是一個(gè)槽可以保存作業(yè)的整個(gè)管道。允許插槽共享有兩個(gè)主要好處:
只需計(jì)算Job中最高并行度(parallelism)的task slot,只要這個(gè)滿足,其他的job也都能滿足。
資源分配更加公平,如果有比較空閑的slot可以將更多的任務(wù)分配給它。圖中若沒有任務(wù)槽共享,負(fù)載不高的Source/Map等subtask將會(huì)占據(jù)許多資源,而負(fù)載較高的窗口subtask則會(huì)缺乏資源。
有了任務(wù)槽共享,可以將基本并行度(base parallelism)從2提升到6.提高了分槽資源的利用率。同時(shí)它還可以保障TaskManager給subtask的分配的slot方案更加公平。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
-
10 月之暗面,絕地反擊
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?
- 10 封殺AI“照騙”,“淘寶們”終于不忍了?