(五)什么是RDD-Java&Python版Spark

什么是RDD

视频教程:

1、优酷

2、YouTube

 

  RDD是个抽象类,全称为Resilient Distributed Datasets,是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的操作来操作这些数据诸如mapflatMapfilter等转换操作除此之外,RDD还提供了诸如joingroupByreduceByKey等更为方便的操作以支持常见的数据运算。但实际上继承RDD的派生类一般只要实现两个方法:

1getPartitions()用来告知怎么将input分片;

2compute()用来输出每个Partition被函数处理的一个单元);

 

RDD的特点:

1它是在集群节点上的不可变的、已分区的集合对象。

2通过并行转换的方式来创建如(map, filter, join, etc)。

3失败自动重建。

4可以控制存储级别(内存、磁盘等)来进行重用。

5必须是可序列化的。

6是静态类型的。

 

RDD的好处

1RDD只能从持久存储或通过Transformation操作产生,相比于分布式共享内存(DSM)可以更高效实现容错,对于丢失部分数据分区只需根据它的lineage就可重新计算出来,而不需要做特定的Checkpoint( RDD实现了基于Lineage的容错机制。RDD的转换关系,构成了compute chain,可以把这个compute chain认为是RDD之间演化的Lineage。在部分计算结果丢失时,只需要根据这个Lineage重算即可。)

2RDD的不变性,可以实现类似Hadoop MapReduce的推测式执行。

3RDD的数据分区特性,可以通过数据的本地性来提高性能,这与Hadoop MapReduce是一样的。

4RDD都是可序列化的,在内存不足时可自动降级为磁盘存储,把RDD存储于磁盘上,这时性能会有大的下降但不会差于现在的MapReduce

 

RDD的存储与分区

1用户可以选择不同的存储级别存储RDD以便重用。

2当前RDD默认是存储于内存,但当内存不足时,RDDspilldisk

3RDD在需要进行分区把数据分布于集群中时会根据每条记录Key进行分区(如Hash 分区),以此保证两个数据集在Join时能高效。

 

RDD的内部表示

RDD的内部实现中每个RDD都可以使用5个方面的特性来表示:

1分区列表(数据块列表)

2计算每个分片的函数(根据父RDD计算出此RDD

3对父RDD的依赖列表

4key-value RDDPartitioner(可选)

5每个数据分片的预定义地址列表(HDFS上的数据块的地址)(可选)

 

RDD创建方式:

1、从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入(例如HDFS)创建。

2、从父RDD转换得到新RDD

3、通过parallelize将单机数据创建为分布式RDD

 

posted @ 2017-01-05 10:09  李小新  阅读(738)  评论(0编辑  收藏  举报