北京做网站建设公司哪家好,太原网站seo服务,兰州事件最新进展,企业网站栏目设置说明文章目录 1、 分区算子#xff1a;随机分区2、分区算子#xff1a;轮询分区3、分区算子#xff1a;重缩放分区4、分区算子#xff1a;广播5、分区算子#xff1a;全局分区6、自定义分区 重分区#xff0c;即数据洗牌#xff0c;将数据分配到下游算子的并行子… 文章目录 1、 分区算子随机分区2、分区算子轮询分区3、分区算子重缩放分区4、分区算子广播5、分区算子全局分区6、自定义分区 重分区即数据洗牌将数据分配到下游算子的并行子任务中。常见的分区策略有
随机分区轮询分区重缩放分区广播全局分区自定义分区
1、 分区算子随机分区
调用DataStream的.shuffle()方法将数据随机地分配到下游算子的并行任务中去。 demo代码socket模拟无界流设置并行度为2读入数据后接shuffle再打印
public class ShuffleExample {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(2);DataStreamSourceInteger stream env.socketTextStream(node01, 9527);stream.shuffle().print()env.execute();}
}
可以看到数据流经过shuffle重分区后到输出算子的哪个子任务是随机的 2、分区算子轮询分区
用DataStream的.rebalance()方法rebalance使用的是Round-Robin负载均衡算法就像发牌将输入流数据平均分配到下游的并行任务中去。 stream.rebalance().下游算子....3、分区算子重缩放分区
和轮询相似不同的是重缩放是局部轮询只给和它组队的分区轮询数据而不是给所有分区。调用rescale方法时其实底层也是使用Round-Robin算法进行轮询 stream.rescale().下游算子...4、分区算子广播
通常一条数据去往一个子任务去处理即可但广播就是调用DataStream的broadcast()方法将输入数据复制并发送到下游算子的所有并行任务中去。
stream.broadcast().print();5、分区算子全局分区
极端的分区方式会将数据流中的数据全都发送到下游算子的第一个子任务中去 相当于强行让下游任务并行度变成了1注意是相当于不是真把下游算子并行度改成1了只是不往其他子任务发数据了其他有跟没有一样了。
stream.global().print();发送数据 效果 6、自定义分区
以上的Flink分区策略都不满足需求时可自定义分区策略首先实现Partitioner接口自定义分区器
public class MyPartitioner implements PartitionerString {Overridepublic int partition(String key, int numPartitions) {return Integer.parseInt(key) % numPartitions;}
}//numPartitions 下游算子并行度
//这里的分区策略简单写个key除以算子并行度取余
//该方法返回的是分区索引使用自定义分区器
public class PartitionCustomDemo {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());env.setParallelism(2);DataStreamSourceString socketDS env.socketTextStream(node01, 9527);DataStreamString myDS socketDS.partitionCustom(new MyPartitioner(),value - value);myDS.print();env.execute();}
}
自定义分区用的api是partitionCustompartitionCustom方法第一个参数是自定义的分区器对象第二个参数是key的选择器对象KeySelector和keyBy方法一样value - value即以输入数据为key
到此就实现了数据往下游算子的子任务分配时按什么规则来分。以上就是Flink的常用分区策略此外还有一种one-to-one的分区器带上自定义分区器共8种