1 基本的 API 概念
Flink程序是实现分布式集合转换的常规程序(例如,过滤,映射,更新状态,加入,分组,定义窗口,聚合)。最初从源创建集合(例如,通过从文件,kafka主题或从本地的内存集合中读取)。结果通过接收器返回,接收器可以例如将数据写入(分布式)文件或标准输出(例如,命令行终端)。 Flink程序可以在各种环境中运行,独立运行或嵌入其他程序中。执行可以在本地JVM中执行,也可以在许多计算机的集群上执行。
根据数据源的类型,即有界或无界源,您可以编写批处理程序或流程序,其中
- DataSet API用于批处理
- DataStream API用于流式处理。
注意:在显示如何使用API的实际示例时,我们将使用StreamingExecutionEnvironment和DataStream API。 DataSet API中的概念完全相同,只需用ExecutionEnvironment和DataSet替换即可。
大数据的处理流程
2 DataSet & DataStream
Flink具有特殊类DataSet和DataStream来表示程序中的数据。 可以将它们视为可以包含重复项的不可变数据集合。
- 在DataSet的情况下,数据是有限的
- 而对于DataStream,元素的数量可以是无限的
这些集合在某些关键方面与常规Java集合不同。 首先,它们是不可变的
,这意味着一旦创建它们,就无法添加或删除元素。 也不能简单地检查里面的元素
。
最初通过在Flink程序中添加源来创建集合,并通过使用诸如map,filter等API方法对它们进行转换来从这些集合中派生新集合。
可以看出底层使用了数据源
3 Flink 项目流程剖析
Flink程序看起来像是转换数据集合的常规程序。 每个程序包含相同的基本部分:
- 获得执行环境,
- 加载/创建初始数据,
- 指定此数据的转换,
- 指定放置计算结果的位置,
- 触发程序执行
Scala版本
我们现在将概述每个步骤
Scala DataSet API的所有核心类都可以在org.apache.flink.api.scala包中找到
而Scala DataStream API的类可以在org.apache.flink.streaming.api.scala中找到
StreamExecutionEnvironment是所有Flink程序的基础
可以在StreamExecutionEnvironment上使用这些静态方法获取一个:
1:getExecutionEnvironment() 2:createLocalEnvironment() 3:createRemoteEnvironment(host: String, port: Int, jarFiles: String*)
法1示例代码
法2示例代码
此方法将环境的默认并行度设置为给定参数,默认为通过[[setDefaultLocalParallelism(Int)]]设置的值。
通常,只需要使用getExecutionEnvironment()
,因为这将根据上下文执行正确的操作:
- 如果在IDE中执行程序或作为常规Java程序,它将创建一个本地环境,将执行在本地机器上的程序。
- 如果从程序中创建了一个JAR文件,并通过命令行调用它,则Flink集群管理器将执行您的main方法,
getExecutionEnvironment()
将返回一个执行环境,用于在集群上执行程序。
对于指定数据源,执行环境可以通过各种途径从文件中读取
- 逐行读取它们
- CSV文件
- 使用完全自定义数据输入格式
要将文本文件作为一系列行读取,可以使用:
val env = StreamExecutionEnvironment.getExecutionEnvironment() val text: DataStream[String] = env.readTextFile("file:///path/to/file")
这将提供一个DataStream
,然后就可以在其上应用转换来创建新的派生DataStream
也可以通过使用转换函数调用DataSet
上的方法来应用转换。 例如,map转换如下所示:
val input: DataSet[String] = ... val mapped = input.map { x => x.toInt }
这将通过将原始集合中的每个String转换为Integer来创建新的DataStream
一旦有了包含最终结果的DataStream,就可以通过创建接收器将其写入外部系统。 这些只是创建接收器的一些示例方法:
writeAsText(path: String) print()
一旦指定了完整的程序,就需要通过调用StreamExecutionEnvironment上的execute()触发程序执行
根据ExecutionEnvironment的类型,将在本地计算机上触发执行或提交程序以在集群上执行。
execute()方法返回一个JobExecutionResult,它包含执行时间和累加器结果。
触发程序执行。环境将执行导致"sink"操作运作程序的所有部分
Sink操作例如是打印结果或将它们转发到消息队列。
该法将记录程序执行并使用提供的名称显示。