about云开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

about云开发 首页 大数据 Flink 连载型 查看内容

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

2018-12-17 12:17| 发布者: pig2| 查看: 11| 评论: 0|原作者: pig2

摘要: 问题导读 1.如何实现Flink流分区? 2.对于数据倾斜,该使用什么函数实现数据均衡? 3.Rescaling与rebalance有什么区别? 上一篇: 彻底明白Flink系统学习11:【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

可以提供分区函数的自定义实现,使用用户定义的分区程序为每个元素选择任务。
[Scala] 纯文本查看 复制代码
dataStream.partitionCustom(partitioner, "someKey")
dataStream.partitionCustom(partitioner, 0)


2.随机分区
Random partitioning
DataStream → DataStream

根据均匀分布随机分配元素。
[Scala] 纯文本查看 复制代码
dataStream.shuffle()


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

[Scala] 纯文本查看 复制代码
dataStream.rebalance()


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

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

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

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

1.png

[Scala] 纯文本查看 复制代码
dataStream.rescale()


5.广播
Broadcasting
DataStream → DataStream

向每个分区广播元素。
[Scala] 纯文本查看 复制代码
dataStream.broadcast()


最新经典文章,欢迎关注公众号




鲜花

握手

雷人

路过

鸡蛋
关闭

推荐上一条 /3 下一条

QQ|小黑屋|about云开发-学问论坛|社区 ( 京ICP备12023829号

GMT+8, 2018-12-19 18:58 , Processed in 0.328347 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2 Licensed

返回顶部