Flink集群运行时架构及部署
一、并行度(Parallelism)
1.上图能够看出,不能chain在一起的operator会被分配到不同的Task中,也就是说Task是Flink中资源调度最小的单位。
a.一个特定算子的子任务(subtask)的个数被称之为并行度(parallelism)
b.一般情况下,一个流程序的并行度,是由程序中算子中最大的并行度。
c.一个程序中,不同的算子可以有不同的并行度。
2.1Flink程序的执行具有并行、分布式的特性
在执行的过程中,一个流(Stream)包含一个或多个分区(Stram partition),而每一个算子包含一个或多个子任务(subtask),这些子任务在不同的线程、不同的物理机、不同的容器互不依赖的执行。
2.2Stream在算子之间传输数据的形式可以是one-to-one模式(forwrding)的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类。
a.one-to-one模式类似于spark中窄依赖。Stream(比如在source和map operator之间)维护着分区以及元素的顺序。意味着map算子的子任务看到的元素个数以及顺序跟source算子的子任务生产的元素个数、顺序相同,map、filter、flatmap等算子都是one-to-one的对应关系。
b.Redistributing模式类似于spark中的宽依赖,stream(map()跟keyby/window之间或者keyby/window跟sink之间)的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如:keyby基于hashcode重分区、broadcast和rebalance会随机重新分区,这些算子都会引起redistribute过程。
二、操作链
1.操作链介绍:
a.相同并行度的one to one操作,Flink这样相连的算子链接的在一起形成一个task,原来的算子成为其中的一部分。
b.将算子链接成task是非常有效的优化:他能减少线程之间的切换和缓存区数据的交换,在减少时延迟的同时提升吞吐量。
链接的行为可以在API中进行:
① 若在整个作业中禁止使用链接操作的话,可以使用StreamExecutionEnvironment实例.disableOperatorChaining()。
② 链接控制,只能用在DataStream的transformation操作之后,如:someStream.map().startNewChain(),不能someStream.startNewChain()。
c.使用槽共享,Flink将把slot共享组的操作放到一个slot中,而非slot共享组的操作放到其他的slot中,这个机制可以用来做slot隔离,如:xxx.someStream.filter(…).slotSharingGroup(“name”)。
2.operatorchain的优点:
a.减少线程之间的切换
b.减少序列化和反序列化
c.减少延迟并提高吞吐能力
3.operatorchain组成的条件
a.上下游算子的并行度一致
b.上下游算子没有shuffle