天天看點

SparkCore:RDD特性詳細解讀

文章目錄

    • 1、RDD源碼定義
    • 2、RDD五大特性
      • 2.1 each RDD is characterized by five main properties:
      • 2.2 RDD五大特性和RDD源碼的對應關系
    • 3、RDD圖解

1、RDD源碼定義

RDD源碼位址:

https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd

打開

RDD.scala

源碼檔案

斜杠後面的單詞就是目錄層次,逐級往下就行

  • A Resilient Distributed Dataset (RDD), the basic abstraction in Spark.

    基于Spark,彈性分布式資料集(RDD)

    彈性展現在計算上,在Spark分布式計算的時候,可以容錯,比如計算過程中某一部分資料丢失,可以通過一些機制修複。

  • Represents an immutable,partitioned collection of elements that can be operated on in parallel.

    代表不可變的,以并行的方式操作分區的元素集合。

    that can be operated on in parallel.這裡that,指partitioned collection of elements

    不可變說明RDD一旦生成,就不可變的。

    分區的元素集合,就是把一個大的拆分成很多個小的,可以了解為HDFS的Block/InputSplit

    舉例:

    RDDA:(1,2,3,4,5,6,7,8,9) --> RDDA生成不可變

    hadoop001:Partition1:(1,2,3) -->三個分區,每個分區分布在不同節點上

    hadoop002:Partition1:(4,5,6)

    hadoop003:Partition1:(7,8,9)

    如果要睿RDDA做一個 operated +1,應該是對所有Partition上的元素做了 +1的操作,并且是在每個節點

    是同時進行的(并行處理)

  • RDD的定義

    abstract class RDD[T: ClassTag](

    @transient private var sc: SparkContext,

    @transient private var deps: Seq[Dependency[]]

    ) extends Serializable with Logging {}

  1. 抽象類:RDD必然是有子類實作,使用時調用子類即可
  2. Serializable序列化,比如網絡的傳輸
  3. Logging特質
  4. [T: ClassTag]泛型,說明RDD存儲的資料類型時不确定的
  5. SparkContext
  6. @transient 指定該屬性或字段不是永久的。

2、RDD五大特性

2.1 each RDD is characterized by five main properties:

  • A list of partitions

    分區清單

  • A function for computing each split(了解成partition)

    函數作用在每個分區上

  • A list of dependencies on other RDDs

    RDD之間有依賴關系

    RDDA=>RDDB=>RDDC=>RDDD

  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)

    分區器是作用在K,V格式的RDD上,預設是hash-partitioned

  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for

    an HDFS file)

    preferred locations 優先位置

    每一個分區在計算時會選擇最佳的計算位置(展現了資料本地性,要運作的計算或操作,最要是把task放到

    對應資料的那台)

2.2 RDD五大特性和RDD源碼的對應關系

打開這個檔案RDD.scala

對應第二個特性

def compute(split: Partition, context: TaskContext): Iterator[T]

計算:其實是對RDD立面的每個分區做計算

傳入的參數:split類型是Partition

context類型是TaskContext

對應第一個特性

protected def getPartitions: Array[Partition]

得到分區,傳回的類型Array[Partition],是一個數組或集合,數組或集合的類型是Partition

對應第三個特點

protected def getDependencies: Seq[Dependency[_]] = deps

得到一個Dependencies

對應第五個特點

protected def getPreferredLocations(split: Partition): Seq[String] = Nil

對應第四個特點

@transient val partitioner: Option[Partitioner] = None

其他RDD源碼

打開JdbcRDD.scala

override def getPartitions: Array[Partition] = {}

override def compute(thePart: Partition, context: TaskContext): Iterator[T] = new NextIterator[T]

打開JdbcRDD.scala

override def getPartitions: Array[Partition]

override def compute(theSplit: Partition, context: TaskContext): InterruptibleIterator[(K, V)]

override def getPreferredLocations(split: Partition): Seq[String]

3、RDD圖解

SparkCore:RDD特性詳細解讀

繼續閱讀