一、RDD核心
RDD全称叫做弹性分布式数据集(Resilient Distributed Datasets)
RDD是一种分布式的内存抽象,表示一个只读的记录分区的集合
RDD是Spark的核心,我们编写的Spark程序本质上是对RDD进行各种转换操作
注:
只读:RDD只能通过其他RDD转换而创建,所以RDD直接存在依赖,可以认为是RDD的血缘关系
分区:RDD逻辑上是分区的,各个分区可以保持到不同的节点,从而可以进行并行计算
转换:RDD之间可以通过丰富的算子进行转换,这些RDD之间维护这种依赖关系
二、RDD操作
RDD支持两种类型的操作:Transformation(变换)和Action(行动)
变换:变换的返回值是一个新的RDD集合,而不是单个值。
如:map, filter, flatMap, groupByKey, reduceByKey
行动:行动操作计算并返回一个新的值
如reduce, collect, count, first, take
注:当执行一次行动(Action)时可以划分一次job
RDD操作:
1word count计算时的RDD:
2三、依赖关系
窄依赖:父子RDD之间的分区是意义对应的。
窄依赖中的转换操作与RDD中其他分区无关,可以通过类似管道的方式一气呵成完成执行。
宽依赖:子RDD的每个分区与父RDD的所有分区都有关系,是多对多的关系。
宽依赖的转换操作涉及到RDD不同的分区,需要数据的重新整理(Shuffle),产生数据交互。
备注:
stage的划分就是由依赖关系决定的,源站是遇窄依赖不变,遇到宽依赖则进行划分。使窄依赖尽量多的在一起。
例如word count:
3Stage划分:
4四、RDD的特点:
1、只读
2、可分区
3、高容错
4、支持java
5、可缓存
6、可持久化磁盘
RDD的5大特点
1)A list of partitions
RDD由很多partition构成,在spark中,计算式,有多少partition就对应有多少个task来执行
2)A function for computing each split
对RDD做计算,相当于对RDD的每个split或partition做计算
3)A list of dependencies on other RDDs
RDD之间有依赖关系,可溯源
4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,比如可以按key的hash值分区
5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
最优的位置去计算,也就是数据的本地性
计算每个split时,在split所在机器的本地上运行task是最好的,避免了数据的移动;split有多个副本,所以preferred location不止一个
数据在哪里,应优先把作业调度到数据所在机器上,减少数据的IO和网络传输,这样才能更好地减少作业运行时间(木桶原理:作业运行时间取决于运行最慢的task所需的时间),提高性能
网友评论