A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,partitioned collection of elements that can be operated on in parallel.
RDD是壹個彈性的分布式的數據集,是spark的基本抽象,RDD是不可變的,並且它由多個partition構成(可能分布在多臺機器上,可以存memory上,也可以存disk裏等等),可以進行並行操作
彈性:分布式計算時可容錯
不可變:壹旦產生就不能被改變
RDD源碼如下:( /apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala )
解讀:
1)抽象類:不能直接使用,需要借助於子類實現,使用時直接使用其子類即可
2)序列化:在分布式計算框架裏,序列化框架性能的好壞直接影響整個框架性能的優劣
3)logging:日誌記錄,2.0版本後不自帶,需要自己寫壹個
4)T:泛型 支持各種數據類型
5)sparkcontext
6)@transient
二、RDD的5大特點
1)A list of partitions
RDD由很多partition構成,在spark中,計算式,有多少partition就對應有多少個task來執行
2)A function for computing each split
對RDD做計算,相當於對RDD的每個split或partition做計算
3)A list of dependencies on other RDDs
RDD之間有依賴關系,可溯源
4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
如果RDD裏面存的數據是key-value形式,則可以傳遞壹個自定義的Partitioner進行重新分區,比如可以按key的hash值分區
5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
最優的位置去計算,也就是數據的本地性
計算每個split時,在split所在機器的本地上運行task是最好的,避免了數據的移動;split有多個副本,所以preferred location不止壹個
數據在哪裏,應優先把作業調度到數據所在機器上,減少數據的IO和網絡傳輸,這樣才能更好地減少作業運行時間(木桶原理:作業運行時間取決於運行最慢的task所需的時間),提高性能
三、RDD5大特性在源碼中的體現
(特性2)compute函數的入參必然是partition,因為對RDD做計算相當於對每個partition做計算
(特性1)getPartitions返回的必然是壹系列Partition類型的數據組成的數組
(特性3)RDD之間有依賴關系
(特性5)
(特性4)