参考博客

1.TaskManager通过solt个数划分资源,但是这里的资源仅仅是内存资源不包括CPU
2.Flink Job任务时会对算子进行chain优化,目的是共享线程减少线程切换的开销并提升执行性能。chain后的算子对外而言就是一个算子,内部算子之间的数据流通,不会经过序列化/反序列化、网络传输,而是直接将消息对象传递给下游的 ChainOperator 处理 。chain是有条件的:
   1)上下游的并行度一致
   2)下游节点的入度为1 (也就是说下游节点没有来自其他节点的输入)
   3)上下游节点都在同一个 slot group 中(下面会解释 slot group)
   4)下游节点的 chain 策略为 ALWAYS(可以与上下游链接,map、flatmap、filter等默认是ALWAYS)
   5)上游节点的 chain 策略为 ALWAYS 或 HEAD(只能与下游链接,不能与上游链接,Source默认是HEAD)
   6)两个节点间数据分区方式是 forward
   7)用户没有禁用 chain
3.所有的算子默认slot group为'default'。可以通过slotSharingGroup()设置组名。
4.两个算子并行度一致则为forward,不一致则是Rebalance,有keyby则为hash。在每个算子后可明确设置分区方式forward,Rebalance,shuffle。
5.operator设置为并行运行,每一个线程就是一个subtask
6.每个TaskManager 只一个slot,也就意味着每个task运行在独立的 JVM 中。每个 TaskManager 有多个slot的话,也就是说多个task运行在同一个JVM中。而在同一个JVM进程中的task,可以共享TCP连接(基于多路复用)和心跳消息,可以减少数据的网络传输。也能共享一些数据结构,一定程度上减少了每个task的消耗。因为每个TaskManager 只一个slot,一个TaskManager=一个JVM所以才会说每个Task运行在独立的JVM中。
7.SlotSharingGroup意味着Flink 允许subtasks共享slot,条件是它们都来自同一个Job的不同task的subtask。也就是说同一个operator可能因为并行度的关系有多个SubTask,但是这些SubTask不能存在同一个slot中。这样带来的好处就是可能一个slot中可以运行这个job整个的pipeline。而且job占用的solt数和job的最高并发保持一致(只有不同的task的subtask才能共享slot)。
8.关于Flink调度,有两个非常重要的原则我们必须知道:(1)同一个operator的各个subtask是不能呆在同一个SharedSlot中的,例如FlatMap[1]FlatMap[2]是不能在同一个SharedSlot中的。(2)Flink是按照拓扑顺序从Source一个个调度到Sink的。所以在source并行度为1的情况下,solt1有完整的pipeline,而slot2只有部分的pipeline.