当前位置: 首页 > news >正文

Flink的DataStream分区操作

Flink中的分区操作是将数据流根据指定的分区策略重新分配到不同节点上,由不同任务执行。默认情况下,Flink使用轮询方式(rebalance partitioner)将数据从上游分发到下游算子。然而,在某些情况下,用户可能希望自己控制分区,例如在数据倾斜的场景中,为了实现这种控制,可以使用预定义的分区策略或自定义分区策略来决定数据的流转和处理方式。

Flink内部提供了常见的分区策略有如下8种:哈希分区(Hash partitioner)、随机分区(shuffle partitioner)、轮询分区(reblance partitioner)、重缩放分区(rescale partitioner)、广播分区(broadcast partitioner)、全局分区(global partitioner)、并行分区(forward partitioner)、自定义分区。使用以上各类分区策略时需要使用不同的DataStream 方法进行操作,下面分别进行演示。

keyBy哈希分区

在Flink中可以对DataStream调用KeyBy方法来使用hash partitioner,该方法需要指定一个key,对该key进行hash计算然后与下游task个数取模来决定数据应该被下游哪些分区task处理。

keyBy具体代码参考6.4小节KeyBy算子操作。

shuffle随机分区

在Flink中可以对DataStream调用shuffle方法来使用shuffle partitioner分区策略对数据进行随机分区,将数据随机分配到下游算子每个分区中,shuffle方法不会改变DataStream类型。可以在增大分区,或者出现数据倾斜的场景中使用该方式对数据进行随机分区。

rebalance轮询分区

在Flink中可以对DataStream调用rebalance方法来使用reblance partitioner分区策略对数据进行轮询重分区,这种分区方式采用RoundRobin负载均衡算法保证每个分区的数据平衡,当数据出现倾斜时可以使用这种分区策略对数据进行重分区。

rescale重缩放分区

在Flink中可以使用rescale方法使用rescale partitioner分区策略对数据进行重分区。与rebalance partitioner分区策略类似,rescaling 分区策略也采用RoundRobin负载均衡算法进行重分区,但该分区策略不采用全局性的网络传输来实现数据的重分区,它使用一种本地的分区策略,通过调整任务的数量来改变数据的分配方式。

当Flink处理的数据量较多时,rescale 分区策略会在当前TaskManager中进行本地节点的重分区,这样只需要在当前TaskManager中多个Slot之间进行数据重新分配而避免跨节点全局重分区操作带来的网络开销大的问题。

使用rescale 时,建议下游算子并行度是上游算子并行度的整数倍,这样效率比较高。例如:如果上游操作的并行度为2,下游操作的并行度为6,那么一个上游操作将将元素分发给三个下游操作,而另一个上游操作将分发给其他三个下游操作。如果上下游算子并行度不是整数倍就会存在上游算子并行度向下游分发数据分发的并行度不同,如下图所示:

broadcast广播分区

在Flink中可以对DataStream调用broadcast方法使用broadcast partitioner分区策略将数据流数据复制广播到下游算子各个并行task中,下游算子task可以直接从本地内存中获取广播数据集使用,不再依赖网络传输数据流数据。broadcast partitioner 分区策略适合于小数据集广播,例如,当大数据集关联小数据集时,可以通过广播小数据集方式将数据分发到算子的每个分区中。

global全局分区

在Flink中可以对DataStream调用global方法使用global partitioner全局分区策略将一个多分区的流转换到一个分区中,也就是说该方法会强制将多个上游task处理的数据发送到下游1个task中处理。如果DataStream数据流数据量非常少,可以通过该方法将数据汇集到一个task中处理提高效率,但如果DataStream数据流数据量大,该方法应该慎用。

forward并行分区

在Flink中可以对DataStream调用forward方法使用forward partitioner并行分区策略原封不动的将上游分区数据转发到下游分区中,即上游分区数据分发到下游对应分区一对一的数据分发。map、flatMap、filter 等算子上下游并行度一样时默认就是这种分区策略。

partitionCustom 自定义分区

partitionCustom算子是Flink中用于自定义数据分区的算子,通过实现自定义的分区函数,可以根据特定需求对数据进行灵活的分区操作,实现满足用户定制化的分区策略。在使用partitionCustom算子时需要传入2个参数,第一个参数用户实现的分区器Partitioner对象,该分区器决定流数据去往下游哪些分区,第二个参数指定应用分区器的字段。

Java代码实现

http://www.jsqmd.com/news/940337/

相关文章:

  • 构建智能代码搜索系统:从语义理解到IDE集成,提升开发效率
  • 端到端语音识别技术:从原理到实战,构建流式ASR系统
  • MATLAB中三个开箱即用的短时傅里叶逆变换函数实现
  • 别只跑Demo了!用香橙派5的NPU部署自定义Yolov5模型,实现边缘安防监控
  • PyQt5实战:手把手教你用样式表打造一个圆形进度按钮(附完整代码和资源文件)
  • 告别命令行!用Docker快速部署sqlite-web,在浏览器里像玩Excel一样管理SQLite数据库
  • 【不懂编程也能用】Open Claw 本地 AI 助手 10 分钟上手完整流程(包含安装包)
  • Sora 2赋能县域文旅爆火的7个关键动作:从方言配音到实景三维重建,手把手拆解省级示范案例
  • 色多项式导数与高阶导数:从着色计数到图结构分析
  • 数据科学入门:从零构建女性学习者的技术成长体系
  • OBS多路推流插件深度解析:架构设计与性能优化专业指南
  • 别再死记硬背UDP报文了!用C语言结构体位段,5分钟带你亲手‘拆解’一个UDP包
  • UE5.1安卓打包APK保姆级避坑指南:从JDK配置到SDK路径,手把手解决‘SetupAndroid.bat’报错
  • 告别串口调试助手乱码!STM32 HAL库下printf重定向的完整配置流程(含Keil5设置)
  • 给计算机/工科生的数学课指南:选《高等数学》还是《数学分析》?附主流教材对比(2024版)
  • Godot4 3D游戏实战:如何给你的跳跃小游戏加上计分板和死亡重玩机制
  • 2026年天津房产纠纷避坑指南:5位靠谱专业律师推荐 - 本地品牌推荐
  • 从HashMap到ConcurrentHashMap:聊聊Map.compute方法在并发编程里的那些“坑”与最佳实践
  • 2026年AI论文写作工具实测揭秘:5款神器从构思到提交全流程护航
  • 别只盯着远场图!CST场监视器(Field Monitor)的‘Subvolume’功能,让你精准锁定关键区域
  • FFF:比 ripgrep 和 fzf 更快的文件搜索工具包,多场景性能优势显著!
  • 手把手教你用STM32高级定时器TIM8生成20kHz SPWM波(从正弦表计算到代码实现)
  • 从Boss直聘zp_stoken看前端安全:那些年我们绕过的反爬与检测
  • Beyond Compare 5密钥生成器:5分钟解决文件对比工具激活难题
  • 别再傻傻分不清!CTP API里持仓和持仓明细到底啥区别?一个例子讲透
  • sql.js WASM 深度解析
  • 四足机器人地形自适应运动规划技术解析
  • SPSS/R/SAS三平台直接可用的PROCESS v4.3全套分析文件(含安装指南与模型模板)
  • 告别假货与仿真坑:用LMV358M设计工频信号采集前端,从选型、计算到Proteus验证的完整流程
  • 别再只会conda info --envs了!这5个隐藏技巧帮你高效管理Python环境