Spark Learning Note Part 1

RDD 概念

Spark建立在统一抽象的RDD之上,支持MapReduce, Streaming, SQL, Machine Learning以及Graph。

RDD,Resilient Distributed Datasets。RDD作为数据结构,本质上是一个只读的分区记录集合。

RDD作为数据结构,本质上是一个只读的分区集合。一个RDD可以包含多个分区,每个分区就是一个dataset片段。RDD可以相互依赖。如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为窄依赖;若多个child RDD分区都可以依赖,则称之为宽依赖。

RDD

RDD 是Spark的核心,也是整个Spark的架构基础。有如下特性:

  • 它是不变的数据结构存储
  • 它是支持跨集群的分布式数据结构
  • 可以根据数据记录的key对结构进行分区
  • 提供了粗粒度的操作,且这些操作都支持分区
  • 它将数据存储在内存中,从而提供了低延迟性

RDD 数据处理效率的提升

RDD 提供了两方面特性: persistence和partitioning。RDD的分区特性和并行计算能力使得spark可以更好地利用可伸缩的硬件资源。RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的部分。

RDD将操作分为两类: transformation与action。无论执行了多少次transformation操作,RDD都不会真正执行运算,只有当action操作执行时,运算才会触发。而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得更高效,也避免了大量中间结果对内存的消耗。

在实现时,RDD针对transformation操作,都提供了对应的继承自RDD的类型,例如map操作会返回MappedRDD,而flatMap则返回FlatMappedRDD。当我们执行map或flatMap操作时,不过是将当前RDD对象传递给对应的RDD对象而已。例如:

 def map[U: ClassTag](f: T => U): RDD[U] = new MappedRDD(this, sc.clean(f))

RDD 对容错的支持

容错通常有两种方式,数据复制和日志记录。对于数据为中心的系统而言,这两种方式都非常昂贵,需要跨集群大量拷贝数据。

RDD自身是一个不变的数据集,能够记住构建它的操作图,根据执行的操作进行重新计算。某些场景下,Spark也需要利用记录日志的方式来容错,如针对数据进行update操作,需要通过Spark提供的checkpoint机制,以支持操作能够从checkpoint得到恢复。

 

Refer to :

http://www.infoq.com/cn/articles/spark-core-rdd/

 

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>