概述
本文分析RDD的实现框架,并简要介绍各种类型RDD的实现原理。
RDD实现的特性
在spark2中,每个RDD都具有5个主要的特性:
- 一个分区列表
- 计算每个分区的函数
- 依赖RDD(父RDD)的列表
- 可选:对于key-value RDD的分区类
- 可选:在分布式文件系统上(例如:hdfs,hbase等),计算每个分区的最佳位置
RDD的实现框架
在Spark中有多种类型的RDD。Spark定义了一个抽象类:
abstract class RDD[T: ClassTag](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging
该抽象类定义了两类RDD的基本函数:
- transformations(转换函数)
- actions(行动函数)
还定义了一些没有实现的函数和变量,这些函数是每类RDD必须实现的,是RDD的实现合约。它们主要有:
abstract class RDD[T: ClassTag] {
def compute(split: Partition, context: TaskContext): Iterator[T]
def getPartitions: Array[Partition]
def getDependencies: Seq[Dependency[_]]
def getPreferredLocations(split: Partition): Seq[String] = Nil
val partitioner: Option[Partitioner] = None
}
方法名 | 说明 |
---|---|
compute | 子类需要实现该函数。用来计算一个给定的分区。 |
getPartitions | 返回该RDD的分区的集合。 |
getDependencies | 返回RDD依赖的父RDD及关系。 |
getPreferredLocations | 定义RDD分区保存的首选位置。 |
partitioner | 说明RDD的分区类(用什么方法进行分区) |
各种类型的RDD(实现RDD抽象类的RDD)
ParallelCollectionRDD
- 说明
ParallelCollectionRDD是带有numSlices个分区和首选存储位置:locationPrefs元素集合的RDD。
数据被分成了numSlices个切片(slices)。
- 如何创建
可以通过两种方法来创建ParallelCollectionRDD:
(1) SparkContext.parallelize方法
(2) SparkContext.makeRDD方法
CoGroupedRDD
- 说明
这种类型的RDD,将它的父RDD组合在一起。对父RDD的每个key,生成的RDD包含了具有该key的值的元组列表。
- 如何创建
通过RDD.cogroup(…)函数进行创建。
HadoopRDD/NewHadoopRDD
- 说明
该RDD提供了通过新的new MapReduce API(org.apache.hadoop.mapreduce)访问分布式文件系统例如:hdfs,hbase,s3等,的核心功能。
- 如何创建
创建NewHadoopRDD的方法有以下两个:
(1) newAPIHadoopRDD
(2) newAPIHadoopFile
MapPartitionsRDD
- 说明
该RDD提供把函数使用到父RDD的每个分区而得到的结果。
- 如何创建
可以通过多种方式来创建该RDD:
(1) map
(2) flatMap
(3) filter
(4) mapPartitions
等等。
CoalescedRDD
- 说明
该RDD是重新分区或合并转换的结果。
- 如何创建
创建该RDD的函数只有一个:
(1) coalesce
ShuffledRDD
- 说明
通过shuffle操作得到的RDD。
PipedRDD
- 说明
管道元素创建的RDD到分叉的外部进程
DoubleRDD
- 说明
DoubleRDD(隐式转换为org.apache.spark.rdd.DoubleRDDFunctions)是Double类型的RDD。
SequenceFileRDD
- 说明
SequenceFileRDD(隐式转换为org.apache.spark.rdd.SequenceFileRDDFunctions)是一个可以保存为SequenceFile的RDD。
JdbcRDD
- 说明
在JDBC连接执行SQL查询语句后的结果形成的RDD。
RDD的操作函数
RDD的转换函数(Transformations)
转换是基于RDD的懒操作,这些函数返回另一个RDD,如map,flatMap,filter,reduceByKey,join,cogroup等。
对转换函数详细的分析,请查看我后面的文章。
RDD的动作函数(Actions)
RDD的动作函数触发RDD转换执行,并返回处理的结果的值。
对RDD的动作函数的详细分析,请查看后面的文章。