2015-06-07 33 views
21

現在,Spark正在進行中。 Spark使用scala語言來加載和執行程序,還有python和java。 RDD用於存儲數據。但是,我無法理解Spark的架構,它如何在內部運行。Spark的內部工作

請告訴我Spark架構以及它如何在內部工作?

回答

67

即使我一直在尋找的網站,瞭解星火的內部,下面是我可以學習和分享想到這裏,

星火圍繞一個彈性分佈式數據集的概念行健(RDD)這是可以並行操作的容錯組件的容錯集合。 RDD支持兩種類型的操作:轉換(從現有數據集創建新數據集),以及在數據集上運行計算後將值返回給驅動程序的操作。

星火轉換的RDD轉化成一種叫做DAG(有向無環圖),並開始執行,

在較高水平,當任何行動呼籲RDD,星火創建DAG並提交到DAG調度。

  • DAG調度程序將操作員劃分爲多個任務階段。一個階段由基於輸入數據分區的任務組成。 DAG調度程序一起管理運營商。對於例如許多地圖運營商可以安排在單一階段。 DAG調度程序的最終結果是一系列階段。

  • 階段傳遞到任務計劃程序。任務計劃程序通過集羣管理器啓動任務(Spark Standalone/Yarn/Mesos)。任務調度程序不知道階段的依賴關係。

  • 工作人員執行從站上的任務。

讓我們來看看Spark如何構建DAG。

在高層次上,可以對RDD應用兩種轉換,即窄轉換和寬轉換。廣泛的轉換基本上導致了階段邊界。

縮小轉換範圍 - 不需要跨分區對數據進行混洗。例如,地圖,過濾器和等。

寬改造 - 需要對數據進行洗牌例如,reduceByKey和等。

讓我們計算日誌消息多少出現在每個示例嚴重級別,

下面是一個嚴重等級啓動日誌文件,

INFO I'm Info message 
WARN I'm a Warn message 
INFO I'm another Info message 

,並創建以下Scala代碼中提取相同,

val input = sc.textFile("log.txt") 
val splitedLines = input.map(line => line.split(" ")) 
         .map(words => (words(0), 1)) 
         .reduceByKey{(a,b) => a + b} 

命令序列隱式地定義將當動作稱爲以後使用RDD對象(RDD譜系)的DAG。每個RDD都維護一個指向一個或多個父級的指針,以及有關它與父級關係的類型的元數據。例如,當我們在RDD上調用val b = a.map()時,RDD b保持對其父a的引用,這是一個譜系。

要顯示RDD的血統,Spark提供了一個調試方法toDebugString()方法。例如上執行splitedLines toDebugString() RDD,將輸出以下,

(2) ShuffledRDD[6] at reduceByKey at <console>:25 [] 
    +-(2) MapPartitionsRDD[5] at map at <console>:24 [] 
    | MapPartitionsRDD[4] at map at <console>:23 [] 
    | log.txt MapPartitionsRDD[1] at textFile at <console>:21 [] 
    | log.txt HadoopRDD[0] at textFile at <console>:21 [] 

第一行(從底部)示出了輸入RDD。我們通過調用sc.textFile()來創建此RDD。請參閱下面從給定的RDD創建的DAG圖形的更多示意圖。

RDD DAG graph

一旦DAG是建立,星火計劃程序創建一個物理執行計劃。如上所述,DAG調度程序將圖分成多個階段,階段根據​​轉換創建。狹隘的轉變將被分組(管線)成一個階段。因此,對於我們的例子中,星火可以建立兩個階段執行如下,

Stages

的DAG調度然後提交階段進入任務調度。提交的任務數量取決於textFile中存在的分區數量。 Fox例子考慮在這個例子中我們有4個分區,那麼如果有足夠的從/內核,將會有4個並行創建和提交的任務。下圖說明了這一點中更詳細,

Task execustion

更多詳細信息,我建議你去通過下面的YouTube視頻,其中星火創作者對DAG和執行計劃,終身深入的細節給。

  1. Advanced Apache Spark- Sameer Farooqui (Databricks)
  2. A Deeper Understanding of Spark Internals - Aaron Davidson (Databricks)
  3. Introduction to AmpLab Spark Internals
+0

嗨Santish我有一個快速的問題。你說reduceByKey是一個廣泛的轉換,因爲它「要求數據被混洗」。你能否詳細說明你的洗牌意味着什麼?這是否意味着你只是添加來自不同元組的值,所以你正在「洗牌」數據? – LP496

+0

這應該給出一個非常詳細的圖形描述什麼是洗牌 - https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html – Sathish

+0

@Sathish尼斯解釋 – PVH