1、RDD概述
RDD(Resilient Distributed Dataset)叫做分佈式數據集,是Spark中最基本的數據抽象。代碼中是一個抽象類,它代表一個不可變、可分區、裏面的元素可並行計算的集合。
2、RDD屬性、特點
RDD表示只讀的分區的數據集,對RDD進行改動,只能通過RDD的轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的信息。RDDs之間存在依賴,RDD的執行是按照血緣關係延時計算的。如果血緣關係較長,可以通過持久化RDD來切斷血緣關係。
1)分區
2)只讀
RDD的操作算子包括兩類,一類叫做transformations,它是用來將RDD進行轉化,構建RDD的血緣關係;另一類叫做actions,它是用來觸發RDD的計算,得到RDD的相關計算結果或者將RDD保存的文件系統中。
3)依賴
依賴包括兩種,一種是窄依賴,RDDs之間分區是一一對應的,另一種是寬依賴(一個可以引出多個)
4)緩存
如果在應用程序中多次使用同一個RDD,可以將該RDD緩存起來
5)CheckPoint
有時需要通過非常長的血緣關係去重建,勢必影響性能。爲此,RDD支持checkpoint將數據保存到持久化的存儲中,這樣就可以切斷之前的血緣關係,因爲checkpoint後的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數據。
3、RDD編程
在Spark中,只有遇到action,纔會執行RDD的計算
RDD的創建:有三種
1)從集合中創建
Spark主要提供了兩種函數:parallelize和makeRDD
使用parallelize()從集合創建,val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8))
使用makeRDD()從集合創建,val rdd1 = sc.makeRDD(Array(1,2,3,4,5,6,7,8))
2)從外部存儲創建
包括本地的文件系統,還有所有Hadoop支持的數據集,比如HDFS、Cassandra、HBase等
val rdd2= sc.textFile("hdfs://hadoop102:9000/RELEASE")
3)從其他RDD創建
4、RDD的轉換
RDD整體上分爲Value類型和Key-Value類型
Value類型
1)map(func)案例
作用:返回一個新的RDD,該RDD由每一個輸入元素經過func函數轉換後組成
2) mapPartitions(func) 案例
作用:類似於map,但獨立地在RDD的每一個分片上運行,因此在類型爲T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]。假設有N個元素,有M個分區,那麼map的函數的將被調用N次,而mapPartitions被調用M次,一個函數一次處理所有分區。
3)mapPartitionsWithIndex(func) 案例
作用:類似於mapPartitions,但func帶有一個整數參數表示分片的索引值,因此在類型爲T的RDD上運行時,func的函數類型必須是(Int, Interator[T]) => Iterator[U];
4) flatMap(func) 案例
作用:類似於map,但是每一個輸入元素可以被映射爲0或多個輸出元素(所以func應該返回一個序列,而不是單一元素)
5)glom案例
作用:將每一個分區形成一個數組,形成新的RDD類型時RDD[Array[T]]
6)groupBy(func)案例
作用:分組,按照傳入函數的返回值進行分組。將相同的key對應的值放入一個迭代器。
7)filter(func) 案例
作用:過濾。返回一個新的RDD,該RDD由經過func函數計算後返回值爲true的輸入元素組成。
8) sample(withReplacement, fraction, seed) 案例
作用:以指定的隨機種子隨機抽樣出數量爲fraction的數據,withReplacement表示是抽出的數據是否放回,true爲有放回的抽樣,false爲無放回的抽樣,seed用於指定隨機數生成器種子。
9)distinct([numTasks])) 案例
作用:對源RDD進行去重後返回一個新的RDD。默認情況下,只有8個並行任務來操作,但是可以傳入一個可選的numTasks參數改變它。
10)coalesce(numPartitions) 案例
作用:縮減分區數,用於大數據集過濾後,提高小數據集的執行效率
11) repartition(numPartitions) 案例
作用:根據分區數,重新通過網絡隨機洗牌所有數據。
12)sortBy(func,[ascending], [numTasks]) 案例
作用;使用func先對數據進行處理,按照處理後的數據比較結果排序,默認爲正序。
13)pipe(command, [envVars]) 案例
作用:管道,針對每個分區,都執行一個shell腳本,返回輸出的RDD。
雙Value類型交互
1)union(otherDataset) 案例
作用:對源RDD和參數RDD求並集後返回一個新的RDD
2)subtract (otherDataset) 案例
作用:計算差的一種函數,去除兩個RDD中相同的元素,不同的RDD將保留下來
3)intersection(otherDataset) 案例
作用:對源RDD和參數RDD求交集後返回一個新的RDD
4) cartesian(otherDataset) 案例
作用:笛卡爾積(儘量避免使用)
5)zip(otherDataset)案例
作用:將兩個RDD組合成Key/Value形式的RDD,這裏默認兩個RDD的partition數量以及元素數量都相同,否則會拋出異常。
Key-Value類型
1)partitionBy案例
作用:對pairRDD進行分區操作,如果原有的partionRDD和現有的partionRDD是一致的話就不進行分區, 否則會生成ShuffleRDD,即會產生shuffle過程。
2)groupByKey案例
作用:groupByKey也是對每個key進行操作,但只生成一個sequence。
3)reduceByKey(func, [numTasks]) 案例
在一個(K,V)的RDD上調用,返回一個(K,V)的RDD,使用指定的reduce函數,將相同key的值聚合到一起,reduce任務的個數可以通過第二個可選的參數來設置。
4)aggregateByKey案例(大體思想是先做分區內計算,在做分區間計算)
作用:在kv對的RDD中,,按key將value進行分組合並,合併時,將每個value和初始值作爲seq函數的參數,進行計算,返回的結果作爲一個新的kv對,然後再將結果按照key進行合併,最後將每個分組的value傳遞給combine函數進行計算(先將前兩個value進行計算,將返回結果和下一個value傳給combine函數,以此類推),將key與計算結果作爲一個新的kv對輸出。
5) foldByKey案例
作用:aggregateByKey的簡化操作,seqop和combop相同
6)combineByKey[C] 案例
作用:對相同K,把V合併成一個集合
先記錄第一個V
注意:上面幾個函數不好理解,需要時觀看源代碼各個參數含義。
7)sortByKey([ascending], [numTasks]) 案例
作用:在一個(K,V)的RDD上調用,K必須實現Ordered接口,返回一個按照key進行排序的(K,V)的RDD
8)mapValues案例
針對於(K,V)形式的類型只對V進行操作
9)join(otherDataset, [numTasks]) 案例
作用:在類型爲(K,V)和(K,W)的RDD上調用,返回一個相同key對應的所有元素對在一起的(K,(V,W))的RDD
10)cogroup(otherDataset, [numTasks])
作用:在類型爲(K,V)和(K,W)的RDD上調用,返回一個(K,(Iterable<V>,Iterable<W>))類型的RDD
5、Action
1)reduce(func)案例
作用:通過func函數聚集RDD中的所有元素,先聚合分區內數據,再聚合分區間數據。
2)collect()案例
作用:在驅動程序中,以數組的形式返回數據集的所有元素。
3) count()案例
作用:返回RDD中元素的個數
4)first()案例
作用:返回RDD中的第一個元素
5)take(n)案例
作用:返回一個由RDD的前n個元素組成的數組
6) takeOrdered(n)案例
作用:返回該RDD排序後的前n個元素組成的數組
7)aggregate案例
作用:aggregate函數將每個分區裏面的元素通過seqOp和初始值進行聚合,然後用combine函數將每個分區的結果和初始值(zeroValue)進行combine操作。這個函數最終返回的類型不需要和RDD中元素類型一致。
8)fold(num)(func)案例
作用:摺疊操作,aggregate的簡化操作,seqop和combop一樣。
9) saveAsTextFile(path)
將數據集的元素以textfile的形式保存到HDFS文件系統或者其他支持的文件系統,對於每個元素,Spark將會調用toString方法,將它裝換爲文件中的文本
10)saveAsSequenceFile(path)
作用:將數據集中的元素以Hadoop sequencefile的格式保存到指定的目錄下,可以使HDFS或者其他Hadoop支持的文件系統。
11) saveAsObjectFile(path)
作用:用於將RDD中的元素序列化成對象,存儲到文件中。
12)countByKey()案例
作用:針對(K,V)類型的RDD,返回一個(K,Int)的map,表示每一個key對應的元素個數。
13)foreach(func)案例
作用:在數據集的每一個元素上,運行函數func進行更新。
6、函數依賴
初始化工作是在Driver端進行的,而實際運行程序是在Executor端進行的,這就涉及到了跨進程通信,是需要序列化的。
7、RDD依賴關係
1 Lineage
RDD的Lineage會記錄RDD的元數據信息和轉換行爲,當該RDD的部分分區數據丟失時,它可以根據這些信息來重新運算和恢復丟失的數據分區。
注意:RDD和它依賴的父RDD(s)的關係有兩種不同的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)。
窄依賴
窄依賴指的是每一個父RDD的Partition最多被子RDD的一個Partition使用,窄依賴我們形象的比喻爲獨生子女
寬依賴
寬依賴指的是多個子RDD的Partition會依賴同一個父RDD的Partition,會引起shuffle,總結:寬依賴我們形象的比喻爲超生
寬依賴是劃分Stage的依據。(有Shuffle的存在)