天天看點

Spark學習(一)RDD特性及其算子一、什麼是Spark二、RDD的五大特性三、解釋RDD的五大特性四、RDD的三類算子五、Spark Application的大概運作流程

文章目錄

  • 一、什麼是Spark
  • 二、RDD的五大特性
  • 三、解釋RDD的五大特性
  • 四、RDD的三類算子
  • 五、Spark Application的大概運作流程

一、什麼是Spark

Apache Spark是一個開源的分布式計算架構,用于處理大規模的資料。旨在快速進行資料分析、快速運作和快速開發。Spark不是由一個人開發的,而是誕生于美國加州大學伯克利分校的AMP實驗室。于2010年開放源碼,2012年釋出了0.6.0版本,距今已有6年曆史,最新版本為2.4.0。

開發Spark可以使用Scala、Java、Python以及R語言。

二、RDD的五大特性

RDD(Resilient Distributed Dataset)彈性分布式資料集

  1. RDD是由一系列的partition組成
  2. RDD提供的每一個函數實際上是作用于每一個partition上
  3. RDD具有一系列的依賴關系,依賴于其他的RDD,RDD的依賴關系也叫RDD的血統(Lineage)
  4. 可選項 分區器是作用在KV格式的RDD上的
  5. 可選項 RDD會提供一系列的最佳的計算位置
    Spark學習(一)RDD特性及其算子一、什麼是Spark二、RDD的五大特性三、解釋RDD的五大特性四、RDD的三類算子五、Spark Application的大概運作流程

注:

Spark中沒有讀檔案的方法,它依賴MapReduce讀檔案的方法,即需要MapReduce中的jar包。MapReduce在讀檔案之前會将檔案劃分為一個個的split,為了保證資料的完整性,split的大小約等于block的大小。第一個RDD的分區數等于split的個數。大多數情況下,split的個數約等于block的個數,特殊情況下block的個數大于split的個數。

特殊情況:

假如前兩個block中都存了128M資料,第三個block中隻存了第二個block中的最後半行資料,此時第三個block中資料的大小就是半行資料的大小,由于split要保證資料的完整性需要将第三個block中的半行資料劃分到第二個split中,此時split數就小于block的個數。是以,不能說block的個數等于split的個數,隻能說大多數情況下兩者相等。

三、解釋RDD的五大特性

1、由圖可知每一個RDD由一系列partition組成。

2、例如将flatMap作用在每一個分區上,即父RDD作為flatMap的輸入,子RDD作為flatMap的輸出。

3、當一個partition内丢失,由于子RDD知道父RDD是誰,是以子RDD可以将函數再次作用在父RDD的partition上,重新生成新的partition,正是由于RDD的依賴性(單向依賴),計算的容錯性才高。

4、什麼是KV格式RDD?如果RDD中的資料是二進制組類型的,那麼我們就稱RDD是KV格式的RDD。即非KV格式RDD不能使用partitionBy方法。

5、RDD提供了一個方法接口,隻要調用這個方法接口,就可以找到每一個partition所在的位置。然後将task分發到partition所在節點上執行,這樣有利于資料本地化(計算向資料移動)。

四、RDD的三類算子

什麼是算子?算子也稱為方法、函數。

1、Transformation類

Transformation屬于延遲計算,當使用Transformation類算子的時候,RDD并沒有立即進行轉換,隻是有了對應的邏輯。當出現Action類算子時,Transformation類算子才會被執行。

常見的Transformation類算子:

  • map()
  • filter()
  • flatMap()扁平,傳回一組RDD,即一對多。
  • groupByKey()

    作用在KV格式的RDD上,傳回一個(K,Seq[V])對的資料集

    注意:預設情況下,使用8個并行任務進行分組,你可以傳入numTask可選參數,根據資料量設定不同數目的Task

  • reduceByKey()

    作用在KV格式的RDD上,相同的Key值,都被使用指定的reduce函數聚合到一起。和groupbykey類似,任務的個數可以通過第二個可選參數來配置。

  • sample(withReplacement,fraction,seed)

    withReplacement(Boolean類型): 抽樣的方式。true表示放回式抽樣,false 不放回式抽樣

    fraction(Double類型):抽樣比例。随機抽樣出比例為fraction的資料

    seed(Lang類型):随機算法的初始值,根據給定的随機種子seed

  • union() 傳回一個新的資料集,由原資料集和參數聯合而成
  • join()内連接配接

    在類型為(K,V)和(K,W)類型的資料集上調用,傳回一個(K,(V,W))對,每個key中的所有元素都在一起的資料集

2、Action類

觸發Transformation類算子的執行。每當遇見一次Action類算子,就會執行一個job。

常見的Action類算子有:

  • collect()
  • count() 傳回資料集的元素個數
  • foreach()
  • reduce()

3、Control類

将資料持久化到記憶體或磁盤。

常見的Control類算子

  • cache()
  • persist()

注:

當persist()的持久化級别是MEMORY_ONLY的時候與cache()作用一樣,是以說cache()是persist()的特例。

注意:

  • 控制類算子都是懶執行的,需要action類算子觸發執行
  • 控制類算子後面不能緊跟action類算子例如:rdd.cache().count()
  • cache和persist算子的傳回值可以賦給一個變量,在其他job中直接使用這個變量就可以使用持久化的資料。持久化的機關是partition。

五、Spark Application的大概運作流程

Spark學習(一)RDD特性及其算子一、什麼是Spark二、RDD的五大特性三、解釋RDD的五大特性四、RDD的三類算子五、Spark Application的大概運作流程

由圖可知:

  1. 每一個task都由Driver分發到相應的節點上。
  2. 每一個task的計算結果都會被拉回到Driver程序中。但是這個情況是十分危險的,容易造成Driver程序的OOM。可以通過代碼控制是否将計算結果拉回Driver端。

Driver的作用:

  1. 分發task到計算節點
  2. 監控task的執行情況
  3. 如果task執行失敗,會進行重試
  4. 将計算結果拉回Driver端

結論:Driver程序會和叢集進行頻繁的通信