一、问题引入
图-1 图-2
-
问题引入:比较上面两张图,图1中,相同算子操作放在不同的slot中,图2中一个算子操作占用一个slot。
如果flink window操作比较复杂,那么图2中就会出现问题,source操作抽取数据,window操作的slot来不及处理,造成数据堆积,从而导致slot的空闲浪费。 -
解决办法:使用共享slot,一条数据从source -> transformation -> sink都在同一个slot中,当其他slot空闲时,可以共用slot来用于复杂的window计算操作。
二、slot共享组介绍
DataStreamSource<String> dataStreamSource = env.addSource(new TubeSource());
SingleOutputStreamOperator<Object> resultStream = dataStreamSource.flatMap().slotSharingGroup("共享组Flatmap")
.keyBy(0).sum(1).setParallelism(2).slotSharingGroup("共享组sum");
resultStream.print().setParallelism(1);
源码:
@PublicEvolving
public SingleOutputStreamOperator<T> slotSharingGroup(String slotSharingGroup) {
transformation.setSlotSharingGroup(slotSharingGroup);
return this;
}
作用:共享组内的任务共享slot,不同组的任务必须占用不同的slot。
没有设置的时候默认是default共享组,所有任务共享
上述代码中,addSource占用一个slot,flatMap占用一个slot,sum和print共享slot(共享组sum)各占用一个slot,则需要提供4个slot用于计算。
所以现在算并行度方式为:先分slot共享组,3个slot共享组,sum操作和print操作可共享slot,所以sum操作需要的两个slot有一个可以用print操作分配的slot来共享。
网友评论