须知
flink获取逻辑核的方式是通过java的RunTime获取的
如何划分task和subtask
为何要划分
- 因为task之间有依赖关系,有的task必须等到父task执行完才能执行,而同一个task中的算子可以以pipeline的形式执行,效率高。
- 方便容错和缓存
- 方便优化
何时划分
task的并行度就是subtask数,flink也是可以合并算子的,类似于spark的pipline,flink叫operator chain
- 并行度发生变化时,算子调用setParallelism
- keyBy() /window()/apply() 等发生 Rebalance 重新分配,并行度发生改变
- shuffle(flink叫redistributing)、
- 调用 startNewChain() 方法,开启一个新的算子链;
- 调用 diableChaining()切分task,即:告诉当前算子操作不使用 算子链 操作。
针对内存密集型、CPU密集型,使用 startNewChins()、disableChaining()方法,可以将当前算子单独放到一个 Task 中,使其独享当前Task的所有资源,以此来提升计算效率。
改变并行度的算子
startNewChain:从当前ds之前,发生redistributing
disableChaining:当前算子之前之后都切断,当前算子单独划分task。目的是为了有些算子比较复杂时,cpu或内存需求比较大,跟其他方式配合,可以实现独享solt,不用跟其他算子组成task共享solt。
setSharingGroup:同一app下,多个subtask运行在同一个slot中。
指定task到指定的slot
slot是分布式的,分布在多个节点上的slot有相同的名字。
目的为了手动调度任务到指定资源上,相同task的subtask在同一个slot,不同task的subtask也可以在同一个slot,可以节省资源。但一定要注意资源不够的问题。
slot是有名字的,默认是default
如果parallelism设置的比slot多,程序就会一直显示scheduled,过段时间就会failed。
同一个job下
相同task的subtask只能运行在相同的的slot中,
不同task的subtask可以运行在相同的slot中,即使中间发生了rebalance,只要资源够用,就不需要非得去别的节点开reduce任务。前提是task的共享资源槽slot的名字要相同。