参考自https://blog.youkuaiyun.com/dsdaasaaa/article/details/94181269和https://blog.youkuaiyun.com/lucasmaluping/article/details/103047901的小结
- RDD:弹性分布式数据集,是Spark中最基本的数据抽象。
理解:本质上是一个只读的分区记录集合,每个RDD是有多个分区,每个分区就是一个数据集片段。一个RDD可以保存到集合中的不同节点上,从而可以在集群中的不同节点上并行计算。
----只读不可变,可分区,内部元素可并行计算的集合。
----数据流模型特点:自动容错,位置感知性调度,可伸缩性
----允许用户执行多个查询时实时的将工作集缓存在内存中,当后续再次查询时能够调用工作集极大的提升了查询速度。 - 属性:
一组分片(partition),即数据集的基本组成单位。
一个基于每个分片的函数,在spark中RDD的计算是以分片为单位的。
RDD之间的依赖关系,类似于流水线一样的前后依赖关系。(当部分分区的数据丢失时,只需在该分区的依赖关系上重新计算即可,不需要对整体分区进行计算)。
一个partitioner函数,即RDD的分片函数。
一个列表,存储存取每个partition的优先位置,当spark进行任务调度时会尽可能的将计算任务分配到所要处理数据块的存储位置。 - RDD的缓存:Spark 可以使用 persist 和 cache 方法将任意 RDD 缓存到内存、磁盘文件系统中。
解释:RDD是惰性求值的,当对于RDD的执行简单的调用操作时,Spark会每次重算RDD及其依赖,此时就产生了极大的消耗。所以为了减轻消耗避免对于RDD的重复计算,可以将数据进行持久化。将RDD放入缓存。 - 创建:读取文件或数据库,通过其他的RDD转化。
- 读文件:sc.textFile();
- 通过并行化的方式创建:sc.parallelize(已存在的scala集合)
- 在spark中支持两种类型的操作(操作中包含算子):
- 转化操作:Transformation操作是对已有的RDD进行转化。该操作只是惰性的不会被真正执行
- 行动操作:Action操作是触发代码的运行。在一段Spark代码中Transformation操作在遇到Action操作时才会被执行,所以Action是必须存在的。
- 依赖关系:在每个Transformation执行后都会形成一个新的RDD,所以此时RDD之间就回形成流水线式的前后依赖关系。依赖关系中包含两种:宽依赖和窄依赖(关键点在partition上)
- 窄依赖:父RDD的每个partition都只会被子RDD的一个partition所使用(独生子女)
- 宽依赖:父RDD的每个partition会被多个子RDD的partition使用(超生)