购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 Flink数据分区

在Flink中,数据流或数据集被划分成多个独立的子集,这些子集分布到了不同的节点上,而每一个子集称为分区(Partition)。因此可以说,Flink中的数据流或数据集是由若干个分区组成的。数据流或数据集与分区的关系如图2-16所示。

图2-16 数据集与分区的关系

通过将每个记录分配给一个或多个分区来把数据流或数据集划分为多个分区。在运行期间,Task会消费数据流或数据集的分区。改变数据流或数据集分区方式的转换通常称为重分区。

2.3.1 分区数量

在运行期间,每个数据记录将被分配给一个或多个分区,各个分区中的数据可以并行计算。我们已经知道,数据是由上游算子的某个实例(SubTask)发往下游算子的一个或多个实例,而一个算子实例只负责计算一个分区的数据。因此,分区的数量是由下游算子的实例数量(并行度)决定的,发往下游算子的数据分区数量等于下游算子的实例数量。

如图2-17所示,上游Source算子的并行度为1,下游map()算子的并行度为2,数据由Source发往map(),因此将分成两个分区,map()的两个实例各自执行一个分区的数据。

图2-17 数据的数量

数据分区的一个原则是使得分区的数量尽量等于集群节点CPU的核心数量,而前面提到过,算子的并行度应尽量等于集群节点CPU的核心数量,可见两者保持一致。

2.3.2 分区策略

Flink分区策略决定了一条数据如何发送给下游算子的不同实例,或者说如何在下游算子的不同实例之间进行数据划分。程序运行时,系统会根据算子的语义和配置的并行度自动选择数据的分区策略。当然,也可以在程序中显式指定分区策略。

Flink常见的分区策略如下。

1.转发策略

在上游算子实例和下游算子实例之间一对一地进行数据传输。这种策略不会产生重分区(改变数据流或数据集分区方式的转换通常称为重分区),且可以避免网络传输,以提高传输效率。假设上游算子A和下游算子B的并行度都为2,使用转发策略的效果如图2-18所示。

2.广播策略

上游算子实例的每个数据记录都会发往下游算子的所有实例。这种策略会把数据复制多份,向下游算子的每个实例发送一份,且涉及网络传输,代价较高。使用广播策略的效果如图2-19所示。

图2-18 转发策略

图2-19 广播策略

3.键值策略

根据数据记录中的键对数据进行重分区,键相同的数据记录一定会被发送给下游同一个算子实例,键不同的数据记录可能会被发送到下游不同的算子实例,也可能会被发送到下游同一个算子实例。这种策略要求数据记录的格式为(键,值)形式,如图2-20所示。

4.随机策略

将数据记录进行随机重分区,数据记录会被均匀分配到下游算子的每个实例。这种策略可以实现计算任务的负载均衡,如图2-21所示。

图2-20 键值策略

图2-21 随机策略

5.全局策略

将上游所有数据记录发送到下游第一个算子实例,如图2-22所示。

图2-22 全局策略

6.自定义策略

如果内置的分区策略不能满足当前需求,则可以在程序中自定义分区策略。更多分区策略及在程序中的API应用见4.9节。 BugYwVvT3W6HpDTRGoLhzgNtj94lPzNyZsPtAGHX6+yKaQRWzPYF6Z+8oqsKMU4l

点击中间区域
呼出菜单
上一章
目录
下一章
×