一、RDD概念
RDD,全称为Resilient Distributed Datasets(弹性分布式数据集),是一个容错的、并行的数据结构(不变的),可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。它解决MapReduce采用非循环式(迭代计算式需进行大量的磁盘IO操作)的数据流模型的缺点。 (Spark涉及的核心:内存计算。RDD解决迭代计算的问题)
RDD作用:解决迭代计算问题
它与spark的关系:RDD是基于内存的集群计算抽象方法,spark是这个抽象方法的实现
应用
二、RDD数据处理模型
通常来讲,针对数据处理有几种常见模型,包括:Iterative Algorithms,Relational Queries,MapReduce,Stream Processing。例如Hadoop MapReduce采用了MapReduces模型,Storm则采用了Stream Processing模型。RDD混合了这四种模型,使得Spark可以应用于各种大数据处理场景。
三、使用narrow与wide依赖的原因
首先,narrow dependencies可以支持在同一个cluster node上以管道形式执行多条命令,例如在执行了map后,紧接着执行filter。相反,wide dependencies需要所有的父分区都是可用的,可能还需要调用类似MapReduce之类的操作进行跨节点传递。
其次,则是从失败恢复的角度考虑。narrow dependencies的失败恢复更有效,因为它只需要重新计算丢失的parent partition即可,而且可以并行地在不同节点进行重计算。而wide dependencies牵涉到RDD各级的多个Parent Partitions。
四、RDD如何保障数据处理效率
分区和持久化。RDD提供了两方面的特性persistence和patitioning,用户可以通过persist与patitionBy函数来控制RDD的这两个方面。RDD的分区特性与并行计算能力(RDD定义了parallerize函数),使得Spark可以更好地利用可伸缩的硬件资源。
RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的部分。例如存在一个面向列的数据结构,其中一个实现为Int的数组,另一个实现为Float的数组。如果只需要访问Int字段,RDD的指针可以只访问Int数组,避免了对整个数据结构的扫描。
RDD数据只读,不可修改。如果需要修改数据,必须从父RDD转换(transformation)到子RDD。
五、RDD将操作分类
transformation与action。无论执行了多少次transformation操作,RDD都不会真正执行运算,只有当action操作被执行时,运算才会触发。而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得更高效,也避免了大量中间结果对内存的消耗。
两类函数的主要区别是,转换接受RDD并返回RDD,而动作接受RDD但是返回非RDD。转换采用惰性调用机制,每个RDD记录父RDD转换的方法,这种调用链表称之为血缘(lineage);而动作调用会直接计算。
采用惰性调用,通过血缘连接的RDD操作可以管道化(pipeline),管道化的操作可以直接在单节点完成,避免多次转换操作之间数据同步的等待。
六、支持容错的方式
通常采用两种方式:数据复制或日志记录
RDD天生是支持容错的。首先,它自身是一个不变的(immutable)数据集,其次,它能够记住构建它的操作图(Graph of Operation),因此当执行任务的Worker失败时,完全可以通过操作图获得之前执行的操作,进行重新计算。由于无需采用replication方式支持容错,很好地降低了跨网络的数据传输成本。
针对RDD的wide dependency,最有效的容错方式同样还是采用checkpoint机制(记录日志)。
七、RDD使用模式
RDD使用具有一般的模式,可以抽象为下面的几步
1、加载外部数据,创建RDD对象
2、使用转换(如filter),创建新的RDD对象
3、缓存需要重用的RDD
4、使用动作(如count),启动并行计算
八、RDD数据同步方法
RDD目前提供两个数据同步的方法:广播和累计器。
RDD缺点:目前RDD提供的同步机制粒度太粗,尤其是转换操作中变量状态不能同步,所以RDD无法做复杂的具有状态的事务操作。
















