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

什么是RDD

视频教程:

1、优酷

2、YouTube

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

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

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

RDD的特点:

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

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

3、失败自动重建。

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

5、必须是可序列化的。

6、是静态类型的。

RDD的好处

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

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

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

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

RDD的存储与分区

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

2、当前RDD默认是存储于内存,但当内存不足时,RDD会spill到disk。

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

RDD的内部表示

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

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

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

3、对父RDD的依赖列表

4、对key-value RDD的Partitioner(可选)

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

RDD创建方式:

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

2、从父RDD转换得到新RDD。

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

上一篇:路径前面加与不加"/"的区别


下一篇:Why you should use async tasks in .NET 4.5 and Entity Framework 6