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