StreamExecutionEnvironment包含ExecutionConfig,它允许为运行时设置特定于作业的配置值。要更改影响所有作业的默认值,请参见配置。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
ExecutionConfig executionConfig = env.getConfig();
以下是可用的配置选项:
注意,用registerKryoType()注册的类型对Flink的POJO序列化器实例不可用。
在Rich*函数中可以通过getRuntimeContext()方法访问的RuntimeContext也允许访问所有用户定义函数中的ExecutionConfig。
如前所述,可以通过使用远程环境在集群上执行Flink程序。或者,程序可以打包到JAR file (Java Archives)中执行。打包程序是通过命令行接口执行它们的先决条件。
为了支持通过命令行或web界面从打包的JAR文件执行,程序必须使用StreamExecutionEnvironment.getExecutionEnvironment()获得的环境。当JAR被提交到命令行或web界面时,这个环境将充当集群的环境。如果Flink程序的调用方式与通过这些接口调用的方式不同,则该环境将像本地环境一样工作。
要打包该程序,只需将所有涉及的类导出为JAR文件。JAR文件的清单必须指向包含程序入口点的类(具有公共main方法的类)。最简单的方法是将主类条目放入清单中(例如main-class: org.apache.flinkexample.MyProgram)。main-class属性与Java虚拟机在通过Java -jar pathToTheJarFile命令执行JAR文件时用于查找主方法的属性相同。大多数ide在导出JAR文件时都提供了自动包含该属性的功能。
调用打包程序的整个过程包括两个步骤:
本节介绍如何在Flink中配置程序的并行执行。Flink程序由多个任务(转换/运算符、数据源和接收器)组成。一个任务被分割成几个并行实例来执行,每个并行实例处理任务输入数据的一个子集。任务的并行实例数称为并行度。
如果要使用保存点,还应该考虑设置最大并行度(或最大并行度)。从保存点恢复时,可以更改特定运算符或整个程序的并行度,此设置指定并行度的上限。这是必需的,因为Flink内部分区状态为键组,我们不能有+Inf数量的键组,因为这将不利于性能。
任务的并行度可以在Flink中指定不同的级别:
单个operator、数据源或数据接收器的并行度可以通过调用其setParallelism()方法来定义。例如,像这样:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = [...];
DataStream<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.sum(1).setParallelism(5);
wordCounts.print();
env.execute("Word Count Example");
如前所述,Flink程序是在执行环境的上下文中执行的。执行环境为它执行的所有操作符、数据源和数据接收器定义默认并行度。可以通过显式配置操作符的并行性来重写执行环境的并行性。
执行环境的默认并行度可以通过调用setParallelism()方法来指定。若要执行所有的运算符、数据源和数据汇的并行度为3,则设置执行环境的默认并行度如下:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(3);
DataStream<String> text = [...];
DataStream<Tuple2<String, Integer>> wordCounts = [...];
wordCounts.print();
env.execute("Word Count Example");
并行度可以在向Flink提交作业时在Client上设置。客户端既可以是Java程序,也可以是Scala程序。这种客户机的一个例子是Flink的命令行接口(CLI)。
对于CLI客户端,parallelism参数可以使用-p指定。例如:
./bin/flink run -p 10 ../examples/*WordCount-java*.jar
在Java/Scala程序中,并行度设置如下:
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();
}
可以通过在./conf/flink-conf.yaml中设置parallelism.default属性来定义所有执行环境的系统级默认并行度。详细信息请参见配置文档。
可以在也可以设置并行度的地方设置最大并行度(客户端级别和系统级别除外)。不是调用setParallelism(),而是调用setMaxParallelism()来设置最大并行度。
最大并行度的默认设置大致为operatorParallelism + (operatorParallelism / 2),下界为128,上界为32768。
将最大并行度设置为一个非常大的值可能会损害性能,因为一些状态后端必须保持内部数据结构,这些数据结构必须随键组(这是可伸缩状态的内部实现机制)的数量伸缩。