本文是參考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的程序內(nèi)部是分布式并行執(zhí)行的,所以在真正的執(zhí)行過程中,每個stream會有多個stream partitions,每個操作或者說transformation算子會有多個operator subtasks,如下所示

3. Tasks and Operator Chains
在分布式并發(fā)執(zhí)行的情況下,Task是由chains operator subtasks構(gòu)成,并且每個task是一個線程。例如下圖,首先source和map構(gòu)成了一個chains operator,在并發(fā)過程中每個source和map算子又會分別產(chǎn)生兩個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負責調(diào)度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的結(jié)果可以直接作為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任務。
