Flink StreamExecutionEnvironment 一些细节&Flink 执行模式
flink 上下文一些细节
Flink 程序可以在 本地环境运行,也可以在集群环境下运行,不同的运算环境,提交的运行过程也不太一样,这就需要运行程序的时候需要获取上下文环境,从而建立起与flink框架的联系,只有获取到上下文环境信息才能将任务分配到不同的taskmanager上运行。
StreamExecutionEnvironment
在编写flink程序的第一步就是创建环境对象,StreamExecutionEnvironment,它是所有flink程序的基础,在代码中创建的执行环境其实是调用这个类的静态方法
1、getExecutionEnvironment
最简单的方式,就是直接调用getExecutionEnvironment方法。它会根据当前运行的上下文直接得到正确的结果:如果程序是独立运行的,就返回一个本地执行环境;如果是创建了jar包,然后从命令行调用它并提交到集群执行,那么就返回集群的执行环境。也就是说,这个方法会根据当前运行的方式,自行决定该返回什么样的运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
2. createLocalEnvironment
StreamExecutionEnvironment localEnv = StreamExecutionEnvironment.createLocalEnvironment();
我们之前在IDEA运行的wordcount实质就是用的这个方式获取的执行环境。wordcount 打包在集群上用的集群的方式运行
3. createRemoteEnvironment
这个方法返回集群执行环境。需要在调用时指定JobManager的主机名和端口号,并指定要在集群中运行的Jar包。
StreamExecutionEnvironment remoteEnv = StreamExecutionEnvironment.createRemoteEnvironment("host", // JobManager主机名 1234, // JobManager进程端口号 "path/to/jarFile.jar"// 提交给JobManager的JAR包);
在获取到程序执行环境后,我们还可以对执行环境进行灵活的设置。比如可以全局设置程序的并行度、禁用算子链,还可以定义程序的时间语义、配置容错机制。关于时间语义和容错机制,我们会在后续的章节介绍。
执行模式(Execution Mode)
StreamExecutionEnvironment 通过名称来看这个上下文是做流处理的,但是新版本的已经实现流批一体,通过设置flink运行模式可以实现批处理。可以通过execution mode 来设置flink的运行方式。
流执行模式(STREAMING)
- 这是DataStream API最经典的模式,一般用于需要持续实时处理的无界数据流。默认情况下,程序使用的就是STREAMING执行模式。
- 批执行模式(BATCH)专门用于批处理的执行模式, 这种模式下,Flink处理作业的方式类似于MapReduce框架。对于不会持续计算的有界数据,我们用这种模式处理会更方便
- 自动模式(AUTOMATIC)在这种模式下,将由程序根据输入数据源是否有界,来自动选择执行模式。
BATCH模式的配置方法
通过命令行配置
bin/flink run -Dexecution.runtime-mode=BATCH ...
或者通过代码写死
env.setRuntimeMode(RuntimeExecutionMode.BATCH)
设置运行模式需注意:用BATCH模式处理批量数据,用STREAMING模式处理流式数据。因为数据有界的时候,直接输出结果会更加高效;而当数据无界的时候, 我们没得选择——只有STREAMING模式才能处理持续的数据流。