在Spark 2.0之前,Spark的主要编程接口是弹性分布式数据集(即RDD)。如果spark程序运行在HDFS上的话,RDD的本质是一个HDFS上的文件。在Spark 2.0之后,RDD被数据集(DataSet)所取代,该数据集类似于RDD的强类型,在新的引擎下具有更丰富的优化。RDD接口仍然受支持,我们仍然可以在RDD编程指南中获得更完整的参考。但是,spark强烈建议我们切换到使用数据集,其性能优于RDD。
RDD是Resilient Distribute Datasets的简称,中文意思为“弹性分布式数据集”,RDD实质上是存储在不同节点计算机中的数据集。分布式存储最大的好处是可以让数据在不同的工作节点上并行存储(内存或硬盘),以便在需要数据的时候并行运算,从而获得较高的效率。
RDD从程序的角度来说是一个scala的抽象类,具体由各子类实现,如MappedRDD、ShuffledRDD等子类。Spark将常用的大数据操作都转换成为RDD的子类。
1.RDD基础
RDD(Resilient Distributed DataSet),弹性分布式数据集,是Spark中最基本,也是最重要的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知度调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能重用工作集,这极大地提升了查询速度。因为有RDD,所以Spark才支持分布式的计算。RDD由分区组成。
什么是RDD?
通过查看Spark的源码,可以获取到RDD的一些描述,在org.apache.spark.RDD中可以看到
稍微翻译了一下
弹性分布式数据集(RDD), Spark中的基本抽象。代表一个不可变的,可以并行操作的元素的分区集合。
这个类包含RDD上的所有基本操作,如“map”、“filter”和“persist”。
此外,[org.apache.spark.rdd.PairRDDFunctions]包含的操作只能在key-value形式的RDDs上可用,如’groupByKey’和’join’;
[org.apache.spark.rdd.DoubleRDDFunctions]包含的操作只能在Double类型RDD上可用
[org.apache.spark.rdd.SequenceFileRDDFunctions]包含的操作用于保存为SequenceFiles的RDD
所有的操作在任何类型正确的RDD(例如RDD[(Int, Int)])上都是隐式自动可用的。
在内部,每个RDD有五个主要特性:
- 分区列表,即RDD由一系列分区(partition)组成
- 一个对每个split(数据分区)进行计算的函数,也称为RDD的算子
- RDD之间存在依赖关系
- 可选,key-value类型RDD的partitioner,用来对RDD的数据做手动分区(例如,哈希分区)
(分区器是作用在k,v 格式的RDD上) - 可选,计算每个split的首选位置列表(例如,一个HDFS文件的块地址)
(partition提供数据计算的最佳位置,利于数据处理的本地化。“计算移动,数据不移动”)
Spark中的所有调度和执行都基于这些方法,允许每个RDD实现自己的计算方式。
实际上,用户可以通过重写这些函数实现定制的RDD(例如,从一个新的存储系统中读取数据)
请参考http://people.csail.mit.edu/matei/papers/2012/nsdi_spark.pdf获取有关RDD内部的详细信息。
问题
#1. Spark读取HDFS中数据的方法textFile底层是调用MR读取HDFS文件的方法首先会split,每个split对应一个block,每个split对应生成RDD的每个partition。
#2.什么是K,V格式的RDD?
RDD中的数据是一个个的tuple2数据,那么这个RDD就是K,V格式的RDD
#3.哪里体现了RDD的弹性(容错)
1)RDD之间的依赖关系
2)RDD的partition可多可少
#4.哪里体现RDD的分布式?
RDD的partition是分布在多个节点上的