DataStream程序是Flink中基于数据流实现计算的普通程序(例如过滤,更新状态,定义窗口,聚合等)。数据流来源于各种源(比如 消息队列,socket,文件等)。计算结果通过Sink进行输出,可以写入文件或者终端标准输出等。Flink程序可以运行在多种上下文环境中,比如独立运行或者嵌入其他程序中。可以在本地的JVM中运行,也可以在集群中多个机器上运行。
https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/datastream_api.html
一、DataStreams程序基本步骤
- 获取一个执行环境 execution environment
- 加载 / 创建 一个数据源 data source
- 对于数据源的处理计算 transformations
- 对计算结果的输出 sink
- 触发程序的执行
1.1 通过StreamExecutionEnvironment
类的静态方法获取执行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
1.2 创建一个数据源
这里使用从文件中获取,flink支持多源(从文件中,从网络中,从各种中间件中【Kafka、redis等】)
DataStream<String> text = env.readTextFile("file:///path/to/file");
1.3 对数据流进行计算处理
这里以单词统计为例,将输入的text进行flatmap
DataStream<Tuple2<String, Integer>> counts =
// split up the lines in pairs (2-tuples) containing: (word,1)
text.flatMap(new Tokenizer())
// group by the tuple field "0" and sum up tuple field "1"
.keyBy(value -> value.f0)
.sum(1);
1.4 结果输出
//写入文件
counts.writeAsText("file:///path/to/file");
//或者直接输出终端
//counts.print();
1.5 触发执行
正常情况,到这里代码是没有执行的,需要触发执行。
env.execute("Streaming WordCount");
二、简介
2.1 执行环境
StreamExecutionEnvironment
类是所有Flink程序的基础,可以通过StreamExecutionEnvironment
类的以下静态方法获取执行环境。
getExecutionEnvironment()
createLocalEnvironment()
createRemoteEnvironment(String host, int port, String ... jarFiles)
通常,我们只需要使用getExecutionEnvironment(), 此函数会自动根据当前环境上下文进行获取正确的执行环境。
当使用IDE或者作为一个Java程序执行时,将创建一个本地的执行环境(createLocalEnvironment())。
2.2 数据源
数据源是指flink程序获取数据的地方,可以通过以下方式添加数据源
StreamExecutionEnvironment.addSource(sourceFunction)
flink支持丰富的数据源,并且也预先实现了一些数据源函数。
可以自己实现数据源函数,串行数据源实现 SourceFunction
并行数据源实现RichParallelSourceFunction接口
如下是一些已经实现的数据源函数
- 基于文件
readTextFile(path)
readFile(fileInputFormat, path)
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)
- 基于网络
socketTextStream()
- 基于集合
fromCollection(Collection)
fromCollection(Iterator, Class)
fromElemets(T ...)
fromParalleCollection(SplittableIterator, Class)
generateSequence(from, to)
- 用户自定义
2.3 算子
通过一系列的算子转换操作,将一个或多个流转换为另外的一个或多个流。
flink有丰富的内置算子函数,比如Map, FlatMap, Filter, KeyBy, Reduce, Aggregations, Window等等。
2.4 输出Sink
和数据源类似,一个是输入,一个是输出。输出可以输出到文件,socket, 外部系统,或者直接打印到终端等。
flink内置了一些输出函数如下
- 基于文件
writeAsText()
writeAsCsv()
print()
printToErr()
writeUsingOutputFormat()
- 基于网络
writeToSocket()
- 自定义
addSink()