RDD介绍
(本人初次接触spark可能有些地方理解的不够到位,希望各位读者多多指正,对于不恰当的地方也会进行改进)
1、RDD定义:是弹性分布式数据集,是分布到各个节点的数据集合,具有自动容错性、位置感知调度和可伸缩性等。
2、RDD的特性:
2.1 分区(partition)
分区是RDD的基本组成单位(spark并行处理的基本单元),属于RDD的子集。每个分区的计算都是独立执行的,并且分布到Slave节点上去计算。每个节点上可能会有多个分区,每个分区有对应的Task线程。
2.2 依赖
由于RDD之间的转换操作可以从已有RDD创建出新的RDD,一次新旧RDD之间必定会存在着某种联系,这种关系就被称为依赖。
依赖的分类:
窄依赖:父RDD的每个分区最多被子RDD的一个分区所依赖(一对一的关系);
宽依赖:父RDD的每个分区可被子RDD的多个分区所依赖(一对多的关系)。
窄依赖和宽依赖的比较:
(1)窄依赖:子RDD中的某个分区出错,可以方便的计算出其父RDD所对应的分区,然后进行重新计算生成子RDD对应的分区;
(2)子RDD出错可能导致父RDD的多个分区进行重新计算。
union操作是将两个RDD中的元素进行合并,将结果封装成新的RDD,类似与两个集合的合并运算。 join针对Key-Value对形式的两个RDD进行连接操作,连接的依据是Key值,其功能与关系型数据库中 表的内连接操作相同。
3、RDD的创建:
RDD的创建有三种方式:基于集合进行创建、基于外部存储创建、根据已有RDD进行创建(RDD的创建操作)。
基于集合创建提供了parallelize和makeRDD两个操作。对于基于外部存储创建,通常是从HDFS中获取数据, 常用的操作就是textFile。
4、RDD的操作:
RDD的操作大致上可以分为两类:转换操作(Transformation)和执行操(Action)作。
转换操作就是根据已有RDD生产新的RDD,且具有惰性策略(只有执行了执行操作才会被提交到各个节点去计算)。执行操作就是向驱动程序返回结果或者是将结果写入外部存储系统。
RDD的创建和转换操作:
5、持久化操作
持久化操作是为了避免RDD被重新计算,能够提高计算速度。
操作:persist(持久化到磁盘或内存)、cache(持久化到内存)、checkpiont(持久化到磁盘)。