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

Flink 并行度的设置

在 Apache Flink 中,并行度(Parallelism) 是控制任务并发执行的核心参数之一。Flink 提供了 多个层级设置并行度的方式,优先级从高到低如下:


🧩 一、Flink 并行度的四个设置层级

层级描述设置方式
Operator Level为某个具体的算子设置并行度operator.setParallelism(n)
Execution Environment Level为整个流处理环境设置默认并行度env.setParallelism(n)
Client Level(提交作业时)通过命令行指定全局并行度flink run -p n
System Level(系统配置)flink-conf.yaml 中定义全局默认值parallelism.default: n

✅ 二、各层级设置详解与示例

1. Operator Level(算子级别)

  • 优先级最高
  • 可以为特定算子设置不同并行度,适用于数据倾斜或资源敏感操作
🔧 示例:
DataStream<String> stream = env.fromElements("a", "b", "c");// 单独为 map 算子设置并行度为4
stream.map(new MyMapFunction()).setParallelism(4).print();
✅ 适用场景:
  • 某个算子计算密集,需要更多资源
  • 数据源分区数较少,但后续算子可并行化处理

2. Execution Environment Level(执行环境级别)

  • 设置整个 Job 的默认并行度
  • 如果未对某些算子单独设置,并使用此值
🔧 示例:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(4); // 所有算子默认并行度为4DataStream<String> stream = env.fromElements("a", "b", "c");
stream.map(new MyMapFunction()).print(); // 默认并行度为4
✅ 适用场景:
  • 多数算子使用相同并行度
  • 统一配置便于管理和维护

3. Client Level(客户端提交作业时)

  • 使用命令行参数动态设置并行度
  • 不修改代码即可适配不同运行环境(如测试/生产)
🔧 示例:
flink run -p 4 -c com.example.MyJob ./myjob.jar
✅ 适用场景:
  • 快速调整不同集群资源配置
  • 测试阶段快速验证性能

4. System Level(系统级别)

  • flink-conf.yaml 中设置全局默认并行度
  • 对所有提交的作业生效(除非被更高级别覆盖)
🔧 示例(flink-conf.yaml):
parallelism.default: 4
✅ 适用场景:
  • 所有作业共享相同的默认资源配置
  • 避免手动重复设置

📊 三、并行度优先级对比表

设置方式是否推荐场景覆盖关系
Operator Level✅✅✅特定算子优化最高优先级
Execution Environment Level✅✅整体统一配置被 Operator 覆盖
Client Level (-p)动态部署被前两者覆盖
System Level (flink-conf.yaml)⚠️兜底默认值最低优先级

💡 四、并行度设置建议

✅ 推荐做法:

  • 开发/测试环境:使用 .setParallelism()-p 命令行设置较小值(如1~4)
  • 生产环境
    • 使用 flink-conf.yaml 设置基础并行度
    • 使用 env.setParallelism() 明确控制默认值
    • 为关键算子单独设置更高并行度(如窗口聚合、复杂逻辑)

⚙️ 示例组合:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(4); // 默认并行度env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "Kafka Source").setParallelism(8) // Kafka Source 并行度设为8(等于topic分区数).map(new MyMapFunction()) // 使用默认并行度4.keyBy(keySelector).window(TumblingEventTimeWindows.of(Time.seconds(5))).process(new MyProcessWindowFunction()) // 可选 setParallelism().print();

🧠 五、并行度与资源的关系

并行度TaskManager 数量Slot 数量资源要求
≤ TM × slot✅ 正常运行✅ 正常运行资源充足
> TM × slot❌ 无法启动❌ 无法启动资源不足

✅ 建议:确保总并行度 ≤ 总 slot 数量


📈 六、实际调优建议

场景建议设置
Kafka Source并行度 = Kafka Topic 分区数
Map / FlatMap根据 CPU 利用率设置
Keyed Window Aggregation可适当提高并行度提升吞吐
Join / CoGroup视数据分布决定是否提高并行度
Sink若写入慢可适当增加并行度

✅ 七、完整示例(Java + Shell)

Java 设置(Env + Operator):

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(4);env.fromElements("a", "b", "c").map(x -> x).setParallelism(2) // 覆盖默认值.print();env.execute("Parallelism Example");

Shell 设置(Client Level):

flink run -p 8 -c com.example.MyJob ./myjob.jar

✅ 八、总结

层级用途是否推荐使用
Operator Level控制单个算子并行度✅✅✅ 强烈推荐用于关键路径优化
Execution Environment Level设置默认并行度✅✅ 推荐作为基础配置
Client Level动态设置并行度✅ 适合多环境部署
System Level全局兜底配置⚠️ 推荐配合其他方式使用

http://www.lryc.cn/news/2380207.html

相关文章:

  • 【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
  • get请求使用数组进行传参
  • 20. 自动化测试框架开发之Excel配置文件的IO开发
  • 【MySQL成神之路】MySQL常用语法总结
  • Linux动静态库制作与原理
  • 确保高质量的音视频通话,如何最大化利用视频带宽
  • ffmpeg 把一个视频复制3次
  • GPT/Claude3国内免费镜像站更新 亲测可用
  • AI自动化工作流:开启当下智能生产力的价值
  • stm32——EXTI外部中断
  • Python:操作Excel按行写入
  • Redis进阶知识
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • 12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】
  • bisheng系列(一)- 本地部署(Docker)
  • 如何用Python批量解压ZIP文件?快速解决方案
  • DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
  • JavaScript 中的五种继承方式进行深入对比
  • 企业标准信息公共服务平台已开放标准通编辑器访问入口
  • [Linux]安装吧!我的软件包管理器!
  • Spring Boot 与 RabbitMQ 的深度集成实践(三)
  • 进阶-数据结构部分:1、数据结构入门
  • React 19中useContext不需要Provider了。
  • Json schema校验json字符串(networknt/json-schema-validator库)
  • 交易所开发:构建功能完备的金融基础设施全流程指南
  • Windows_Vs2022 C#语言开发环境构建
  • Axure疑难杂症:统计分析页面引入Echarts示例动态效果
  • 展锐Android14及更新版本split_build编译方法
  • 青少年ctf平台应急响应-应急响应2
  • k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标