本文已参与「新人创作礼」活动,一起开启掘金创作之路。
其中的核心层就是 DataStream/DataSet API。由于从 1.12.0 版本起,Flink 实现了 API 上的流批统一,DataSet API 将被弃用,官方推荐统一使用 DataStream API 处理流数据和批数据。
一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,
- 获取执行环境(execution environment)
- 读取数据源(source)
- 定义基于数据的转换操作(transformations)
- 定义计算结果的输出位置(sink)
- 触发程序执行(execute)
执行环境(Execution Environment)
创建执行环境
- getExecutionEnvironment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
这种“智能”的方式不需要我们额外做判断,用起来简单高效,是最常用的一种创建执行环境的方式。
- createLocalEnvironment
- createRemoteEnvironment
执行模式(Execution Mode)
// 批处理环境
ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();
// 流处理环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
而从 1.12.0 版本起,Flink 实现了 API 上的流批统一。DataStream API 新增了一个重要特性:可以支持不同的“执行模式”(execution mode),通过简单的设置就可以让一段 Flink 程序在流处理和批处理之间切换。这样一来,DataSet API 也就没有存在的必要了。
- 流执行模式(STREAMING)
这是 DataStream API 最经典的模式,一般用于需要持续实时处理的无界数据流。默认情况下,程序使用的就是 STREAMING 执行模式。
- 批执行模式(BATCH)
专门用于批处理的执行模式, 这种模式下,Flink 处理作业的方式类似于MapReduce 框架。对于不会持续计算的有界数据,我们用这种模式处理会更方便。
- 自动模式(AUTOMATIC) 在这种模式下,将由程序根据输入数据源是否有界,来自动选择执行模式。
建议: 不要在代码中配置,而是使用命令行。在提交作业时指定参数可以更加灵活,在代码中可扩展太差,不建议使用
触发程序执行
Flink 是由事件驱动的,只有等到数据到来,才会触发真正的计算,这也被称为 所以我们需要显式地调用执行环境的 execute()方法,来触发程序执行。execute()方法将一直等待作业完成,然后返回一个执行结果(JobExecutionResult)。