1:RDD 是什么?
RDD 即弹性分布式数据集(Resilient Distributed DataSet),它具备像MR等数据流模型的容错性,
能在并行计算中高效地进行数据共享进而提升计算性能。RDD中提供了一些转换操作,在转换过程中记录
“血缘”关系,但在RDD中并不会存储真正的数据,只是对数据和操作的描述。
RDD 是只读的、分区记录的集合。RDD只能基本于稳定物理存储中的数据和其他已有的RDD执行确定性
操作来创建。这些确定的操作称为转换。如map,filter/groupby/join等。RDD含有如何从其他RDD衍生(即
计算)出来RDD的相关信息(即Lineage),据此可以从物理存储的数据计算出相应的RDD分区。
2:RDD的特性:
5个特性:
1:一系列的分区的信息(Patition)信息。
每个分区都会被一个任务处理,这决定的并行度。用户可以在创建RDD时指定分区个数。
2:由一个函数计算每一个分片。
RDD的计算以分片为单位的,每个RDD都会实现compute函数以达到这个目的。
3:RDD之间的依赖关系
(如果一个分区数据丢失)
RDD可以这种依赖关系重新计算丢失的数据,不需要从父RDD的所有分区数据进行计算。
4:Patitioner是RDD中的分区函数,类似于Hadoop中的Partitioner,可以使得数据按照一定的
规则分配到提定的Reducer上去处理。当前Spark中有两种类型的分区函数:一个基于hash
的HashPartitioner,另一个是基于范围的RengePatitioner。
普通数据的Partitioner为None,只有遇到RDD数据是key-value才会有Partitioner,比如:
使用join和groupBy时。
5:最佳位置列表
按照“移动数据不如移动计算”的理念,Spark在进行任务调度时会尽可能地将计算任务分派
到其所在处理数据块的存储位置。
3:RDD的三种创建方式
1:由集合创建:
val rdd=sc.parallelize(List(1,2,8,7,5))
val rdd=sc.parallelize(List(1,2,3,9,5),4)
2:加载文件生成RDD
sc.textFile("文件路径(linux///home/data/hello.txt/ 本地文件 or hdf文件":hdfs://hadoop:8020/spark/...)
3:通过RDD的转换形成新的RDD
map/flatMap
wc=txtFile.map(x =>x.split(" "))
4:RDD的依赖关系
窄依赖:
一个RDD的分区至多被子RDD的某个分区使用一次
容错:某个分区出故障了,可以快速将丢失的分区并行计算出来,窄依赖可以在单节点上完成运算。
容错和计算速度都比宽依赖好。
宽依赖:
一个父RDD的分区会被子RDD的分区使用多次,即只能前面的算好后才进能进行后续的计算,只有遇到RDD数据是key-value才会有Partitioner
等到父类的所有数据都被传输到各个节点后才能计算(MR-shuffle)
容错:
某个分区出故障了,要计算前面所有父分区,代价会很大。解决办法:把之前的结果存在磁盘,当分区
出现故障,直接读磁盘文件。
宽依赖对应shuffle,需要运行过程中将同一个父RDD的分区传入到不同的子RDD,中间可能涉及多个节点
数据传输,而窄依赖的每个父RDD只会传入到一个子RDD,可以在一个分区内完成。