1 Flink 任务提交流程
TaskManager是一个独立的jvm进程。
每个task slot表示TaskManager拥有资源的一个固定大小的子集。假如一个TaskManager有三个slot,那么它会将其管理的内存分成三份给各个slot。
slot就是运行在本进程下的独立资源集合,非线程概念,slot是cpu共享,内存隔离。一个slot并不代表一个线程,它里面并不一定只放一个task。多个task在一个slot就涉及slot sharing group。
2 Flink Yarn任务提交流程
代码就是stream Graph或者data Graph
client生成job graph(operator chain优化,把很多串行任务合在一起,前提是one to one,类似spark的窄依赖,并且并行度要一致。代码中env.disableOperatorChaining()可以设置不用这个优化方式。)
job manager 上生成 ExecutionGraph,并行度分开了
task manager上最终执行。
3 TaskManager和slot
虽然slot是一个线程,但是并不是一个slot只运行一个task线程, 可以根据每个task,比如source, map等如果不是资源密集型可以共享同一个线程处理,甚至某个并行度下的完整pipeline。
下图的例子是source,map,keyby并行度都是6,sink并行度是1,最终不是需要13个slot(source,map可以自动的调整为一个task运行),而只需要6个slot就可以了。注意图中一个小方框才代表一个线程,而不是一个slot是一个线程。
当然可以通过sharing group来设置不同task在不同的slot里面,可以设置一对一的关系。