好程式設計師分享乾貨 彈性分散式資料集RDD

好程式設計師IT發表於2019-05-22

RDD定義

   RDD(Resilient Distributed Dataset)叫做分散式資料集,是Spark中最基本的資料抽象,它代表一個不可變(資料和後設資料)、可分割槽、裡面的元素可平行計算的集合。 特點 在於 自動容錯 ,位置感知性排程和可伸縮性

RDD的屬性

   1.一組分片 即資料集的基本組成單位。對於 RDD來說,每個分片都會被一個計算任務處理,並決定平行計算的粒度。使用者可以在建立RDD時指定RDD的分片個數,如果沒有指定,那麼就會採用預設值。預設值就是程式所分配到的CPU Core的數目。

   2.一個計算每個分割槽的函式。Spark中RDD的計算是以分片為單位的,每個RDD都會實現compute函式以達到這個目的。compute函式會對迭代器進行復合,不需要儲存每次計算的結果。

   3.RDD之間的依賴關係。RDD的每次轉換都會生成一個新的RDD,所以RDD之間就會形成類似於流水線一樣的前後依賴關係。 這裡 要提及一個概念 —— 容錯處理 : 即在部分分割槽資料丟失時, Spark可以透過這個依賴關係重新計算丟失的分割槽資料,而不是對RDD的所有分割槽進行重新計算。

   4.一個Partitioner,分割槽器 RDD的分片函式。當前Spark中實現了兩種型別的分片函式,一個是基於雜湊的HashPartitioner,另外一個是基於範圍的RangePartitioner。只有對於key-value的RDD,才會有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函式不但決定了RDD本身的分片數量,也決定了parent RDD Shuffle輸出時的分片數量。

   5.一個列表 儲存存取每個 Partition的優先位置(preferred location)。

   對於一個 HDFS檔案來說,這個列表儲存的就是每個Partition所在的塊的位置。按照“移動資料不如移動計算”的理念,Spark在進行任務排程的時候,會盡可能地將計算任務分配到其所要處理資料塊的儲存位置。

RDD型別

1.Transformation -> 記錄計算過程(記錄引數,計算方法)

轉換

含義

map(func)

返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成

filter(func)

返回一個新的RDD,該RDD由經過func函式計算後返回值為true的輸入元素組成

flatMap(func)

類似於map,但是每一個輸入元素可以被對映為0或多個輸出元素(所以func應該返回一個序列,而不是單一元素)

mapPartitions(func)

類似於map,但獨立地在RDD的每一個分片上執行,因此在型別為T的RDD上執行時,func的函式型別必須是Iterator[T] => Iterator[U]

mapPartitionsWithIndex(func)

類似於mapPartitions,但func帶有一個整數參數列示分片的索引值,因此在型別為T的RDD上執行時,func的函式型別必須是

(Int, Iterator[T]) => Iterator[U]

sample(withReplacement, fraction, seed)

根據fraction指定的比例對資料進行取樣,可以選擇是否使用隨機數進行替換,seed用於指定隨機數生成器種子

union(otherDataset)

對源RDD和引數RDD求並集後返回一個新的RDD

intersection(otherDataset)

diff -> 差集

對源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任務的個數可以透過第二個可選的引數來設定

aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])


sortByKey([ascending], [numTasks])

在一個(K,V)的RDD上呼叫,K必須實現Ordered介面,返回一個按照key進行排序的(K,V)的RDD

sortBy(func,[ascending], [numTasks])

與sortByKey類似,但是更靈活

join(otherDataset, [numTasks])

在型別為(K,V)和(K,W)的RDD上呼叫,返回一個相同key對應的所有元素對在一起的(K,(V,W))的RDD

cogroup(otherDataset, [numTasks])

在型別為(K,V)和(K,W)的RDD上呼叫,返回一個(K,(Iterable<V>,Iterable<W>))型別的RDD

cartesian(otherDataset)

笛卡爾積

pipe(command, [envVars])


coalesce(numPartitions)


repartition(numPartitions)

 重新分割槽

repartitionAndSortWithinPartitions(partitioner)


2.Action  -> 觸發生成job(一個job對應一個action運算元)

動作

含義

reduce( func )

透過func函式聚集RDD中的所有元素,這個功能必須是可交換且可並聯的

collect()

在驅動程式中,以陣列的形式返回資料集的所有元素

count()

返回RDD的元素個數

first()

返回RDD的第一個元素(類似於take(1))

take( n )

取資料集的前n個元素組成的陣列

takeSample( withReplacement , num , [ seed ])

返回一個陣列,該陣列由從資料集中隨機取樣的num個元素組成,可以選擇是否用隨機數替換不足的部分,seed用於指定隨機數生成器種子

takeOrdered( n [ordering] )

takeOrdered和top類似,只不過以和top相反的順序返回元素

saveAsTextFile( path )

將資料集的元素以textfile的形式儲存到HDFS檔案系統或者其他支援的檔案系統,對於每個元素,Spark將會呼叫toString方法,將它裝換為檔案中的文字

saveAsSequenceFile( path

將資料集中的元素以Hadoop sequencefile的格式儲存到指定的目錄下,可以使HDFS或者其他Hadoop支援的檔案系統。

saveAsObjectFile( path


countByKey()

針對(K,V)型別的RDD,返回一個(K,Int)的map,表示每一個key對應的元素個數。

foreach( func )

在資料集的每一個元素上,執行函式func進行更新。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2645212/,如需轉載,請註明出處,否則將追究法律責任。

相關文章