第4章 Flink 基础API 一:执行环境

156 阅读3分钟

DataStream API是 Flink的核心层 API。一个 Flink 程序,其实就是对 DataStream 的各种转换,具体来说,代码基本上都由以下几部分构成:

excute_step.png

从 Flink 1.12 开始,官方推荐的做法是直接使用 DataStream API,在提交任务时通过将执行模式设为 BATCH 来进行批处理。不建议使用 DataSet API,所以本章以 DataStream API 为核心讲述。

4.1、执行环境

Flink程序可以在各种上下文环境中运行:我们可以在本地JVM中执行程序,也可以提交 到远程集群上运行。 不同的环境,代码的提交运行的过程会有所不同。这就要求我们在提交作业执行计算时, 首先必须获取当前 Flink 的运行环境,从而建立起与 Flink 框架之间的联系。

4.1.1、创建执行环境

DataSet API 的执行入口

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

DataStream API 的执行入口

create_env.png

我们要获取的执行环境,是 StreamExecutionEnvironment 类的对象,这是所有 Flink 程序 的基础。在代码中创建执行环境的方式,就是调用这个类的静态方法,具体有以下四种。

1)getExecutionEnvironment

最简单的方式,就是直接调用 getExecutionEnvironment 方法。它会根据当前运行的上下文直接得到正确的结果,如果程序是独立运行的,就返回一个本地执行环境;如果是创建了 jar 包,然后从命令行调用它并提交到集群执行,那么就返回集群的执行环境。也就是说,这 个方法会根据当前运行的方式,自行决定该返回什么样的运行环境。 这种方式用起来简单高效,是最常用的一种创建执行环境的方式。

StreamExecutionEnvironment env = StreamExecutionEnvironment.*getExecutionEnvironment*();

2)createLocalEnvironment

这个方法返回一个本地执行环境。可以在调用时传入一个参数,指定默认的并行度,如果不传入,则默认并行度就是本地的 CPU 核心数。

StreamExecutionEnvironment localEnv = StreamExecutionEnvironment.createLocalEnvironment();

3)createRemoteEnvironment

这个方法返回集群执行环境。需要在调用时指定 JobManager 的主机名和端口号,并指定要在集群中运行的 Jar 包。

StreamExecutionEnvironment remoteEnv = StreamExecutionEnvironment .createRemoteEnvironment(
        "host", // JobManager 主机名
        1234, // JobManager 进程端口号
        "path/to/jarFile.jar" // 提交给 JobManager 的 JAR 包
         );

在获取到程序执行环境后,我们还可以对执行环境进行灵活的设置。比如可以全局设置 程序的并行度、禁用算子链,还可以定义程序的时间语义、配置容错机制等。

4)createLocalEnvironmentWithWebUI

在 IDE 中运行编写的代码就能够通过这个方法能够查看到 Flink Web-UI ,开启本地 UI,需要添加依赖

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-runtime-web</artifactId>
            <version>${flink.version}</version>
        </dependency>

具体代码

package org.mochi.wc;
​
import org.apache.flink.api.common.ExecutionConfig;
import org.apache.flink.api.common.ExecutionMode;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
​
import java.text.SimpleDateFormat;
​
public class StreamWebUI {
    public static void main(String[] args) throws Exception {
​
        // 1、创建并含有WebUI的执行环境
//        Configuration configuration = new Configuration();
//
//        configuration.setInteger("rest.port",8081);
//
//        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration);
​
        // or
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
​
        env.addSource(new SourceFunction<String>() {
                    boolean flag = true;
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
​
                    @Override
                    public void run(SourceContext<String> sourceContext) throws Exception {
                        while (flag) {
                            sourceContext.collect(format.format(System.currentTimeMillis()));
                            Thread.sleep(1000);
                        }
                    }
​
                    @Override
                    public void cancel() {
                        flag = false;
                    }
                })
                .print("WebUI >>>>>");
​
        // 启动执行
        env.execute("WebUI");
​
    }
}

IDE 控制台结果如下:

web_ui_for_idea.png

Flink WEB UI 结果如下:

flink_web_ui.png

4.1.2、 执行模式(Execution Mode)

DataStream API 执行模式包括:流执行模式、批执行模式和自动模式。

1)流执行模式(Streaming)

这是 DataStream API 最经典的模式,一般用于需要持续实时处理的无界数据流。默认情况下,程序使用的就是 Streaming 执行模式。

2)批执行模式(Batch)

专门用于批处理的执行模式,批执行模式的使用。主要有两种方式:

  • 通过命令行配置

在提交作业时,增加 execution.runtime-mode 参数,指定值为 BATCH

bin/flink run -Dexecution.runtime-mode=BATCH ... 
  • 通过代码配置
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeExecutionMode.BATCH); 

在代码中,直接基于执行环境调用 setRuntimeMode 方法,传入 BATCH 模式。 实际应用中一般不会在代码中配置,而是使用命令行,这样更加灵活。

3)自动模式(AutoMatic)

在这种模式下,将由程序根据输入数据源是否有界,来自动选择执行模式。