Spark RDD


### 一、RDD概述

* 1、什么是RDD
  * RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
    * Dataset
      * 就是一个集合,用于存放数据
    * Distributed 
      * 它的数据是分布式存储的,便于分布式计算
    * Resilient 
      * 它表示弹性的,可以保存在内存中或者磁盘中。

### 二、RDD的五大属性

  A list of partitions
  * 一个分区列表

  A function for computing each split
  * 作用在每一个分区中函数

  A list of dependencies on other RDDs
  * 一个RDD依赖于其他多个RDD,rdd与rdd的之间的依赖关系。spark容错机制就是根据这个特性来的

  Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  * 针对于kv键值对的RDD,它才会有分区函数这个概念(必须产生shuffle)
  * 这个分区函数它决定了数据的来源以及数据处理后的去向

  Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
  * 一个最优的数据分区列表,数据本地性和数据最优

### 三、RDD的创建方式

* 1、通过sparkContext调用parallelize方法,需要一个已经存在scala集合
  * val rdd1=sc.parallelize(集合或者数组)
* 2、通过读取文件系统中数据
  * val rdd2=sc.textFile("文件路径")
* 3、通过已经存在的RDD经过算子转换生成新的RDD
  * val rdd3=rdd2.flatMap(_.split(" "))

### 四、RDD算子分类

* transformation(转换)
  * 一个rdd转换生成新的rdd,它是一个懒加载,并不会触发任务的真正运行,只是记录下作用在rdd上的一系列转换行为。
* action(动作)
  * 它是一个动作,它会触发整个任务真正运行

### 五、RDD的依赖关系

* 窄依赖
  * 父RDD中每一个partition最多只被子RDD的一个partition所使用
  * 总结:窄依赖我们形象的比喻为独生子女
* 宽依赖
  * 子RDD的多个partition会依赖于父RDD同一个partition
  * 总结:宽依赖我们形象的比喻为超生

### 六、Lineage(血统)

* 记录下RDD的元数据信息和转换行为,如果当前一个RDD的某些分区数据丢失后,可以根据血统,重新计算恢复得到丢失的分区数据。

### 七、RDD的缓存

* persist
  * 也可以把数据进行缓存,并且提供丰富的缓存级别
* cache
  * 默认将数据保存在内存中,其本质最终还是调用persist(StorageLevel.MEMORY_ONLY)
* 对需要进行缓存的RDD调用persist和cache,它并不会立即执行缓存操作,需要后面有对应的action算子的时候,才会真正执行缓存操作。

### 八、DAG有向无环图

* DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就形成了DAG,根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。对于窄依赖,partition的转换处理在一个Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算。
* 因此宽依赖是划分Stage的依据。

### 九、RDD容错机制之heckpoint

* 提供了一个相对而言更加可靠的持久化数据方式
* 使用checkpoint
  * 1.sparkContext.setCheckpointDir("hdfs上目录")
  * 2.针对于需要缓存的rdd数据调用
    * rdd.checkpoint
    * 并不是调用checkpoint方法后,立即执行数据持久化操作,同样它也需要后续使用了action操作,才会触发任务的运行。
  * 3、在运行的时候首先会先执行action这样一个job,执行完成之后,会单独开启一个新的job来执行checkpoint
* persist、cache、checkpoint区别:
  * persist和cache同样可以对数据进行持久化,持久化之后,之前的血统没有发生任何改变,如果数据丢失,它是可以通过血统重新计算恢复得到。
  * checkpoint在持久化数据会,依赖关系已经发生该了。这个时候如果数据丢失了,它不能都通过重复计算恢复得到。
* 丢失数据恢复的一般流程
  * 首先会去cache获取,如果有,直接拿到,如果没有,需要去checkpoint查询,如果有,直接拿到,如果没有,这个就需要重新计算得到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值