RDD概念

1. 设计背景

存在的问题

1. 许多迭代式算法(ML、图算法等)和交互式数据挖掘工具,共同之处是,不同计算阶段之间会重用中间结果。

2. 目前的MR框架都是把中间结果写入到HDFS,带来大量的数据复制、磁盘IO和序列化开销。

RDD的优势

1. RDD提供了一个抽象的数据架构;

2. 不需担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理;

3. 不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储。

2. RDD概念

2.1 RDD概念

一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中不同节点上进行并行计算。

RDD提供了一种高度受限的共享内存模型(只读的记录分区集合),不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(map、join、group by)而创建得到新的RDD。

2.2 RDD操作

1. Spark 用Scala语言实现了RDD的API,可以通过调用API实现对RDD的各种操作;

2. 表面上RDD的功能很受限、不够强大,实际上RDD已经被实践证明可以高效地表达许多框架的编程模型(MR,SQL,Pregel)。

3. RDD提供了一组丰富的操作以支持常见的数据运算,分为Action和Transformation两种类型。

4. RDD提供的转换接口都非常简单,都是类似map、filter、groupBy、join等粗粒度的数据转换操作,而不是针对某个数据项的细粒度修改(不适合网页爬虫)。

2.3 RDD执行过程

1. RDD读入外部数据源进行创建;

2. RDD经过一系列的Transformation操作,每一次都会产生不同的RDD供下一个转换操作使用;

3. 最后一个RDD经过Action操作进行转换,并输出到外部数据源。

其中,Transformation只记录转换轨迹,直到遇到Action才真正执行一些列转换操作!

即,转换得到的RDD是惰性求值的,只有遇到行动操作时,才会发生真正的计算,从DAG图的源头开始进行计算操作。

 这一系列处理称为一个Lineage(血缘关系),即DAG拓扑排序结果。

优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单。

3. RDD特性

1. 高效的容错性;

2. 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销;

3. 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化。

Spark采用RDD以后能够高效计算的原因:

现有容错机制:数据复制或记录日志。

RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作。

4. RDD之间的依赖关系

4.1 窄依赖

 每个父结点只有1个出度,子节点可以有1到多个入度。

表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区。

4.2 宽依赖

MR中的shuffle操作有用到宽依赖。当存在宽依赖关系时,恢复一个分区的代价会比较高。

 每个父结点可以有多个出度,子节点也可以有多个入度。

 表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。

5. Stage的划分

Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage。

1. 在DAG中进行反向解析,遇到宽依赖就断开;

2.遇到窄依赖就把当前的RDD加入到Stage中;

3. 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算。

       上图一共被分成3个Stage,在Stage2中,从map到union都是窄依赖,这两步操作可以形成一个流水线操作。

       分区7通过map操作生成的分区9,可以不用等待分区8到分区10这个map操作的计算结束,而是继续进行union操作,得到分区13,这样流水线执行大大提高了计算的效率。

6. RDD运行过程

1. 创建RDD对象;

2. SparkContext负责计算RDD之间的依赖关系,构建DAG;

3. DAGScheduler负责把DAG图分解成多个Stage,每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值