RDD(resilient dastributed dataset)
RDD:彈性分佈式數據集。所謂“彈性”,可以自動進行內存和磁盤的切換;具有高效容錯、任務失敗充實等特點;一個RDD可進行多個分區;RDD分區之間存在依賴關係,分爲“寬依賴”和“窄依賴”,前者是指一個父RDD分區被多個子RDD分區所使用,後者是指一個父RDD分區最多被一個子RDD分區多使用
2大創建:
-
Parallelized Collections
將已經存在的數據集轉化成rdd/其他RDD轉化形成新的RDD,一般在進行測試的時候使用
#sc即SparkContext val data = Array(1,2,3,4,5) #第二個參數10是手動創建的partitions,可選參數 val rdd = sc.parallelize(data,10)
-
External Datasets
由外部存儲系統的數據集創建,包括本地的文件系統,還有所有Hadoop支持的數據集,比如HDFS、HBase。
#URI(Uniform Resource Identifier,統一資源標識符),而URL(URL:Uniform Resource Location統一資源定位符),URL是URI的子集 #參數是文件的URI(file///,還可以是hdfs://,) val distFile = sc.textFile("data.txt") distFile: org.apache.spark.rdd.RDD[String] = data.txt MapPartitionsRDD[10] at textFile at <console>:26
5大特性
<!--源碼中的描述-->
* - 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)
-
一組分片(Partition),即數據集的基本組成單位。 對於RDD來說,每個分片都會被一個計算任務處理,並決定並行計算的粒度。用戶可以在創建RDD 的時候指定RDD的分片個數,如果沒有指定,那麼就會採用默認值。默認值就是程序所分配到的CPU Cores 的數目;
-
對於RDD來說,每個分片都會被一個計算任務處理,並決定並行計算的粒度。Spark中RDD的計算是以分片爲單位的,每個RDD都會實現compute函數以達到這個目的。compute函數會對迭代器進行復合,不需要保存每次計算的結果;
-
RDD 之間互相存在依賴關係。 RDD 的每次轉換都會生成一個新的 RDD ,所以 RDD 之間就會形成類似於流水線一樣的前後依賴關係。在部分分區數據丟失時,Spark 可以通過這個依賴關係重新計算丟失部分的分區數據,而不是對 RDD 的所有分區進行重新計算。—具有容錯性
-
一個Partitioner ,即 RDD 的分片函數 。當前Spark 中實現了兩種類型的分片函數,一個是基於哈希的 HashPartitioner ,另外一個是基於範圍的 RangePartitioner。只有對於key-value的RDD ,纔會有 Partitioner,非 key-value 的RDD 的 Partitioner 的值是None。Partitioner 函數不但決定了RDD 本身的分片數量,也決定了 Parent RDD Shuffle 輸出時的分片數量。
-
一個列表,存儲存取每個Partition 的優先位置(preferred location)。 對於一個HDFS 文件來說,這個列表保存的就是每個 Partition 所在的塊位置。根據**“移動數據不如移動計算”**的理念,Spark 在進行任務調度的時候,會儘可能地將計算任務分配到其所要處理數據塊的存儲位置。
3大算子:
transformations:數據內容不會變化,形式改變,懶加載,只有在actions階段才執行。
操作 | 含義 |
---|---|
map(func) | 返回一個新的RDD,該RDD由每一個輸入元素經func函數轉換後組成 |
filter(func) | 返回一個新的RDD,該RDD由經過func函數計算後返回值爲true的輸入元素組成 |
flatMap(func) | 類似於map,但是每一個輸入元素可以被映射爲0或多個輸出元素(所以func應該返回一個序列,而不是單一元素) |
repartition(numPartitions) | 重新分區 |
join(otherDataset, [numTasks]) | 在類型爲(K,V)和(K,W)的RDD上調用,返回一個相同key對應的所有元素對在一起的(K,(V,W))的RDD 相當於內連接(求交集) |
sample(withReplacement, fraction, seed) | 根據fraction指定的比例對數據進行採樣,可以選擇是否使用隨機數進行替換,seed用於指定隨機數生成器種子 |
union(otherDataset) | 對源RDD和參數RDD求並集後返回一個新的RDD |
intersection(otherDataset) | 對源RDD和參數RDD求交集後返回一個新的RDD |
distinct([numTasks])) | 對源RDD進行去重後返回一個新的RDD |
groupByKey([numTasks]) | 在一個(K,V)的RDD上調用,返回一個(K, Iterator[V])的RDD |
reduceByKey(func, [numTasks]) | 在一個(K,V)的RDD上調用,返回一個(K,V)的RDD,使用指定的reduce函數,將相同key的值聚合到一起,與groupByKey類似,reduce任務的個數可以通過第二個可選的參數來設置 |
sortByKey([ascending], [numTasks]) | 在一個(K,V)的RDD上調用,K必須實現Ordered接口,返回一個按照key進行排序的(K,V)的RDD |
sortBy(func,[ascending], [numTasks]) | 與sortByKey類似,但是更靈活 第一個參數是根據什麼排序 第二個是怎麼排序 false倒序 第三個排序後分區數 默認與原RDD一樣 |
cogroup(otherDataset, [numTasks]) | 在類型爲(K,V)和(K,W)的RDD上調用,返回一個(K,(Iterable,Iterable))類型的RDD |
actions:
操作 | 含義 |
---|---|
reduce(func) | 通過func函數聚集RDD中的所有元素,這個功能必須是可交換且可並聯的 |
collect() | 以數組的形式返回數據集的所有元素 |
count() | 返回RDD的元素個數 |
first() | 返回RDD的第一個元素 |
take(n) | 返回一個由數據集的前n個元素組成的數組 |
saveAsTextFile(path) | 將數據集的元素以textfile的形式保存到HDFS文件系統或者其他支持的文件系統,對於每個元素,Spark將會調用toString方法,將它裝換爲文件中的文本 |
countByKey() | 針對(K,V)類型的RDD,返回一個(K,Int)的map,表示每一個key對應的元素個數 |
foreach(func) | 在數據集的每一個元素上,運行函數func進行更新 |
lookup | 對<key,value>型的rdd操作,返回指定key對應的元素形成的seq。如果這個rdd包含分區器,那麼只掃描對應key所在的分區,若不含,則進行全盤掃描 |
controller:
操作 | 含義 |
---|---|
cache | 只有一個默認的緩存級別MeMORY-ONLY,cache調用了persist |
persist | 可以根據情況設置其緩存級別 |
用處: | 兩者都是用來將一個RDD進行緩存的,避免重複計算,從而節省程序運行的時間。 |