3.物理分区
Flink 提供以下方法让用户根据需要在数据转换完成后对数据分区进行更细粒度的配置。
a)自定义分区
DataStream → DataStream
使用自定义的 Partitioner 为每个元素选择目标任务。
dataStream.partitionCustom(partitioner, "someKey");
dataStream.partitionCustom(partitioner, 0);
b)随机分区
DataStream → DataStream
将元素随机地均匀划分到分区。
dataStream.shuffle();
c)Rescaling
DataStream → DataStream
将元素以 Round-robin 轮询的方式分发到下游算子。
如果想将数据源的多个并发实例的数据分发到多个下游 map 来实现负载分配,但又不想像 rebalance() 那样引起完全重新平衡,该算子将只会到本地数据传输而不是网络数据传输,这取决于其它配置值,例如 TaskManager 的 slot 数量。
上游算子将元素发往哪些下游的算子实例集合同时取决于上游和下游算子的并行度;例如,如果上游算子并行度为 2,下游算子的并发度为 6, 那么上游算子的其中一个并行实例将数据分发到下游算子的三个并行实例, 另外一个上游算子的并行实例则将数据分发到下游算子的另外三个并行实例中。再如,当下游算子的并行度为2,而上游算子的并行度为 6 的时候,那么上游算子中的三个并行实例将会分发数据至下游算子的其中一个并行实例,而另外三个上游算子的并行实例则将数据分发至另下游算子的另外一个并行实例。
当算子的并行度不是彼此的倍数时,一个或多个下游算子将从上游算子获取到不同数量的输入。
dataStream.rescale();
d)广播
DataStream → DataStream
将元素广播到每个分区 。
dataStream.broadcast();