30分鐘概覽Spark分布式計算引擎

本文主要幫助初學者快速了解Spark,不會面面俱到,但核心一定點到。

詳細內容可參考Spark入門教程-1

Spark是繼Hadoop之后的下一代分布式內存計算引擎,于2009年誕生于加州大學伯克利分校AMPLab實驗室,現在主要由Databricks公司進行維護(公司創始員工均來自AMPLab),根據本人自2014學習Spark的理解,從下面幾個方面介紹。

1、為什么出現Spark?

2、Spark核心是什么?

3、Spark怎么進行分布式計算?

4、Spark在互聯網公司的實踐應用?

1、為什么出現Spark?

肯定是比Hadoop的MR計算要好,好在如下方面:

  • 高效
  • 多框架整合

1)為什么高效?

- 相對于Hadoop的MR計算,Spark支持DAG,能緩存中間數據,減少數據落盤次數;

- 使用多線程啟動task,更輕量,任務啟動快。計算速度理論上有10-100倍提升。(根據個人工作驗證,計算效率相對Hadoop至少是3倍以上)

- 高度抽象API,代碼比MR少2-5倍甚至更多,開發效率高

2)為什么多框架整合?

相對于過去使用Hadoop + Hive + Mahout + Storm 解決批處理、SQL查詢和實時處理和機器學習場景的大數據平臺架構,其最大的問題在于不同框架語言不同,整合復雜,同時也需要更多維護成本。

而使用Spark在Spark core的批處理基礎上,建立了Spark Sql、Spark Streaming,Spark Mllib,Spark GraphX來解決實時計算,機器學習和圖計算場景,方便將不同組件功能進行整合,同時維護成本小。

上圖就體現了Spark的One Stack Rule All的設計目標。

2、Spark核心是什么?

核心是RDD(Resilient Distributed Datasets),即彈性分布式數據集。

它是對數據的高度抽象概念,彈性可理解為數據存儲彈性,可內存,可磁盤; 分布式可理解為數據分布在不同節點。

RDD是分布式數據的邏輯抽象,物理數據存儲在不同的節點上,但對用戶透明,用戶不需要知道數據實際存在哪臺機器。RDD包含的內容下圖所示:

  • 只讀分區集合:這保證了RDD的一致性,在計算過程中更安全可靠,此外RDD可能包含多個分區,數據分布在不同分區中,這些分區可能在不同的機器上。

  • 對數據的計算函數:RDD包含了對所表示數據的計算函數,也就是得到這個RDD所要經過的計算。

  • 計算數據的位置:對用戶而言不需要知道數據在哪里,這些信息隱含在RDD的結構中。

  • 分區器:對數據分區依賴的分區算法,如hash分區器

  • 依賴的RDD信息:該RDD可能依賴的父RDD信息,用于失敗重算或計算的DAG劃分。

1 ) RDD的計算分為transformation和action兩類。

  • transformation有 flatMap、map、union、reduceByKey等。
  • action有count、collect、saveAsTextFile等表示輸出的操作。

RDD的計算是lazy的,transformation算子不會引發計算,只是邏輯操作,action算子才會引發實際的計算。

2)RDD算子的寬窄依賴

下圖解釋什么是寬依賴,什么是窄依賴

圖中左邊是寬依賴,父RDD的4號分區數據劃分到子RDD的多個分區(一分區對多分區),這就表明有shuffle過程,父分區數據經過shuffle過程的hash分區器(也可自定義分區器)劃分到子RDD。

那圖中右邊為什么是窄依賴?父RDD的每個分區的數據直接到子RDD的對應一個分區(一分區對一分區),例如1號到5號分區的數據都只進入到子RDD的一個分區,這個過程沒有shuffle。Spark中Stage的劃分就是通過shuffle來劃分。

(shuffle可理解為數據的從原分區打亂重組到新的分區)

當明白了Spark分布式計算核心就是RDD之后,下面看Spark如何實現分布式計算。

3、怎么進行分布式計算?

當初我學習Spark,也是一知半解,當理解RDD的內涵,才理解Spark分布式計算過程。

上圖是一個Spark的wordcount例子,根據上述stage劃分原則,這個job劃分為2個stage,有三行,分別是數據讀取、計算和存儲過程。

僅看代碼,用戶根本體會不到數據在背后是并行計算。從圖中能看出數據分布在不同分區(也可以理解不同機器上),數據經過flapMap、map和reduceByKey算子在不同RDD的分區中流轉。(這些算子就是上面所說對RDD進行計算的函數)

下圖從更高角度看:

Spark的運行架構由Driver(可理解為master)和Executor(可理解為worker或slave)組成,Driver負責把用戶代碼進行DAG切分,劃分為不同的Stage,然后把每個Stage對應的task調度提交到Executor進行計算,這樣Executor就并行執行同一個Stage的task。

(這里Driver和Executor進程一般分布在不同機器上)

這里有人可能不理解Stage和task,下圖就是Spark的作業劃分層次:

Application就是用戶submit提交的整體代碼,代碼中又有很多action操作,action算子把Application劃分為多個job,job根據寬依賴劃分為不同Stage,Stage內劃分為許多(數量由分區決定,一個分區的數據由一個task計算)功能相同的task,然后這些task提交給Executor進行計算執行,把結果返回給Driver匯總或存儲。

這體現了Driver端總規劃–Executor端分計算–結果最后匯總回Driver的思想,也就是分布式計算的思想。

4、Spark在互聯網公司的實踐應用

根據個人工作經歷,BAT大公司都直接或間接使用Spark(說間接是可能自主研發分布式計算引擎,但參考Spark設計思想)。中小公司大多已經采用Spark,并逐漸從MR計算遷移到Spark計算。

  • Spark在生產上可以通過zeppelin提供adhoc(即席查詢)服務。
  • Spark Sql可以替代Hive的ETL工作,但需要對generic UDF和UDAF進行重寫。
  • 可以基于Spark搭建特征工程平臺和機器學習平臺
  • Spark Streaming實時計算延遲是秒級,支持exactly-once要求的數據消費,可以做實時ETL,也可以結合Spark MLlib處理來做實時機器學習。Spark的下一代Structured Streaming的使用更簡單。

 

 

來自:http://blog.csdn.net/xwc35047/article/details/60330528

 

 本文由用戶 jiushi506 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!