pig2 发表于 2018-12-17 12:09:32

彻底明白Flink系统学习12:【Flink1.7】如何控制流物理分区

问题导读

1.如何实现Flink流分区?
2.对于数据倾斜,该使用什么函数实现数据均衡?
3.Rescaling与rebalance有什么区别?

上一篇:
彻底明白Flink系统学习11:【Flink1.7】事件时间、处理时间、提取时间有什么区别
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26488

Flink允许我们对流数据执行物理分区,经过transformation后,通过下面函数,控制流分区。

1.自定义分区
Custom partitioning
DataStream → DataStream

可以提供分区函数的自定义实现,使用用户定义的分区程序为每个元素选择任务。
dataStream.partitionCustom(partitioner, "someKey")
dataStream.partitionCustom(partitioner, 0)

2.随机分区
Random partitioning
DataStream → DataStream

根据均匀分布随机分配元素。
dataStream.shuffle()


3.重新平衡分区
这种类型的分区有助于均匀分布数据。 它使用循环方法进行分发,每个分区创建相等的负载。 存在数据偏斜时用于性能优化。
Rebalancing (Round-robin partitioning)
DataStream → DataStream

dataStream.rebalance()


4.重新缩放
Rescaling
DataStream → DataStream分区元素,循环,到下游操作的子集。如果希望拥有管道,例如,从源的每个并行实例扇出到多个映射器的子集以分配加载但又不希望发生rebalance()全量重分区的话,那么这非常有用。这仅需要本地数据传输而不是通过网络传输数据,具体取决于其他配置值,例如TaskManagers的插槽数。

上游操作发送元素的下游操作的子集取决于上游和下游操作的并行度。例如,如果上游操作具有并行性2并且下游操作具有并行性4,则一个上游操作将分配元件到两个下游操作,而另一个上游操作将分配到另外两个下游操作。另一方面,如果下游操作具有并行性2而上游操作具有并行性4,那么两个上游操作将分配到一个下游操作,而另外两个上游操作将分配到其他下游操作。

在不同并行度不是彼此的倍数的情况下,一个或多个下游操作将具有来自上游操作的不同数量的输入。

可参考下图,了解上例中连接模式



dataStream.rescale()


5.广播
Broadcasting
DataStream → DataStream

向每个分区广播元素。
dataStream.broadcast()


最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg


美丽天空 发表于 2018-12-18 22:15:34

感谢分享

huangrong 发表于 2019-5-10 12:58:10

感觉这章翻译的稍显生硬

金瞳 发表于 2019-12-25 11:23:59

上游操作发送元素的下游操作的子集取决于上游和下游操作的并行度
页: [1]
查看完整版本: 彻底明白Flink系统学习12:【Flink1.7】如何控制流物理分区