知识点
StreamExecutionEnvironment
Flink 中你可以使用 StreamExecutionEnvironment.addSource(sourceFunction)
来为你的程序添加数据来源。
Flink 已经提供了若干实现好了的 source functions,当然你也可以通过实现 SourceFunction 来自定义非并行的 source 或者实现 ParallelSourceFunction 接口或者扩展 RichParallelSourceFunction 来自定义并行的 source。
StreamExecutionEnvironment 中可以使用以下几个已实现的 stream sources
-
基于集合
- fromCollection(Collection) - 从 Java 的 Java.util.Collection 创建数据流。集合中的所有元素类型必须相同。
- fromCollection(Iterator, Class) - 从一个迭代器中创建数据流。Class 指定了该迭代器返回元素的类型。
- fromElements(T …) - 从给定的对象序列中创建数据流。所有对象类型必须相同。、
- fromParallelCollection(SplittableIterator, Class) - 从一个迭代器中创建并行数据流。Class 指定了该迭代器返回元素的类型。
- generateSequence(from, to) - 创建一个生成指定区间范围内的数字序列的并行数据流。
-
基于文件
-
readTextFile(path) - 读取文本文件,即符合 TextInputFormat 规范的文件,并将其作为字符串返回。
-
readFile(fileInputFormat, path) - 根据指定的文件输入格式读取文件(一次)。
-
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) - 这是上面两个方法内部调用的方法。它根据给定的 fileInputFormat 和读取路径读取文件。根据提供的 watchType,这个 source 可以定期(每隔 interval 毫秒)监测给定路径的新数据(FileProcessingMode.PROCESS_CONTINUOUSLY),或者处理一次路径对应文件的数据并退出(FileProcessingMode.PROCESS_ONCE)。你可以通过 pathFilter 进一步排除掉需要处理的文件。
-
-
基于Socket
socketTextStream(String hostname, int port) - 从 socket 读取。元素可以用分隔符切分。
数据集和数据流(DataSet and DataStream )
Flink使用DataSet
和DataStream
这两个特殊的类来表示程序中的数据,你可以将它们想象成一个包含重复数据的不可变数据集合,其中DataSet
的数据是有限的而DataStream
中的数据个数则是无限的。
Flink程序步骤
-
获取一个execution environment
-
拉取或者创建一个初始数据集
-
指定数据集的转换操作
-
指定计算结果保存在哪
-
触发程序执行
一旦你的程序已经完成,你需要调用StreamExecutionEnvironment
中的execute()
方法来触发程序的执行。根据ExecutionEnvironment
的类型不同,程序可能在本地触发执行或者将程序分发到集群中去执行。
execute()
方法返回JobExecutionResult
结果,JobExecutionResult
包含了执行次数以及累加器的结果。
所有的Flink程序都是延迟计算的:当程序的main方法执行的时候,数据的加载及transformation操作都不会直接的执行。相反,所有的操作的创建及执行都是添加到程序的执行计划中,所有的操作都是在ExecutionEnvironment(执行环境)调用execute()
方法触发执行后才真正的去执行。而程序是在本地执行还是在集群中执行取决于ExecutionEnvironment(执行环境)的类型。
分组
-
DataSet可以按如下方式进行分组处理:
DataSet<...> input = // [...] DataSet<...> reduced = input .groupBy(/*define key here*/) .reduceGroup(/*do something*/);
-
DataStream则可以按以下方式进行分组处理:
DataStream<...> input = // [...] DataStream<...> windowed = input .keyBy(/*define key here*/) .window(/*window specification*/);