flink-任务划分:task和subTask

须知

flink获取逻辑核的方式是通过java的RunTime获取的

如何划分task和subtask

为何要划分

  1. 因为task之间有依赖关系,有的task必须等到父task执行完才能执行,而同一个task中的算子可以以pipeline的形式执行,效率高。
  2. 方便容错和缓存
  3. 方便优化

何时划分

task的并行度就是subtask数,flink也是可以合并算子的,类似于spark的pipline,flink叫operator chain

  1. 并行度发生变化时,算子调用setParallelism
  2. keyBy() /window()/apply() 等发生 Rebalance 重新分配,并行度发生改变
  3. shuffle(flink叫redistributing)、
  4. 调用 startNewChain() 方法,开启一个新的算子链;
  5. 调用 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的名字要相同。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值