spark之RDD

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark
中
最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算
的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸
缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后
续的查询能够重用工作集,这极大地提升了查询速度。

1、RDD是什么

(1)为什么会产生RDD?
    传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,
    但是其最大缺点是采用非循环式的数据流模型,使得在迭代计算式要进
    行大量的磁盘IO操作。RDD正是解决这一缺点的抽象方法
(2)RDD的具体描述RDD(弹性数据集)是Spark提供的最重要的抽象
   的概念,它是一种有容错机制的特殊集合,可以分布在集群的节点上,
   以函数式编操作集合的方式,进行各种并行操作。可以将RDD理解为一
   个具有容错机制的特殊集合,它提供了一种只读、只能有已存在的RDD
   变换而来的共享内存,然后将所有数据都加载到内存中,方便进行多次
   重用。
   a.他是分布式的,可以分布在多台机器上,进行计算。
   b.他是弹性的,计算过程中内存不够时它会和磁盘进行数据交换。
   c.这些限制可以极大的降低自动容错开销
   d.实质是一种更为通用的迭代并行计算框架,用户可以显示的控制计算
   的中间结果,然后将其自由运用于之后的计算。(3)RDD的容错机制
   实现分布式数据集容错方法有两种:数据检查点和记录更新RDD采用记
   录更新的方式:记录所有更新点的成本很高。所以,RDD只支持粗颗粒
   变换,即只记录单个块上执行的单个操作,然后创建某个RDD的变换序
   列(血统)存储下来;变换序列指,每个RDD都包含了他是如何由其他
   RDD变换过来的以及如何重建某一块数据的信息。因此RDD的容错机制
   又称“血统”容错。 要实现这种“血统”容错机制,最大的难题就是如何表
   达父RDD和子RDD之间的依赖关系。实际上依赖关系可以分
   两种,窄依赖和宽依赖:
   窄依赖:子RDD中的每个数据块只依赖于父RDD中对应的有限个固定的
   数据块;              宽依赖:子RDD中的一个数据块可以依赖于父RDD中
   的所有数据块。例如:map变换,子RDD中的数据块只依赖于父RDD中
   对应的一个数据块;groupByKey变换,子RDD中的数据块会依赖于多
   有父RDD中的数据块,因为一个key可能错在于父RDD的任何一个数据
   块中
   将依赖关系分类的两个特性:
   第一,窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计
   算得到子RDD对应的某块数据;宽依赖则要等到父RDD所有数据都计算
   完成之后,并且父RDD的计算结果进行hash并传到对应节点上之后才能
   计算子RDD。
   第二,数据丢失时,对于窄依赖只需要重新计算丢失的那一块数据来恢
   复;对于宽依赖则要将祖先RDD中的所有数据块全部重新计算来恢复。
   所以在长“血统”链特别是有宽依赖的时候,需要在适当的时机设置数据
   检查点。也是这两个特性要求对于不同依赖关系要采取不同的任务调度
   机制和容错恢复机制。(4)RDD内部的设计每个RDD都需要包含以下
   四个部分:
   a.源数据分割后的数据块,源代码中的splits变量
   b.关于“血统”的信息,源码中的dependencies变量
   c.一个计算函数(该RDD如何通过父RDD计算得到),源码中的 
   iterator(split)和compute函数
   d.一些关于如何分块和数据存放位置的元信息,如源码中的partitioner和
   preferredLocations
   例如:a.一个从分布式文件系统中的文件得到的RDD具有的数据块通过
   切分各个文件得到的,它是没有父RDD的,它的计算函数知识读取文件
   的每一行并作为一个元素返回给RDD;
   b.对与一个通过map函数得到的RDD,它会具有和父RDD相同的数据
   块,它的计算函数式对每个父RDD中的元素所执行的一个函数

2、RDD在Spark中的地位及作用

(1)为什么会有Spark?因为传统的并行计算模型无法有效的解决迭代计
  算(iterative)和交互式计算(interactive);而Spark的使命便是解决这
  两个问题,这也是他存在的价值和理由。
(2)Spark如何解决迭代计算?其主要实现思想就是RDD,把所有计算
   的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据
   集做反复的迭代计算,数据在内存中将大大提升IO操作。这也是Spark
   涉及的核心:内存计算。
(3)Spark如何实现交互式计算?因为Spark是用scala语言实现的,
   Spark和scala能够紧密的集成,所以Spark可以完美的运用scala的解释
   器,使得其中的scala可以向操作本地集合对象一样轻松操作分布式数据
   集。
(4)Spark和RDD的关系?可以理解为:RDD是一种具有容错性基于内
   存的集群计算抽象方法,Spark则是这个抽象方法的实现。

3、如何操作RDD?

(1)如何获取RDD
  a.从共享的文件系统获取,(如:HDFS)
  b.通过已存在的RDD转换
  c.将已存在scala集合(只要是Seq对象)并行化 ,通过调用
  SparkContext的parallelize方法实现
  d.改变现有RDD的之久性;RDD是懒散,短暂的。(RDD的固化:
  cache缓存至内错;     save保存到分布式文件系统)
(2)操作RDD的两个动作
  a.Actions:对数据集计算后返回一个数值value给驱动程序;例如:
  Reduce将数据集的所有元素用某个函数聚合后,将最终结果返回给程
  序。                                                   
  b.Transformation:根据数据集创建一个新的数据集,计算后返回一个新
  RDD;例如:Map将数据的每个元素经过某个函数计算后,返回一个姓
  的分布式数据集。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值