Spark總結之RDD創建、特性、算子

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進行緩存的,避免重複計算,從而節省程序運行的時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章