SparkCore解析1

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的存在)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章