Spark工作機制(一)——RDD的概念

注:本博客文章在 https://yyddbull.github.io/coffeecat/  同步更新

要了解Spark工作機制,首先要知道幾個概念,第一個就是RDD:

1、什麼是RDD

RDD(Resilient Distributed Datasets) 是 Spark 的核心概念,中文名是彈性數據集,通俗的講可以理解爲是一種抽象的大規模數據集合,或者是一個大的數組,這個數組是分佈在集羣上的,Spark會在這個數據集合上做一系列的數據處理、計算,然後產生新的RDD,直到最後得到計算結果。

至於爲什麼叫彈性數據集,彈性如何解釋?這裏是指在任何時候都能進行重算。舉個例子,當集羣中的一臺節點故障導致RDD丟失後,Spark還可以重新計算出這部分的分區的數據,所以,RDD是一種天生具有容錯機制的特殊集合,不需要通過數據冗餘的方式(比如檢查點)實現容錯,對用戶來說,感覺不到這部分的內容曾經丟失,所以RDD數據集就像一個海綿一樣,無論如何擠壓都是完整的。

2、RDD的特性

Spark官網對RDD的描述:

  • 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),類似hadoop,能夠被切分,從而實現並行計算,如圖1所示,RDD1中有3個區分(p1,p3,p4),分別存儲在3個節點上
  • 有一個函數計算分片,每個RDD都會實現compute函數,對每個分區內的數據進行計算
  • 依賴其他RDD的列表,例如由於RDD的轉換生成一個新的RDD,這樣RDD之間就會形成類似於流水線一樣的前後依賴關係
  • 可選,一個分區函數。Spark中有HashPartitioner和RangePartitioner。只有對於於key-value的RDD,纔會有Partitioner,非key-value的RDD的Parititioner的值是None
  • 可選,一個存儲存取每個Partition的優先位置的列表。對於HDFS文件來說,這個列表保存的就是每個Partition所在塊的位置

                               

                                                                        圖1 RDD數據模型

3、RDD的操作分類

RDD有2種操作類型:

  • 轉換(transformations) :從已經存在的數據集中創建一個新的數據集,會創建一個新的RDD,例如map操作,會針對將數據集的每個元素傳給函數處理,並生成一個新的RDD
  • 動作(actions) :在數據集上進行計算之後返回一個值到驅動程序,例如reduce動作,使用函數聚合RDD所有元素,並將結果返回給驅動程序

常用的Transformation如下:

  • map(func):返回一個新的分佈式數據集,該數據集由每一個輸入元素經過func函數轉換後組成
  • fitler(func):返回一個新的數據集,該數據集由經過func函數計算後返回值爲true的輸入元素組成
  • flatMap(func):類似於map,但是每一個輸入元素可以被映射爲0或多個輸出元素(因此func返回一個序列,而不是單一元素)
  • mapPartitions(func):類似於map,但獨立地在RDD上每一個分片上運行,因此在類型爲T的RDD上運行時,func函數類型必須是Iterator[T]=>Iterator[U]
  • mapPartitionsWithSplit(func):類似於mapPartitons,但func帶有一個整數參數表示分片的索引值。因此在類型爲T的RDD上運行時,func函數類型必須是(Int,Iterator[T])=>Iterator[U]
  • sample(withReplacement,fraction,seed):根據fraction指定的比例對數據進行採樣,可以選擇是否用隨機數進行替換,seed用於隨機數生成器種子
  • union(otherDataSet):返回一個新數據集,新數據集是由原數據集和參數數據集聯合而成
  • distinct([numTasks]):返回一個包含原數據集中所有不重複元素的新數據集
  • groupByKey([numTasks]):在一個(K,V)數據集上調用,返回一個(K,Seq[V])對的數據集。注意默認情況下,只有8個並行任務來操作,但是可以傳入一個可選的numTasks參數來改變它
  • reduceByKey(func,[numTasks]):在一個(K,V)對的數據集上調用,返回一個(K,V)對的數據集,使用指定的reduce函數,將相同的key的值聚合到一起。與groupByKey類似,reduceByKey任務的個數是可以通過第二個可選參數來設置的
  • sortByKey([[ascending],numTasks]):在一個(K,V)對的數據集上調用,K必須實現Ordered接口,返回一個按照Key進行排序的(K,V)對數據集。升序或降序由ascending布爾參數決定
  • join(otherDataset0,[numTasks]):在類型爲(K,V)和(K,W)數據集上調用,返回一個相同的key對應的所有元素在一起的(K,(V,W))數據集
  • cogroup(otherDataset,[numTasks]):在類型爲(K,V)和(K,W)數據集上調用,返回一個(K,Seq[V],Seq[W])元祖的數據集。這個操作也可以稱爲groupwith
  • cartesain(ohterDataset):笛卡爾積,在類型爲T和U類型的數據集上調用,返回一個(T,U)對數據集(兩兩的元素對)
     

常用的Action如下:

  • reduce(func):通過函數func(接收兩個參數,返回一個參數)聚集數據集中的所有元素。這個功能必須可交換且可關聯的,從而可以正確的並行運行
  • collect():在驅動程序中,以數組形式返回數據集中的所有元素。通常在使用filter或者其他操作返回一個足夠小的數據子集後再使用會比較有用
  • count():返回數據集元素個數
  • first():返回數據集第一個元素(類似於take(1))
  • take(n):返回一個由數據集前n個元素組成的數組,注意 這個操作目前並非並行執行,而是由驅動程序計算所有的元素
  • takeSample(withReplacement,num,seed):返回一個數組,該數組由從數據集中隨機採樣的num個元素組成,可以選擇是否由隨機數替換不足的部分,seed用戶指定隨機數生成器種子
  • saveAsTextFile(path):將數據集的元素以textfile的形式保存到本地文件系統--HDFS或者任何其他Hadoop支持的文件系統。對於每個元素,Spark將會調用toString方法,將它轉換爲文件中的文本行
  • saveAsSequenceFile(path):將數據集中的元素以Hadoop sequencefile的格式保存到指定的目錄下,可以是本地系統、HDFS或者任何其他的Hadoop支持的文件系統。這個只限於由key-value對組成,並實現了Hadoop的Writable接口,或者可以隱式的轉換爲Writable的RDD(Spark包括了基本類型轉換,例如Int、Double、String等)
  • countByKey():對(K,V)類型的RDD有效,返回一個(K,Int)對的map,表示每一個key對應的元素個數
  • foreach(func):在數據集的每一個元素上,運行函數func進行更新。通常用於邊緣效果,例如更新一個疊加器,或者和外部存儲系統進行交互,如HBase
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章