Flink是一个基于Master-Slave风格的架构,Flink集群启动时,会启动一个JobManager进程、至少一个TaskManager进程。当Flink程序提交后,会创建一个Client来进行预处理,将程序转换为一个表示完整Job的DAG,并提交到JobManager,最后JobManager将Job中的各个Task分配给TaskManager。Flink 中的计算资源通过Task Slot来定义。每个Task Slot 代表了TaskManager 的一个固定大小的资源池。例如,一个拥有3个slot的TaskManager会将其管理的内存平均分成三分分给各个slot。将资源slot 化意味着来自不同job的task不会出现内存竞争。slot目前仅支持内存的隔离,不支持CPU隔离。
Flink程序在执行的时候,会先被转化为一个Streaming Dataflows,一个Streaming Dataflow是由一组Stream和Transformation Operator组成的DAG。
用户首先提交Flink程序到JobClient,经过JobClient的处理、解析、优化提交到JobManager,最后由TaskManager运行task。
Client:Flink Client主要给用户提供向Flink系统提交用户任务(流式作业)的能力。
TaskManager:Flink系统的业务执行节点,执行具体的用户任务。TaskManager可以有多个,各个TaskManager都平等。
JobManager:Flink系统的管理节点,管理所有的TaskManager,并决策用户任务在哪些Taskmanager执行。JobManager在HA模式下可以有多个,但只有一个主JobManager。
TaskSlot:TaskSlot(任务槽)类似yarn中的container用于资源隔离,但是该组件只包含内存资源,不包含cpu资源。假如每一个TaskManager当中包含3个Task Slot,TaskManager最多能同时并发执行的任务是可以控制的,那就是3个, 因为不能超过slot的数量。slot有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响。slot之间可以共享JVM资源, 可以共享Dataset和数据结构,也可以通过多路复用(Multiplexing) 共享TCP连接和心跳消息(Heatbeat Message)。
Task:任务执行的单元。