本文是參考Apache Flink v1.3官方文檔
1. Dataflows
Flink的程序包括兩部分钾军,streams和transformations嘲驾。stream指的就是流數(shù)據(jù),transformation指的是以stream作為輸入和輸出的操作诵盼。當程序執(zhí)行的時候惠豺,F(xiàn)link會將程序映射為一個streaming dataflows,如下所示
2. Parallel Dataflows
Flink的程序內部是分布式并行執(zhí)行的拦耐,所以在真正的執(zhí)行過程中耕腾,每個stream會有多個stream partitions,每個操作或者說transformation算子會有多個operator subtasks杀糯,如下所示
3. Tasks and Operator Chains
在分布式并發(fā)執(zhí)行的情況下,Task是由chains operator subtasks構成苍苞,并且每個task是一個線程固翰。例如下圖狼纬,首先source和map構成了一個chains operator,在并發(fā)過程中每個source和map算子又會分別產生兩個subtask骂际,即source[1],map[1]和source[2],map[2]疗琉。那么source[1],map[1]就叫做一個chains operator subtasks,也就是說source[1],map[1]會在一個線程中執(zhí)行歉铝,source[2],map[2]在另一個線程中執(zhí)行盈简。同樣,keyBy().window().apply()[1]
也算是一個chains operator subtasks太示,所以keyBy().window().apply()[1]
操作也會在一個獨立的線程中執(zhí)行柠贤。那么下圖相當于有5個task,因此需要5個線程來執(zhí)行這個streaming parallel dataflows类缤。
4. Job Managers, Task Managers
JobManagers負責調度task臼勉,管理checkpoints等工作。
TaskManagers也叫做workers餐弱,是主要負責執(zhí)行dataflow宴霸。類似于strom中worker的作用。每個TaskManager就是一個JVM進程膏蚓。
5. Task Slots
每個TaskManager就是一個JVM進程瓢谢,一個TaskManager中會啟動多個獨立的線程,每個線程執(zhí)行一個task驮瞧。為了管理TaskManager中可以使用的線程數(shù)(線程數(shù)決定了這個TaskManager中task的并發(fā)度)氓扛,引入了Task Slot的概念。Task Slot是一個邏輯概念剧董,用來執(zhí)行“one pipeline of parallel task”幢尚。可以理解為翅楼,每個task slot中執(zhí)行一個task尉剩。也就是說一個TaskManager中定義的task slot的數(shù)量就是這個TaskManager可以使用的線程數(shù),每個線程負責執(zhí)行一個task毅臊。
在Flink中的task slot概念類似于storm中executor的概念(storm基本概念請參考《Topology的并行度設置》)理茎,但是區(qū)別在于storm的executor中只能執(zhí)行相同bolt或者spout的任務,而task slot中執(zhí)行的是“pipeline task”管嬉,例如keyBy的結果可以直接作為window算子的輸入皂林,減少了線程間的數(shù)據(jù)交換,序列化反序列化等操作提高了資源利用率蚯撩。
假設集群中有2個TaskManagers每個配置3個slot础倍,將一個程序MapFunction的并行度設置為4,ReduceFunction的并行度設置為3胎挎,會得到如下所示的資源分配圖沟启,F(xiàn)link中所謂的pipeline可以理解為將任務“縱向”分割忆家,即每個task slot中會執(zhí)行整個Source - Map - Reduce過程,而storm中每個executor是“橫向”分割德迹,executor中要么都執(zhí)行Map任務要么都執(zhí)行Reduce任務芽卿。