文章目錄
- 一、什麼是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)彈性分布式資料集
- RDD是由一系列的partition組成
- RDD提供的每一個函數實際上是作用于每一個partition上
- RDD具有一系列的依賴關系,依賴于其他的RDD,RDD的依賴關系也叫RDD的血統(Lineage)
- 可選項 分區器是作用在KV格式的RDD上的
- 可選項 RDD會提供一系列的最佳的計算位置
注:
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的大概運作流程
由圖可知:
- 每一個task都由Driver分發到相應的節點上。
- 每一個task的計算結果都會被拉回到Driver程序中。但是這個情況是十分危險的,容易造成Driver程序的OOM。可以通過代碼控制是否将計算結果拉回Driver端。
Driver的作用:
- 分發task到計算節點
- 監控task的執行情況
- 如果task執行失敗,會進行重試
- 将計算結果拉回Driver端
結論:Driver程序會和叢集進行頻繁的通信