好记性,烂笔头:
①socket不能多并行度消费. 而kafka是可以多并行度消费的. kafka有多个分区.
②keyby不是一个算子,他是决定我们的数据进入到下游的哪一个并行度里面的.他自己没有并行度的.他不会对数据做任何的操作.数据可能从一个并行度来的. 进过keyby之后,可能把他发到好多个并行度里面去了.
8种数据传输的方式:
1 | KeyBy: 按照key的hash值分区, 相同的key一定会分到相同的分区.即相同的key进入相同的并行度,也就是说进入同一个子任务. |
正文:
任务链的意思就是说,我们把两个算子按照一定的条件连接在一起.形成一个统一的Task
这就是所谓的任务链.并且我们可以在图上可以看到,如下图所示:
任务链可以当做Spark中的stage理解. 但是他比stage灵活. spark中根据宽依赖划分stage. 所以Flink保留此特点. 如果你是重分区的操作.他就一定会划分到两个不同的任务链里面来. 除此之外Flink的任务链还要看并行度.
这个任务链有一定的条件,首先他们的①并行度要相同.所谓的并行度相同就是One-to-one,One-to-one不是说他们只有一个,而是指他们的并行度相同.第二个条件就是他们②中间没有shuffle.中间没有shuffle才会通过任务链把他们合在一起.这个任务链不用我们去做的.不过呢,我们可以设置让所有的算子之间完全隔离.就算你有条件来通过这个任务链来进行合并,我们也不让你构建一个任务链.我们只要加一个disableOperatorChaining(禁用这个任务链),禁用这个任务链之后,就算你符合条件,他也不把你这两个task链在一起,形成一个统一的Task.
但是这两种那个更好呢?当然是有任务链的更好.有任务链可以提高吞吐,减少IO操作.
所以,大多数情况下,我这一行代码(streamEnv.disableOperatorChaining)不应该做.
③共享组不同也不能形成任务链 共享组的作用就是把同一个任务放在同一个slot里面
相同并行度的one to one操作,Flink这样相连的算子链接在一起形成一个task,原来的算子成为里面的一部分。将算子链接成task是非常有效的优化:它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。链接的行为可以在编程API中进行指定。
streamEnv.disableOperatorChaining:表示所有操作算子都不构建任务链
.disableChaining() 加在其中一个算子中,表示:该算子和其他算子不一起构建任务链。它是独立的
图 task与operator chains:
任务链案例代码地址:
- 本文作者: xubatian
- 本文链接: http://xubatian.cn/Flink-原理与实现-Flink核心概念之任务链/
- 版权声明: 本博客所有文章除特别声明外均为原创,采用 CC BY 4.0 CN协议 许可协议。转载请注明出处:https://www.xubatian.cn/