包括:JobManager(作业管理器),TaskManager(任务管理器),ResourceManager(资源管理器),Dispatcher(分发器)。TaskManager将自己的插槽注册到ResourceManager上,JobManager向ResourceManager申请资源时就是申请插槽。Dispatcher为上层应用提供REST服务接口,似乎不是必须的,使用WEBUI时会用到。
Task:一个阶段多个功能相同的subTask的集合,类似Spark的TaskSet。
Slot:一个Slot可以运行多个SubTask,但是这些SubTask必须是来自同一个application的不同阶段的subTask。
提交作业时启动一个新的JobManager,每个JobManager管理一个作业。JobManager能够分析出需要的slots数量。ResourceManager收到申请后根据申请数量启动一定数量的TaskManager(ResourceManager知道每个TaskManager配置的slots数量),TaskManager注册slots,ResourceManager向TaskManager索要slots,然后TaskManager将slots提供给JobManager,JobManager将任务提交到slots中执行。
JobManager会计算出该作业执行图分配给TaskManager,TaskManager拿到图之后开始执行。TaskManager报告心跳包括任务状态统计等信息。JobManager负责部署停止取消任务,负责检查点的指令发送。TaskManager之间做数据传输。这些和Spark的Driver和Executor比较类似。因为流式处理是持续不断的,并行度对应的slot信息变得重要,也成为静态的。流的并行度以最大的子任务(一个或多个算子组合)并行度。一个TaskManager中的多个slot对应多个线程,有独享资源和共享资源,一个TaskManager至少有一个slot,有几个slot表示该TaskManager的最大并行度。JobManager和TaskManager都是JVM进程。一个slot里可以运行时序有先后顺序的多个子任务,这样的好处是一个slot里保存作业的整个管道,也就是不涉及跨slot甚至跨TaskManager的数据传输,这里Flink也提供设置方式,具体见代码slotSharingGroup使用。
Flink程序分成三部分:Source(数据源),Transformation(利用各种算子加工处理),Sink(输出)。运行时,Flink程序会被映射成逻辑数据流图(DataFlow),每个DataFlow以一个或多个Source开始,以一个或多个Sink结束,DataFlow类似任意的DAG。大部分情况下,Transformation跟DataFlow中的算子(Operator)是对应的。