1. 程式人生 > >spark2原理分析-RDD的實現框架分析

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的動作函式的詳細分析,請檢視後面的文章。

參考文件