在 Apache Flink 中,ProcessFunction 或 FlatMapFunction 本身的实现不能直接限制并行度。但您可以通过以下两种方式控制算子(包括 process 或 flatMap)的并行度:
方法 1:为算子单独设置并行度(推荐)
在调用算子时,通过 .setParallelism(1) 显式指定该算子的并行度为 1:
DataStream<String> input = ...;
// 对 flatMap 算子设置并行度 1
DataStream<String> result = input
.flatMap(new MyFlatMapFunction())
.setParallelism(1); // 关键设置
// 对 process 算子设置并行度 1
DataStream<String> processed = result
.process(new MyProcessFunction())
.setParallelism(1); // 关键设置
方法 2:设置全局并行度为 1
通过执行环境设置整个作业的默认并行度为 1(慎用,会影响所有算子):
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1); // 所有算子默认并行度=1
// 后续算子的并行度自动为1
input.flatMap(...);
input.process(...);
关键注意事项:
-
并行度属于算子级别
并行度是算子(如flatMap、process)的属性,而非函数(如FlatMapFunction)的属性。需要在算子调用链中显式设置。 -
KeyedStream 的特殊性
若算子作用在KeyedStream上(如keyBy().process()),设置并行度为 1 会导致所有数据由单个任务处理,但数据仍会按 Key 分组(只是所有 Key 由同一个任务处理)。 -
性能影响
将并行度设为 1 会使该算子成为单点瓶颈,需谨慎评估是否必要(如测试、有状态算子需单线程等场景)。
完整代码示例
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> input = env.socketTextStream("localhost", 9999);
// 示例1:设置 flatMap 的并行度为1
DataStream<String> words = input
.flatMap((String line, Collector<String> out) -> {
for (String word : line.split(" ")) {
out.collect(word);
}
})
.returns(Types.STRING)
.setParallelism(1); // 限制为单线程
// 示例2:设置 process 的并行度为1
DataStream<Tuple2<String, Integer>> wordCounts = words
.keyBy(word -> word)
.process(new KeyedProcessFunction<String, String, Tuple2<String, Integer>>() {
@Override
public void processElement(String word, Context ctx, Collector<Tuple2<String, Integer>> out) {
// 处理逻辑
out.collect(new Tuple2<>(word, 1));
}
})
.setParallelism(1); // 限制为单线程
wordCounts.print();
env.execute("Single Parallelism Example");
总结:
| 方法 | 作用范围 | 推荐度 |
|---|---|---|
.setParallelism(1) |
仅当前算子 | ★★★★★ |
env.setParallelism(1) |
整个作业 | ★★☆☆☆ |
推荐优先使用算子级别的 setParallelism(1),避免影响作业其他部分的性能扩展能力。

浙公网安备 33010602011771号