Flink集群架構
Flink采用Master-Slave架構,其中JobManager作為集群Master節(jié)點袁串,主要負責任務協(xié)調和資源分配呼巷,TaskWorker作為Salve節(jié)點王悍,用于執(zhí)行流task。除了JobManager和TaskManager压储,還有一個重要的角色就是Client。Client雖然不是Flink Cluster 運行態(tài)的一部分宇整,但也是Flink重要組件之一芋膘,用來提交流任務为朋。
Flink集群之間的通信,是通過Akka Actor System來進行管控通信的习寸。包括Client-JobManager和JobManager-TaskManager,而TaskManager之間的數(shù)據(jù)交換孵滞,是基于Netty實現(xiàn)的坊饶。
Client
Client主要作用是將批或流應用程序編譯成Dataflow Graph(也就是JobGraph)殴蓬,然后將其提交給JobManager。詳細來看痘绎,Client主要功能如下:
執(zhí)行Application 的Main方法肖粮。
Generate JobGraph。將用戶編寫的application code(DataStream/DataSet/SQL/Table API)代碼翻譯成JobGraph涩馆。
Optimize JobGraph。比如將進行Operator Chain悲龟,能夠減低數(shù)據(jù)延遲的同時增加系統(tǒng)吞吐冰寻。
提交JobGraph和dependency jar到JobManager。
JobManager
JobManager負責協(xié)調Flink application的分布式執(zhí)行斩芭,比如task調度划乖、Checkpoint協(xié)調、Failover協(xié)調等等误算。具體功能如下:
JobGraph -> Execution Graph仰美。接收Client的JobGraph后咖杂,將邏輯執(zhí)行圖JobGraph轉換為物理執(zhí)行圖ExecutionGraph诉字。
Job分發(fā)(Job dispatcher)知纷。
Task的部署和調度。
Checkpoint Coordinator琅轧。
Recovery metadata。
其中JobManager內(nèi)部主要功能組件如下:
ResourceManager墨叛。ResourceManager負責Flink cluster中的資源調配工作漠趁,而資源調配的基本單位就是task slot。Flink為不同的環(huán)境和資源提供者(比如YARN闯传、Mesos甥绿、Kubernetes和standalone cluster)提供了多種實現(xiàn)则披。比如在standalone部署環(huán)境下,ResourceManager只能分配可用TaskManager的task slot图谷,不能去啟動一個新的TaskManager阱洪。
Dispatcher。Dispatcher提供了一個REST接口來讓Client提交任務承璃,并為提交的任務啟動一個新的JobMaster蚌本。同時Dispatcher還未任務提供了Flink WebUI來展示任務執(zhí)行信息隘梨。
JobMaster出嘹。JobMaster負責管理和執(zhí)行單個JobGraph咬崔。Flink Cluster能夠同時運行多個job,每個job都有自己的JobMaster垮斯。
一個Flink Cluster至少有一個JobManager只祠,在高可用部署模式下抛寝,可以有多個JobManager,但是只能有一個JobManager為leader盗舰,其它都為standby钻趋。
TaskManager
TaskManager主要用于執(zhí)行Dataflow的task,并且緩沖和交換數(shù)據(jù)流较沪。TaskManager中的task slot是集群的最小資源調度單位。TaskManager中的task slot數(shù)量尸曼,代表了該TaskManager所能并發(fā)處理的task數(shù)量萄焦。
TaskManager的主要功能如下:
執(zhí)行task(Task Execution)楷扬。
數(shù)據(jù)交換(Network manager)。
內(nèi)存管理(包括類型系統(tǒng)躲株、數(shù)據(jù)序列化和反序列化)。
向JobManager中的ResourceManager注冊自己镣衡,以便ResourceManager進行task調度霜定。
向ResourceManager發(fā)送心跳档悠。
上面的Client、JobManager和TaskManager中都有一個相同的組件望浩,就是Actor System辖所。Akka Actor System用于節(jié)點之間消息傳輸。
Task
對于分布式任務執(zhí)行磨德,F(xiàn)link會將能夠chain到一起的operator放到一個Task中來執(zhí)行缘回,每個Task由一個Thread來執(zhí)行。
將可以chain到一起的operator放到一個task執(zhí)行典挑,是一種非常有效的優(yōu)化手段酥宴。因為它能夠減少線程到線程的切換開銷和緩存開銷,能夠降低延遲的同時增加吞吐量您觉。
上圖是Application Dataflow的JobGraph肆糕,最上面是Dataflow的邏輯視圖JobGraph诚啃,下面是帶有并發(fā)語義的JobGraph绍申。Task代表Dataflow中operator執(zhí)行任務极阅,而SubTask代表同一Operator(或Chain operator)的并發(fā)任務筋搏,比如上面的source-map chain operator代表一個task,source-map[1]代表該task的subtask髓迎。
Task Slot
Flink集群中的每個TaskManager是一個JVM進程排龄,TaskManager能夠執(zhí)行一個或多個task橄维。而TaskManager能夠執(zhí)行多少task争舞,就是通過task slot來表示的店溢。
每個task slot代表TaskManager中的固定資源子集逞怨,比如TaskManager中有3個task slot,則每個task slot所分配的資源為TaskManager所管理內(nèi)存的1/3革砸。需要注意的是算利,這里只隔離了內(nèi)存,像CPU缎患、I/O等資源都沒有做隔離挤渔。
如果一個TaskManger只有一個task slot的話,意味著每個task group(之所以稱為組眼刃,是因為task slot會被共享)是JVM進程級別的隔離擂红。而一個TaskManager如果有多個Task slot弟头,則這些task之間能夠共享JVM資源涉茧,比如TPC鏈接伦连、心跳信息等惑淳;同時也可以共享數(shù)據(jù)集和數(shù)據(jù)結構,從而減少每個task的負載肚医。
對于默認情況下舰涌,F(xiàn)link是允許不同task的subtask共享slot的瓷耙,只要它們屬于同一job即可。通過共享slot落追,一個slot就可以容納一個job的整個pipeline轿钠,比如下面第一個TaskManager中的第一個Task Slot,被source-map[1]贷腕、keyby-window[1]和sink[1]整個pipeline所共享瞒斩,這樣整個最大限度的減少數(shù)據(jù)跨線程/進程的數(shù)據(jù)通信胸囱。
共享slot除了可能執(zhí)行整個pipline外,還有以下兩個優(yōu)點:
- Flink集群只要保證slot總數(shù)與job中最大的并發(fā)度一致即可谤职,無需計算job中所有task總和。
- 提升集群資源利用率陷寝。避免非密集型計算task(比如source-map)和密集型計算task(比如window)使用相同的資源。