一、Physical partitioning
- 在一个transformation之后,Flink也提供了底层API以允许用户在必要时精确控制流分区。
- 所谓的Physical partitioning(或operator partition)就是operator parallel instance即SubTask。
- Flink allows us to perform physical partitioning of the stream data. You have an option to
provide custom partitioning. Let us have a look at the different types of partitioning.
1、Custom partitioning
- As mentioned earlier, you can provide custom implementation of a partitioner.
- While writing a custom partitioner you need make sure you implement an efficient hash function.
2、Shuffle (Random partitioning 随机)
- Random partitioning randomly partitions data streams in an evenly(均匀) manner.
3、Rebalancing partitioning(均匀 via round robin method)
- This type of partitioning helps distribute the data evenly. It uses a round robin method for distribution. This type of partitioning is good when data is skewed.
4、Rescaling
Rescaling is used to distribute the data across operations, perform transformations on sub-sets of data and combine them together. This rebalancing happens over a single node only, hence it does not require any data transfer across networks.
5、Broadcasting(动态规则更新)
- Broadcasting distributes all records to each partition. This fans out each and every element to all partitions.
二、比较
1、shuffle VS rebalance(来自stackoverflow)
正如文档所述,shuffle将随机分发数据,而rebalance将以循环方式分发数据。后者更有效,因为您不必计算随机数。而且,根据随机性,你最终可能会得到某种不那么均匀的分布。
另一方面,rebalance将始终开始将第一个元素发送到第一个通道。因此,如果您只有少量元素(元素少于子任务),那么只有部分子任务将接收元素,因为您总是开始将第一个元素发送到第一个子任务。在流式传输的情况下,这最终无关紧要,因为你通常有一个无界的输入流。
两种方法存在的实际原因是历史原因。shuffle首先介绍。为了使批处理的流API更加相似,rebalance然后介绍了。
2、Rescaling(低配版Rebalance, 无需网络传输)
以round-robin方式对元素分区到下游operations。如果你想从source的每个并行实例分散到若干个mappers以负载均衡,但是你不期望rebalacne()那样进行全局负载均衡,这将会有用。这将仅需要本地数据传输,而不是通过网络传输数据,具体取决于其他配置值,例如TaskManager的插槽数。
上游operation所发送的元素被分区到下游operation的哪些子集,取决于上游和下游操作的并发度。例如,如果上游operation并发度为2,而下游operation并发度为6,则其中1个上游operation会将元素分发到3个下游operation,另1个上游operation会将元素分发到另外3个下游operation。相反地,如果上游operation并发度为6,而下游operation并发度为2,则其中3个上游operation会将元素分发到1个下游operation,另1个上游operation会将元素分发到另外1个下游operation。
在上下游operation的并行度不是彼此的倍数的情况下,下游operation对应的上游的operation输入数量不同。