spark Github: https://github.com/apache/spark/
RDD: 讓開發(fā)者大大降低開發(fā)分布式應(yīng)用程序的門檻以及執(zhí)行效率锋边。
RDD源碼:https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd
1.A Resilient Distributed Dataset (RDD):彈性分布式數(shù)據(jù)集
彈性:代表著spark在分布式計(jì)算的時(shí)候陆盘,可以容錯(cuò) ---計(jì)算層面
分布式:把一份數(shù)據(jù)拆分成多份篙议,在各個(gè)節(jié)點(diǎn)上并行的運(yùn)行常侦,他們之間沒有任何的依賴關(guān)系
數(shù)據(jù)集:一個(gè)文件就是一個(gè)數(shù)據(jù)集
2.the basic abstraction in Spark:spark中最基本的抽象單元
3.Represents an immutable:代表著不可變刊苍,RDD產(chǎn)生就是不可變的
partitioned collection of elements :數(shù)據(jù)可以拆分成分區(qū)
that can be operated on in parallel.:每個(gè)分區(qū)的內(nèi)容可以并行的被操作
解釋:
RDD(1,2,3,4,5,6,7,8,9) 假如需要 + 1
那么數(shù)據(jù)被分成三個(gè)分區(qū)梯影,只要每個(gè)分區(qū)上的內(nèi)容都執(zhí)行+1的操作就可以
Hadoop001: (1,2,3) +1
Hadoop002: (4,5,6) +1
Hadoop003: (7,8,9) +1
4.abstract class RDD[T: ClassTag](
@transient private var sc: SparkContext,
@transient private var deps: Seq[Dependency[]]
) extends Serializable with Logging {
(1)抽象類:RDD必然是由子類實(shí)現(xiàn)的兢哭,我們使用的直接使用其子類即可
(2)Serializable:可以序列化
(3)Logging:spark1.6可以使用,spark2.0之后不可以使用
(4)T:存儲(chǔ)各種數(shù)據(jù)類型
(5)SparkContext
(6)@transient
RDD的五大特性:【必須要記住】
Internally, each RDD is characterized by five main properties:
每一個(gè)RDD都有如下的五大特性
- A list of partitions :一堆分區(qū)返帕,由很多個(gè)分區(qū)構(gòu)成桐玻,由partition構(gòu)成
- A function for computing each split/partition:
一個(gè)函數(shù)對(duì)RDD做一個(gè)操作,就是對(duì)構(gòu)成RDDd 每一個(gè)分區(qū)做同樣的操作
- A function for computing each split/partition:
- A list of dependencies on other RDDs
RDDA => RDDB => RDDC => RDDD 之間有依賴關(guān)系
RDDA:是加載創(chuàng)建的 RDDA里面有很多partitions ,當(dāng)后面RDDBCD有數(shù)據(jù)丟失荆萤,可以重新加載數(shù)據(jù)
【前提條件是窄依賴】
- A list of dependencies on other RDDs
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
可選項(xiàng):一個(gè)partition默認(rèn)是使用hash分區(qū)的
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
an HDFS file) 計(jì)算某個(gè)分片的時(shí)候镊靴,可能會(huì)有一組最合適的位置去計(jì)算
preferred locations:數(shù)據(jù)本地性:數(shù)據(jù)在什么地方,最好在什么地方計(jì)算链韭,這樣性能更加好偏竟,因?yàn)闆]有數(shù)據(jù)傳輸【locations是因?yàn)槎喔北緳C(jī)制】
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
大數(shù)據(jù)里面一般是移動(dòng)數(shù)據(jù)不是移動(dòng)計(jì)算,所以數(shù)據(jù)本地化計(jì)算這樣性能更高敞峭。
RDD五大特性和RDD源碼中的對(duì)應(yīng)關(guān)系
def compute(split: Partition, context: TaskContext): Iterator[T]
RDD計(jì)算是對(duì)RDD里面的分區(qū)做計(jì)算踊谋,所以傳入split: Partition 對(duì)應(yīng)的RDD特點(diǎn)第二點(diǎn)
protected def getPartitions: Array[Partition]:
拿到分區(qū),RDD是由一系列的分區(qū)構(gòu)成旋讹,所以得到的一定是分區(qū) Array[Partition] 對(duì)應(yīng)著第一大特點(diǎn)
......