spark2原理分析-RDD的实现框架分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/83063525

概述

本文分析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的动作函数的详细分析,请查看后面的文章。

参考文档

猜你喜欢

转载自blog.csdn.net/zg_hover/article/details/83063525