06-Flink 物理分区和 keyby 分区的区别

Flink 官网主页地址:https://flink.apache.org
Flink 官方中文地址:https://nightlies.apache.org/flink/flink-docs-stable/zh/

分区是大数据处理中一个非常重要的一环。分区是将数据进行重新分布,传输到不同的通道进行下一步数据处理。

keyby 是按照键的哈希值进行的重分区操作。这种分区只能把数据按 key 分开,至于分的均匀与否,每个 key 的数据具体会分到哪一个区,这些是无法控制的(原因是不能保证待分区数据 key 是否均匀分布),因此将 keyby 称之为逻辑分区(软分区)。

真正的硬核分区称之为物理分区。也就是我们真正要控制的分区策略,精准的调配数据,通知每个数据要去哪个分区进行处理,即设置任务的并行度,如果上下设置不同的并行度,那么当数据执行上下游任务并行度变化时,数据就不应该还在当前的分区直通(forward)方式传输,如果并行度减小,当前分区可能没有下游任务,如果并行度增大,所有数据还在原有的分区处理就会导致资源浪费。所以这种情况,系统会自动的将数据均匀的发往下游所有的并行任务,从而保证各分区负载均衡。

有些时候,我们还需要手动控制数据分区分配策略。比如当发生数据倾斜的时候,系统无法自动调整,这时就需要我们重新进行负载均衡,将数据流较为平均地发送到下游任务操作分区中去。Flink 对于经过转换操作之后的 DataStream,提供了一系列的底层操作接口,能够帮我们实现数据流的手动重分区。为了同 keyBy 相区别,我们把这些操作统称为“物理分区”操作。

物理分区与 keyBy 另一大区别在于,keyBy 之后得到的是一个 KeyedStream,而物理分区之后结果仍是 DataStream,且流中元素数据类型保持不变。从这一点也可以看出,分区算子并不对数据进行转换处理,只是定义了数据的传输方式。常见的物理分区策略有随机分配、轮询分配、组内轮询和广播。


06-Flink 物理分区和 keyby 分区的区别
https://flepeng.github.io/044-Flink-42-核心概念-06-Flink-物理分区和-keyby-分区的区别/
作者
Lepeng
发布于
2021年3月8日
许可协议