第一部分 Spark Core
第1節 Spark概述
1.1 什麼是Spark
Spark 是一個快速、通用的計算引擎。Spark的特點:
速度快。與 MapReduce 相比,Spark基於內存的運算要快100倍以上,基於硬
盤的運算也要快10倍以上。Spark實現了高效的DAG執行引擎,可以通過基於內
存來高效處理數據流;
使用簡單。Spark支持 Scala、Java、Python、R的API,還支持超過80種高級算
法,使用戶可以快速構建不同的應用。而且Spark支持交互式的Python和Scala
的shell,可以非常方便地在這些shell中使用Spark集羣來驗證解決問題的方法;
通用。Spark提供了統一的解決方案。Spark可以用於批處理、交互式查詢
(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算
(GraphX)。這些不同類型的處理都可以在同一個應用中無縫使用。Spark統一的
解決方案非常具有吸引力,企業想用統一的平臺去處理遇到的問題,減少開發和
維護的人力成本和部署平臺的物力成本;
兼容好。Spark可以非常方便地與其他的開源產品進行融合。Spark可以使用
YARN、Mesos作爲它的資源管理和調度器;可以處理所有Hadoop支持的數
據,包括HDFS、HBase和Cassandra等。這對於已經部署Hadoop集羣的用戶特
別重要,因爲不需要做任何數據遷移就可以使用Spark的強大處理能力。Spark
也可以不依賴於第三方的資源管理和調度器,它實現了Standalone作爲其內置
的資源管理和調度框架,這樣進一步降低了Spark的使用門檻,使得所有人都可
以非常容易地部署和使用Spark。此外,Spark還提供了在EC2上部署
Standalone的Spark集羣的工具。
1.2 Spark 與 Hadoop
從狹義的角度上看:Hadoop是一個分佈式框架,由存儲、資源調度、計算三部分組 成; Spark是一個分佈式計算引擎,由 Scala 語言編寫的計算框架,基於內存的快速、通 用、可擴展的大數據分析引擎; 從廣義的角度上看,Spark是Hadoop生態中不可或缺的一部分;
MapReduce的不足:
表達能力有限
磁盤IO開銷大
延遲高
任務之間的銜接有IO開銷
在前一個任務執行完成之前,後一個任務無法開始。難以勝任複雜的、多階段計算任務
Spark在借鑑MapReduce優點的同時,很好地解決了MapReduce所面臨的問題。
- 備註:Spark的計算模式也屬於MapReduce;Spark框架是對MR框架的優化 ;
在實際應用中,大數據應用主要包括以下三種類型:
- 批量處理(離線處理):通常時間跨度在數十分鐘到數小時之間
- 交互式查詢:通常時間跨度在數十秒到數分鐘之間
- 流處理(實時處理):通常時間跨度在數百毫秒到數秒之間
當同時存在以上三種場景時,傳統的Hadoop框架需要同時部署三種不同的軟件。 如:
- MapReduce / Hive 或 Impala / Storm
這樣做難免會帶來一些問題:
- 不同場景之間輸入輸出數據無法做到無縫共享,通常需要進行數據格式的轉換
- 不同的軟件需要不同的開發和維護團隊,帶來了較高的使用成本
- 比較難以對同一個集羣中的各個系統進行統一的資源協調和分配
Spark所提供的生態系統足以應對上述三種場景,即同時支持批處理、交互式查詢和 流數據處理:
-
Spark的設計遵循“一個軟件棧滿足不同應用場景”的理念(all in one),逐漸形成了一套完整的生態系統
-
夠提供內存計算框架,也可以支持SQL即席查詢、實時流式計算、機器學習 和圖計算等
-
Spark 在資源管理器YARN之上,提供一站式的大數據解決方案
Spark 爲什麼比 MapReduce 快: 1 Spark積極使用內存。MR框架中一個Job 只能擁有一個 map task 和一個 reduce task。如果業務處理邏輯複雜,一個map和一個reduce是表達不出來的,這時就需 要將多個 job 組合起來;然而前一個job的計算結果必須寫到HDFS,才能交給後一個 job。這樣一個複雜的運算,在MR框架中會發生很多次寫入、讀取操作操作;Spark 框架則可以把多個map reduce task組合在一起連續執行,中間的計算結果不需要落 地; 複雜的MR任務:mr + mr + mr + mr +mr ... 複雜的Spark任務:mr -> mr -> mr ......
2、多進程模型(MR) vs 多線程模型(Spark)。MR框架中的的Map Task和Reduce Task是進程級別的,而Spark Task是基於線程模型的。MR框架中的 map task、 reduce task都是 jvm 進程,每次啓動都需要重新申請資源,消耗了不必要的時間。 Spark則是通過複用線程池中的線程來減少啓動、關閉task所需要的系統開銷。
1.3 系統架構
Spark運行架構包括:
- Cluster Manager
- Worker Node
- Driver
- Executor
Cluster Manager 是集羣資源的管理者。Spark支持3種集羣部署模式:
Standalone、Yarn、Mesos;
Worker Node 工作節點,管理本地資源;
Driver Program。運行應用的 main() 方法並且創建了 SparkContext。由Cluster Manager分配資源,SparkContext 發送 Task 到 Executor 上執行;
Executor:在工作節點上運行,執行 Driver 發送的 Task,並向 Dirver 彙報計算結果;
1.4 Spark集羣部署模式
Spark支持3種集羣部署模式:Standalone、Yarn、Mesos;
-
1、Standalone模式 *獨立模式,自帶完整的服務,可單獨部署到一個集羣中,無需依賴任何其他資源管理系統。從一定程度上說,該模式是其他兩種的基礎
Cluster Manager:Master
Worker Node:Worker
僅支持粗粒度的資源分配方式
-
2、Spark On Yarn模式
Yarn擁有強大的社區支持,且逐步已經成爲大數據集羣資源管理系統的標準
在國內生產環境中運用最廣泛的部署模式
Spark on yarn 的支持兩種模式:
yarn-cluster:適用於生產環境
yarn-client:適用於交互、調試,希望立即看到app的輸出
Cluster Manager:ResourceManager
Worker Node:NodeManager
僅支持粗粒度的資源分配方式
- 3、Spark On Mesos模式
官方推薦的模式。Spark開發之初就考慮到支持Mesos
Spark運行在Mesos上會比運行在YARN上更加靈活,更加自然
Cluster Manager:Mesos Master
Worker Node:Mesos Slave
支持粗粒度、細粒度的資源分配方式
粗粒度模式(Coarse-grained Mode):每個應用程序的運行環境由一個Dirver和 若干個Executor組成,其中,每個Executor佔用若干資源,內部可運行多個Task。 應用程序的各個任務正式運行之前,需要將運行環境中的資源全部申請好,且運行過 程中要一直佔用這些資源,即使不用,最後程序運行結束後,回收這些資源。
細粒度模式(Fine-grained Mode):鑑於粗粒度模式會造成大量資源浪費,Spark On Mesos還提供了另外一種調度模式:細粒度模式,這種模式類似於現在的雲計 算,核心思想是按需分配。
-
三種集羣部署模式如何選擇: 生產環境中選擇Yarn,國內使用最廣的模式
Spark的初學者:Standalone,簡單
開發測試環境,可選擇Standalone
數據量不太大、應用不是太複雜,建議可以從Standalone模式開始 mesos不會涉及到
1.5 相關術語
Application 用戶提交的spark應用程序,由集羣中的一個driver 和 許多
executor 組成
Application jar 一個包含spark應用程序的jar,jar不應該包含 Spark 或 Hadoop
的 jar,這些jar應該在運行時添加
Driver program 運行應用程序的main(),並創建SparkContext(Spark應用程
序)
Cluster manager 管理集羣資源的服務,如standalone,Mesos,Yarn
Deploy mode 區分 driver 進程在何處運行。在 Cluster 模式下,在集羣內部運
行 Driver。 在 Client 模式下,Driver 在集羣外部運行
Worker node 運行應用程序的工作節點
Executor 運行應用程序 Task 和保存數據,每個應用程序都有自己的
executors,並且各個executor相互獨立
Task
executors應用程序的最小運行單元
Job
在用戶程序中,每次調用Action函數都會產生一個新的job,也就是說每個
Action 生成一個job
Stage
一個 job 被分解爲多個 stage,每個 stage 是一系列 Task 的集合