RDD是彈性分布式數(shù)據(jù)集;
Internally, each RDD is characterized by five main properties:
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - 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)
rdd具有5個(gè)特性:
1. 分區(qū)列表
rdd是被分區(qū)的,每個(gè)分區(qū)都會(huì)被一個(gè)task處理,分區(qū)數(shù)決定并行計(jì)算數(shù)量,rdd的并行度默認(rèn)從父rdd傳給子rdd; 默認(rèn)情況下,hdfs上的塊文件數(shù)就是spark處理時(shí)的分區(qū)數(shù)量,當(dāng)然也可以在創(chuàng)建RDD時(shí),人為指定RDD的分區(qū)數(shù)量,同時(shí)RDD的分區(qū)數(shù)最好設(shè)置為集群core數(shù)量的2-3倍;
2. 計(jì)算函數(shù)
spark的RDD的計(jì)算函數(shù)是以分片為基本單位的,每個(gè)RDD都會(huì)實(shí)現(xiàn)compute函數(shù),對每個(gè)分區(qū)內(nèi)的數(shù)據(jù)進(jìn)行計(jì)算;其中,RDD的算子有寬窄依賴算子的分類,決定是否劃分stage, 同時(shí)也有transformation和action算子的分類,決定是否觸發(fā)job;
3. 血緣關(guān)系
由于RDD每次轉(zhuǎn)換都會(huì)生成新的RDD,所以RDD會(huì)形成類似流水線的前后依賴關(guān)系;
4. 分區(qū)器
分區(qū)只發(fā)生在shuffle階段, 分區(qū)器控制分區(qū)規(guī)則和下游的分區(qū)數(shù);當(dāng)前Spark中實(shí)現(xiàn)了兩種類型的分片函數(shù)换衬,一個(gè)是基于哈希的HashPartitioner兰迫,另外一個(gè)是基于范圍的RangePartitioner; 并且只有對于key-value的RDD,才會(huì)有Partitioner,非key-value的RDD的Parititioner的值是None;
5. 分區(qū)數(shù)據(jù)的位置列表
此列表存儲了每個(gè)Partition的優(yōu)先位置,對于HDFS文件來說,就是每個(gè)分區(qū)數(shù)據(jù)的位置; 有了數(shù)據(jù)位置信息后,就可以實(shí)現(xiàn)數(shù)據(jù)不動(dòng)代碼動(dòng)的特點(diǎn),使得計(jì)算發(fā)生在本地;