DataStream API的名称来自一个特殊的DataStream类,该类用于表示Flink程序中的数据集合。你可以将它视为包含重复项的不可变数据集合。这些数据可以是有限的,也可以是无限的,用于处理这些数据的API是相同的。
Flink中使用DataSet和DataStream表示数据的基本抽象,可以将它们视为包含特定类型的元素集合,类似于常规Java集合。但不同的是,集合数据不可变,集合一旦被创建,就不能添加或删除元素。对于DataSet,数据是有限的,而对于DataStream,元素的数量可以是无限的。
DataSet和DataStream数据集都是分布式数据集,分布式数据集是指:一个数据集存储在不同的服务器节点上,每个节点存储数据集的一部分。例如,将数据集(hello,world,scala,spark,love,spark,happy)存储在3个节点上,节点一存储(hello,world),节点二存储(scala,spark,love),节点三存储(spark,happy),这样对3个节点的数据可以并行计算,并且3个节点的数据共同组成了一个DataSet/DataStream,如图4-1所示。
图4-1 DataSet/DataStream分布式数据集
分布式数据集类似于HDFS中的文件分块,不同的块存储在不同的节点上;而并行计算类似于使用MapReduce读取HDFS中的数据并进行Map和Reduce操作。Flink包含这两种功能,并且计算更加灵活。
DataSet/DataStream数据集的全部或部分可以缓存在内存中,并且可以在多次计算时重用。数据也可以持久化到磁盘,具有高效的容错能力。
DataSet的主要特征如下(DataStream同样拥有):
· 数据是不可变的,但可以将DataSet转换成新的DataSet进行操作。
· 数据是可分区的。DataSet由很多分区组成,每个分区对应一个Task任务来执行。
· 对DataSet进行操作,相当于对每个分区进行操作。
· DataSet拥有一系列对分区进行计算的函数,称为算子(关于算子将在4.6节详细讲解)。
· DataSet之间存在依赖关系,可以实现管道化,避免了中间数据的存储。
在编程时,可以把DataSet/DataStream看作一个数据操作的基本单位,而不必关心数据的分布式特性,Flink会自动将其中的数据分发到集群的各个节点。Flink中对数据的操作主要是对DataSet/DataStream的操作(创建、转换、求值等)。