目录1. Shuffle随机分区2. Rebalance轮询分区3. Rescale分组轮询分区4. Broadcast广播分区5. Global全局分区6. PartitionCustom自定义分区拓展总结注意事项package transform import org.apache.flink.api.common.functions.Partitioner import org.apache.flink.streaming.api.functions.source.{RichParallelSourceFunction, SourceFunction} import org.apache.flink.streaming.api.scala._ import source.ClickSource /** * * PROJECT_NAME: flink1.13 * PACKAGE_NAME: transform * author: 赵嘉盟-HONOR * data: 2025-05-19 3:56 * DESCRIPTION * */ object 物理分区算子 { def main(args: Array[String]): Unit { val envStreamExecutionEnvironment.getExecutionEnvironment val dataenv.addSource(new ClickSource) //洗牌随机 data.shuffle.print(shuffle).setParallelism(4) //发牌轮询 data.rebalance.print(rebalance).setParallelism(4) //发牌分组轮询 val dataRescaleenv.addSource(new RichParallelSourceFunction[Int] { override def run(sourceContext: SourceFunction.SourceContext[Int]): Unit { for(i - 0 to 7){ if(getRuntimeContext.getIndexOfThisSubtask(i1)%2) sourceContext.collect(i1) } } override def cancel(): Unit ??? }) dataRescale.rescale.print(rescale).setParallelism(4) //广播(复制多份) data.broadcast.print(broadcast).setParallelism(4) //全局分区所有数据分发到第一个并行子程序 data.global.print(global).setParallelism(4) //自定义分区(分区器指定分区选择器提取当前分区字段) val dataPartitionenv.fromElements(1,2,3,4,5,6,7,8) dataPartition.partitionCustom(new Partitioner[Int] { override def partition(k: Int, i: Int): Int k%2 },datadata).print(partitionCustom).setParallelism(4) env.execute(物理分区算子) } }在 Apache Flink 中物理分区算子Physical Partitioning Operators用于控制数据在并行任务之间的分发方式。这些算子可以影响数据流的分区策略从而优化任务的并行执行和负载均衡。以下是对代码中使用的物理分区算子的详细解释和拓展总结1.Shuffle随机分区算子:shuffle作用: 将数据随机分发到下游的并行任务中。每个元素被随机分配到任意一个并行子任务。适用场景: 当数据分布均匀且没有特定的分区需求时可以使用shuffle来实现负载均衡。代码示例:data.shuffle.print(shuffle).setParallelism(4)2.Rebalance轮询分区算子:rebalance作用: 将数据均匀地轮询分发到下游的并行任务中。每个元素依次分配到下一个并行子任务。适用场景: 当需要均匀分布数据到所有并行任务时可以使用rebalance。代码示例:data.rebalance.print(rebalance).setParallelism(4)3.Rescale分组轮询分区算子:rescale作用: 将数据在局部范围内进行轮询分发。与rebalance不同rescale只在部分并行任务之间进行轮询而不是全局。适用场景: 当数据源和下游任务的并行度不一致时可以使用rescale来优化数据分发。代码示例:dataRescale.rescale.print(rescale).setParallelism(4)4.Broadcast广播分区算子:broadcast作用: 将数据复制并广播到所有的下游并行任务中。每个并行子任务都会接收到完整的数据集。适用场景: 当所有并行任务都需要完整的数据集时可以使用broadcast。代码示例:data.broadcast.print(broadcast).setParallelism(4)5.Global全局分区算子:global作用: 将所有数据发送到下游的第一个并行任务中。其他并行任务不会接收到任何数据。适用场景: 当需要将所有数据集中处理时可以使用global。代码示例:data.global.print(global).setParallelism(4)6.PartitionCustom自定义分区算子:partitionCustom作用: 允许用户自定义分区策略。用户需要实现Partitioner接口来定义如何将数据分发到不同的并行任务。适用场景: 当有特定的分区需求时可以使用partitionCustom来实现自定义的分区逻辑。代码示例:dataPartition.partitionCustom(new Partitioner[Int] { override def partition(k: Int, i: Int): Int k % 2 }, data data).print(partitionCustom).setParallelism(4)拓展总结负载均衡:shuffle和rebalance是常用的负载均衡策略适用于大多数场景。数据局部性:rescale可以在局部范围内优化数据分发减少跨节点的数据传输。数据复制:broadcast适用于需要将数据复制到所有并行任务的场景但会增加网络开销。数据集中处理:global将所有数据集中到一个任务中适用于需要全局处理的场景。自定义分区:partitionCustom提供了最大的灵活性允许用户根据业务需求自定义分区策略。注意事项并行度设置: 在使用这些分区算子时需要注意并行度的设置以确保数据能够正确地分发到各个并行任务中。性能影响: 不同的分区策略会对性能产生不同的影响特别是在数据量较大时选择合适的分区策略可以显著提高任务的执行效率。通过合理使用这些物理分区算子可以有效地控制数据流的分发方式优化 Flink 任务的并行执行和负载均衡。