spark2原理分析-RDD的實現框架分析
概述
本文分析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的動作函式的詳細分析,請檢視後面的文章。