Flink程序可以对分布式集合进行转换,做一些聚合操作
集合最初是从源创建的(例如,从文件、kafka主题或本地内存集合中读取)
结果通过sink返回,例如,可以将数据写入(分布式)文件,或者写入标准输出(例如,命令行终端)
根据数据源的类型(有界或*数据源),可以编写批处理程序或流处理程序,其中使用DataSet API进行批处理,并使用DataStream API进行流处理。
Flink有特殊的类DataSet和DataStream来表示程序中的数据。在DataSet的情况下,数据是有限的,而对于DataStream,元素的数量可以是无限的。
Flink程序看起来像转换数据集合的常规程序。每个程序都包含相同的基本部分:
获取一个执行环境
加载/创建初始数据
指定数据上的转换
指定计算结果放在哪里
触发程序执行
整个流程就是 数据来源 --> 计算分析 --> 输出存储
数据转换
数据转换将一个或多个数据流转换成新的DataStream。 程序可以将多种转换组合成复杂的拓扑结构。
常用的操作
1,map操作
DataStream → DataStream
取出一个元素,产生一个元素。比如,使用map将数据元素乘以2.
dataStream.map { x => x * 2 }
2,FlatMap
DataStream → DataStream
取出一个元素,产生零个,一个,或者多个元素。比如,可以使用flatmap分割句子。
dataStream.flatMap { str => str.split(" ") }
3,Filter
DataStream → DataStream
每个函数都去执行一个布尔函数,并保留使得布尔函数返回为true的元素。
过滤零值的函数。
dataStream.filter { _ != 0 }
4,KeyBy
DataStream → KeyedStream
将流逻辑分区为不相交的分区,每个分区包含相同key的元素。在内部,这是用哈希分区来实现的。
KeyedStream → DataStream
滚动的聚合keyedStream.将当前元素和上一个聚合的元素进行合并,返回一个新的值。
keyedStream.reduce { _ + _ }
5,Fold
KeyedStream → DataStream
滚动聚合一个KeyedStream,需要指定一个初始值。合并当前的值和前一次合并过(floded)的值,返回一个新值。
比如,下面的折叠函数,假如作用于一个序列(1,2,3,4,5),会返回一个序列:"start-1", "start-1-2", "start-1-2-3"
6,Aggregations
KeyedStream → DataStream
KeyedStream 进行滚动聚合。min和minBy之间的区别在于min返回最小值,而minBy返回该字段中具有最小值的元素(对于max和maxBy相同)。
7,Window
KeyedStream → WindowedStream
作用于partitioned KeyedStreams.根据一些特性(如,最近五分钟的数据)进行按key分组。
dataStream.keyBy(0).window(TumblingEventTimeWindows.of(Time.seconds(5)))
8,Split
DataStream → SplitStream
根据一些标准将流分成两个或更多个流。
9,Select
SplitStream → DataStream
从拆分流中选择一个或多个流。