Spark中的RDD是什么,有哪些特性?

(1)问题分析
考官主要考核你对Spark基础的掌握熟练度。

(2)核心问题讲解
什么是RDD
RDD,弹式分布数据集,英文全称叫 Resilient Distributed Datasets。
Spark就是围绕弹性分布式数据集(RDD)的概念展开的,RDD是一种容错的可分布式操作的数据集合。有两种方式可以创建RDD:一种是将驱动程序中的已有集合平行化;另外一种是引用外部存储系统的数据集,例如共享文件系统,HDFS, HBase, 或者其他类似Hadoop的数据源。
RDD的特点之一是分布式存储,它的好处就是数据存储在不同的节点上,当需要数据进行计算的时候可以在这些节点上并行操作。弹性表现在节点在存储RDD数据的时候,既可以存储在内存中,也可以存储在磁盘上,也可以两者结合使用。RDD还有个特点就是延迟计算,当是transformation算子的时候,并不执行操作,直到遇到action算子的时候才开始执行计算。

RDD的五大特性
1)分区列表(a list of partitions)
Spark RDD是被分区的,每一个分区都会被一个计算任务(Task)处理,分区数决定并行计算数量,RDD的并行度默认从父RDD传给子RDD。可以在创建RDD时指定RDD分片个数,如果不指定分区数量,当RDD从程序内存中已有的集合对象创建时,则默认分区数量就是程序所分配到的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认分区数为HDFS文件的Block数。

2)每一个分区都有一个计算函数(a function for computing each split)
每个分区都会有计算函数,Spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute计算函数,对具体的分片进行计算;RDD中的分片是并行的,所以是分布式并行计算。

3)依赖于其他RDD的列表(a list of dependencies on other RDDs)
RDD的依赖关系,由于RDD每次转换都会生成新的RDD,所以RDD会形成类似流水线的前后依赖关系,当然,宽依赖就不类似于流水线了,宽依赖后面的RDD具体的数据分片会依赖前面所有的RDD的所有的数据分片,这时这时一般是跨机器的。
因为有前后的依赖关系,所以当有分区数据丢失的时候,Spark会通过依赖关系重新计算,算出丢失的数据,而不是对RDD所有的分区进行重新计算。RDD之间的依赖有两种:窄依赖(Narrow Dependency)、宽依赖(Wide Dependency)。RDD是Spark的核心数据结构,通过RDD的依赖关系形成调度关系。通过对RDD的操作形成整个Spark程序。
RDD有Narrow Dependency和Wide Dependency两种不同类型的依赖,其中的Narrow Dependency指的是每一个parent RDD的Partition最多被child RDD的一个Partition所使用,而Wide Dependency指的是多个child RDD的Partition会依赖于同一个parent RDD的Partition。Spark中宽依赖指的是生成的RDD的每一个partition都依赖于父RDD的所有partition,宽依赖典型的操作有groupByKey、sortByKey等,宽依赖意味着shuffle操作,这是Spark划分Stage边界的依据。

4)key-value数据类型的RDD分区器(-Optionally,a Partitioner for key-value RDDS)
控制分区策略和分区数。每个key-value形式的RDD都有Partitioner属性,它决定了RDD如何分区。当然,Partition的个数还决定每个Stage的Task个数。Partitioner是针对key-value的形式,如果不是key-value的形式,它就不会有具体的Partitioner。用户可以自定义分区策略,如Hash分区等。

5)每个分区都有一个优先位置列表(-Optionally,a list of preferred locations to compute each split on)
它会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Partition块的位置。在具体分片前,它已经清楚地知道任务发生在什么节点上,也就是说,任务本身是计算层面的、代码层面的,代码发生运算之前已经知道它要运算的数据在什么地方,有具体节点的信息。这就符合大数据中数据不动代码动的特点。数据不动代码动的最高境界是数据就在当前节点的内存中。Spark本身在进行任务调度时候,会尽可能将task任务分配到处理数据的数据块所在的具体位置。

(3)问题扩展
Spark RDD需要注意的问题
1)textFile方法底层封装的是读取方法和MR读取文件的方式一样,读取文件之前先split,默认split大小是一个block大小。
2)RDD实际上不存储数据(partition其实也不存储数据)
3)什么是K,V格式的RDD?
如果RDD里面存储的数据都是二元组对象,那么这个RDD我们就叫做K,V格式的RDD。
4)哪里体现RDD的弹性(容错)?
partition数量,可多可少,体现了RDD的弹性。
RDD之间具有依赖关系,可以基于上一个RDD重新计算出RDD。
5)哪里体现RDD的分布式?
RDD是由Partition组成,partition是分布在不同节点上的。

(4)结合项目中使用
SparkSQL和SparkStreaming都是基于SparkCore,无论是做离线计算还是实时计算,都需要熟悉RDD。

点击此处
隐藏目录