(1) 随机分区(Random Partitioning)
随机分到下游分区,分区相对均衡,但比较容易失去原有数据的分区结构
val shuffleStream = dataStream.shuffle |
(2) 平衡分区(Roundrobin Partitioning)
重分区,尽可能保证每个分区内的数量平衡
val shuffleStream = dataStream.rebalance() |
(3) 按比例分区(Rescaling Partitioning)
上游并发度2,下游并发度4,上游一个分区的数据就会路由到下游的两个分区中
senv.readTextFile("").rescale() |
(4) 广播操作
下游算子中的tasks可以直接从本地内存中获取广播数据集,不再依赖于网络传输.这种分区策略适合小数据集,当大数据与小数据集关联时,可以广播的方式将小数据集分发到算子的每个分区中
val datas = senv.readTextFile("").broadcast() |
(5) 自定义分区
import org.apache.flink.api.common.functions.Partitioner import scala.util.Random object customPartitioner extends Partitioner[String] { override def partition(key: String, numPartitions: Int): Int = { if (key.contains("flink")) 0 else Random.nextInt(numPartitions) } } |