Spark内核解析RDD抽象

RDD(分布式数据集),是spark最基本的数据抽象。

一、RDD特点

RDD的源码注释如下:

Internally, each RDD is characterized by five main properties:
*
*  - A list of partitions
*  - A function for computing each split
*  - A list of dependencies on other RDDs
*  - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
*  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
*    an HDFS file)
*

(1)一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行度。在创建RDD时可以指定分片数,如果没有指定,那么就使用默认值(CPU的Core数)

(2)一个计算每个分区的函数。

每个RDD都会实现compute函数达到处理数据。

(3)RDD之间的依赖关系。

RDD的每次转换都会生成一个新的RDD,所以RDD之间会形成前后依赖关系,当部分RDD的分区数据丢失,spark可以用依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区重新计算 。

Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,暴力的理解就是stage的划分是按照有没有涉及到shuffle来划分的,没涉及的shuffle的都划分在一个stage里面,这种划分依据就是RDD之间的依赖关系。针对不同的转换函数,RDD之间的依赖关系分类窄依赖(narrow dependency)和宽依赖(wide dependency, 也称 shuffle dependency).

为什么需要宽窄依赖?

1)每个分区里的数据都被加载到机器的内存里,我们逐一的调用 map, filter, map 函数到这些分区里,Job 就很好的完成。
2)更重要的是,由于数据没有转移到别的机器,我们避免了 Network IO 或者 Disk IO. 唯一的任务就是把 map / filter 的运行环境搬到这些机器上运行,这对现代计算机来说,overhead 几乎可以忽略不计。
3)这种把多个操作合并到一起,在数据上一口气运行的方法在 Spark 里叫 pipeline (其实 pipeline 被广泛应用的很多领域,比如 CPU)。这时候不同就出现了:只有 narrow transformation 才可以进行 pipleline 操作。对于 wide transformation, RDD 转换需要很多分区运算,包括数据在机器间搬动,所以失去了 pipeline 的前提。
4)总结起来一句话:数据和算法是否在一起,计算的性能是不一样的,为了区分,就有了宽依赖和窄依赖。

(4)一个Partitioner,即RDD的分片函数。目前Spark的分片函数有两种。一个是HashPartitioner,另一个是基于范围的RangePartitioner。只有数据是key-value类型的才有Partitioner,非key-value类型的数据的Partitioner是None。Partitioner不但决定了RDD的分片数量,而且也决定了该RDD的父RDD的shuffle的输出时的分片数量。

(5)一个列表,存储一个Partitioner的Preferred Location,对于一个HDFS的文件来说,这个列表保存的就是每个Partitioner所在块的位置。

RDD是一个应用层面的逻辑概念,一个RDD有多个分片,一个分片有多个Block

2、RDD的弹性

(1)自动进行内存和磁盘之间数据存储切换。

(2)基于血统的高效容错机制

(3)Task失败会有特定次数的重试(默认次数是4次)

(4)Stage失败会有特定次数的重试(默认次数是4次)

(5)checkPoint和persist可主动或者被动触发

注意:RDD用persist相应存储策略缓存数据在内存或者磁盘,当再次用到该RDD会直接读取数据,无需重新计算。

RDD用checkpoint设置检查点,数据会被存储在hdfs中,父RDD的依赖关系信息被删除。

(6)数据调度弹性

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值