Flink(八)Flink的Parallelism并行度

本文详细介绍了Apache Flink中并行性的设置方法,包括操作符级别、执行环境级别、客户端级别及系统级别的并行度调整。文章深入探讨了如何在不同层面设定并行度,以及这些设置之间的覆盖关系,为Flink应用的性能优化提供了指导。

一、Flink的Parallel Execution

 

实例

1.Operator Level

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
​
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = text
    .flatMap(new LineSplitter())
    .keyBy(0)
    .timeWindow(Time.seconds(5))
    .sum(1).setParallelism(5);
​
wordCounts.print();
​
env.execute("Word Count Example");

operators、data sources、data sinks都可以调用setParallelism()方法来设置parallelism

2.Execution Environment Level

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(3);
​
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = [...]
wordCounts.print();
​
env.execute("Word Count Example");

在ExecutionEnvironment里头可以通过setParallelism来给operators、data sources、data sinks设置默认的parallelism;如果operators、data sources、data sinks自己有设置parallelism则会覆盖ExecutionEnvironment设置的parallelism

3.Client Level

./bin/flink run -p 10 ../examples/*WordCount-java*.jar

或者

try {
    PackagedProgram program = new PackagedProgram(file, args);
    InetSocketAddress jobManagerAddress = RemoteExecutor.getInetFromHostport("localhost:6123");
    Configuration config = new Configuration();
​
    Client client = new Client(jobManagerAddress, config, program.getUserCodeClassLoader());
​
    // set the parallelism to 10 here
    client.run(program, 10, true);
​
} catch (ProgramInvocationException e) {
    e.printStackTrace();
}

使用CLI client,可以在命令行调用是用-p来指定,或者Java/Scala调用时在Client.run的参数中指定parallelism

4.System Level

# The parallelism used for programs that did not specify and other parallelism.
​
parallelism.default: 1

可以在flink-conf.yaml中通过parallelism.default配置项给所有execution environments指定系统级的默认parallelism

小结

Flink可以设置好几个level的parallelism,其中包括Operator Level、Execution Environment Level、Client Level、System Level

在flink-conf.yaml中通过parallelism.default配置项给所有execution environments指定系统级的默认parallelism;在ExecutionEnvironment里头可以通过setParallelism来给operators、data sources、data sinks设置默认的parallelism;如果operators、data sources、data sinks自己有设置parallelism则会覆盖ExecutionEnvironment设置的parallelism

Flink SQL 中设置或增加 SQL 作业的并行度可以通过多种方式进行,具体取决于作业的执行模式(如批处理或流处理)、数据源与数据接收器的类型,以及是否使用 Hive 集成等场景。以下是一些常见且有效的设置方法: ### 设置全局并行度Flink SQL 环境中,可以通过 `StreamExecutionEnvironment` 来设置全局并行度。例如,在使用 Flink SQL 的编程接口时,可以如下设置: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(4); // 设置全局并行度为4 ``` 此设置会影响整个作业的默认并行度[^3]。 ### 设置特定算子的并行度 对于某些特定的算子,可以通过 SQL 的表属性或特定的配置来设置其并行度。例如,在使用 Hive 集成时,可以设置 Hive 表的并行度推断属性,如下所示: ```java tEnv.getConfig.getConfiguration.set[java.lang.Boolean](HiveOptions.TABLE_EXEC_HIVE_INFER_SOURCE_PARALLELISM, false) tEnv.getConfig.getConfiguration.set[Integer](HiveOptions.TABLE_EXEC_HIVE_INFER_SOURCE_PARALLELISM_MAX, 8) ``` 这段代码禁用了 Hive 表的源并行度自动推断,并设置了最大并行度为 8[^4]。 ### 设置 Sink 的并行度 对于 Sink 操作,也可以通过表属性来设置其并行度。例如: ```sql ALTER TABLE table_name SET TBLPROPERTIES ('sink.parallelism' = '10'); ``` 这会将指定表的 Sink 操作并行度设置为 10。 ### 设置最大并行度 为了能够在恢复 Savepoint 时调整并行度,需要设置最大并行度。这通常在作业的初始化阶段完成,确保在 Flink 内部状态划分时考虑到未来的并行度调整需求[^1]。 ### 注意事项 - **资源分配**:并行度的设置还应考虑 Task Manager 上的 Slot 数量,确保有足够的资源来支持所设置的并行度[^3]。 - **性能优化**:合理设置并行度可以减少线程之间的切换和基于缓存区的数据交换,从而减少时延并提升吞吐量[^2]。 通过以上方法,可以根据具体的应用场景和需求,灵活地设置或增加 Flink SQL 中 SQL 作业的并行度,以达到最佳的性能表现。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值