f分布表完整图_分布式计算引擎之星——Spark
文/李萌
Spark作為分布式計算引擎的一顆璀璨之星,繼承了MapReduce分布式并行計算的優點,并改進了MapReduce明顯的缺陷。它使用一種面向對象、函數式編程語言Scala來實現,能夠像操作本地集合對象一樣輕松地操作分布式數據集,具有運行速度快、易用性好、通用性強、兼容性好等諸多優點。
圖1.大數據生態
從整個大數據生態來看,Spark和MapReduce同為大數據計算框架,但是Spark的產生是基于MapReduce幾個明顯缺陷:
(1)MapReduce僅支持Map和Reduce兩種操作;
(2)MapReduce是基于進程的計算,任務調度和啟動開銷大。此外Map中間結果要落地到磁盤,網絡I/O和磁盤I/O十分頻繁,延遲高,處理效率低,無法充分利用內存;
(3)Map端和Reduce端均需要排序,耗費時間;
(4)不適合迭代計算(如機器學習、圖計算等),交互式處理(數據挖掘)和流式處理(點擊日志分析),無法滿足實時性較高的業務;
(5)編程不夠靈活,因其是用 Java 編寫的,編寫一個完整的MapReduce任務代碼的數據行數要遠遠大于Spark實現相同的功能。
基于MapReduce的這些缺陷,Spark做了很多改進。
首先是把計算過程的一些中間數據放到了內存中,中間結果可以不落地,減少了磁盤IO,提升了性能。但這并不能說Spark就是內存計算,MapReduce也是要把數據放到內存計算,也具備將數據文件緩存到內存的策略,然后寫到磁盤的。
Spark并不具備將數據存儲在RAM的選項,它所能做的事就是在內存中緩存數據,而這個并不是數據持久化。Spark允許我們使用內存緩存以及LRU替換規則,因此從本質上說,Spark是一種有效使用內存LRU策略的技術。
Spark是如何提高性能并兼具如此多的優點,它能完全取代MapReduce嗎? 我們從以下幾個方面來探討一下。
01什么是RDD
提到Spark,不得不說的是RDD (Resilient Distributed Dataset)——彈性分布式數據集,從本質上說它是一種只讀的、分區記錄的集合,一個不可變的分布式對象集合。如圖2所示,每個RDD都被分為多個分區,這些分區運行在集群的不同節點上。我們可以通過讀取文本文件、HDFS、數據庫、內存等創建一個RDD。
圖2 RDD
為什么說RDD是彈性的呢?是因為每個RDD都可以按照分區被讀入內存和磁盤,并能在內存和磁盤之間手動或自動切換,如圖3所示。
圖3 RDD轉化
可能我們還會有疑問,既然RDD是只讀的不可改變的,那計算過程中如何改變RDD的值呢?RDD可以通過轉換成其他的RDD,跟人類之間的血緣關系一樣。
對RDD有兩種類型的操作,一個是轉化 (Transformation),比如過濾,把數據集中的每個元素都乘以2,變成一個新的RDD,就像數學中的函數f(x)一樣,可以把f(x)作用于一個RDD,映射成一個新的RDD。
這種轉換是惰性執行的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action 操作的時候才會真正觸發運算。Action操作是數據執行部分,其通過執行count,reduce,collect等方法真正執行數據的計算部分。它會觸發 Spark提交作業(Job),并將數據輸出 Spark系統,返回的類型是一個其他的數據類型RDD,如圖4所示。
圖4 RDD操作類型
在實際應用中,我們可能會多次使用同一個RDD,如果簡單地對 RDD 調用Action操作,Spark每次都會重新計算RDD及相關依賴,這樣就會帶來太大的消耗。
為了避免多次計算同一個RDD,可以對數據進行持久化,調用persist和cache方法將SparkRDD緩存到內存、磁盤文件系統中。這樣緩存的 RDD 在使用時,存取速度會被大大提高。
一般情況下,Executor內存的60%會分配給Cache,剩下的40% 用來執行任務。cache方法可以將RDD緩存到內存中,persist可以讓用戶根據需求指定一個持久化級別,如下表所示。我們可以根據具體場景來對RDD設置不同的緩存級別。
表1 RDD的不同緩存級別
此外,根據RDD之間的轉換關系,還定義了寬依賴(Wide Dependency)和窄依賴(Narrow Dependency)。寬依賴是指每個父RDD的分區會被多個子RDD分區所使用,也就是說一個父親會有多個孩子;窄依賴是指每個父RDD分區只有一個子RDD,相當于是獨生子女。RDD的依賴關系是后面劃分任務階段的重要依據。
圖5 RDD的依賴關系
02Spark計算框架
理解了RDD的原理和機制,我們來看一下Spark框架,以及Spark是如何基于RDD執行任務的呢?
圖6 Spark計算框架
Spark中設立了資源管理器(Cluster Manager),來負責資源申請和管理在運行節點 Worker Node 上運行應用所需的資源。每一個Spark應用都會創建一個驅動器程序Driver Program, 它通過運行SparkContext對象來訪問Spark。
SparkContext對象代表著對計算集群的連接,可以認為就是main運行的地方,可以進行RDD的初始化,向Cluster Manager申請任務運行的資源。Worker Node是真正工作的節點,Executor是Worker Node上的一個進程,負責準備Task環境和執行Task,負責內存和磁盤的使用,一個Executor對應一個具體的任務Task。
03Spark執行過程
當一個應用提交到Spark集群,會有多個計算算子,也就是多個Job,每個Job會對應創建Driver構建Spark應用的運行環境,啟動SparkContext上下文。
SparkContext作為DriverProgram的核心,做了很多工作,所有與Cluster、Worker Node交互的操作都需要SparkContext來完成。其中DAGScheduler負責分析用戶提交的應用,根據輸入的RDD,創建一個有向無環圖。同時根據RDD組成的有向無環圖之間的寬窄依賴劃分成不同的階段Stage, 遇到寬依賴,就劃分出一個Stage,每個Stage由若干個Task組成。
圖7 DAGScheduler?
Stage劃分完畢,DAGScheduler最終提交給任務調度器TaskScheduler 的是一個含有多個Task的集合。TaskScheduler會根據一定策略(先進先出、公平策略等)將這些任務集合提交到TaskManager運行。Task在Executor上運行完釋放所有資源。
圖8 任務執行流程
04Spark運行模式
Spark目前有四種運行模式,Local模式、Standalone模式、Spark on Mesos模式以及Spark on Yarn模式。
Local本地模式主要用于開發、測試代碼功能時使用。Standalone獨立模式,自帶完整的服務,可單獨部署到一個集群中,無需依賴任何其他資源管理系統。如果我們只想在一堆機器上運行Spark,獨立模式是部署集群最簡單的方法。
但是如果需要與其他的分布式應用共享集群時,比如既可以運行Spark作業又可以運行MapReduce作業,就需要運行在集群管理器上。
官方推薦運行在Mesos之上,除了血緣關系的原因,由于Spark開發之初就考慮到支持Mesos,因此,Spark運行在Mesos上會比運行在Yarn上更加靈活,更加自然。但是在實際應用中,為了讓Spark更快速的訪問HDFS中的數據,運行在Yarn上也非常有意義,是一種很有前景的部署模式。
05Spark生態
Spark生態圈是伯克利APMLab實驗室打造的,涉及到機器學習、數據挖掘、數據庫、信息檢索、自然語言處理和語音識別等多個領域。包含SparkCore、SparkSQL、SparkStreaming、MLlib和GraphX等組件,能無縫集成并提供一站式解決方案。
06Spark能完全取代MapReduce嗎?
Spark替代MapReduce的討論已經屢見不鮮了,Spark在任何情況下均比MapReduce高效嗎?答案是否定的。Spark并不是在任何情況下都比MapReduce高效的,我們要根據不同的應用場景擇優選擇。
當做一個簡單的數據轉換,且只需要Map操作時,MapReduce的處理效率要比Spark高,相對而言Spark預處理和啟動的成本比較高。當遇到確實非常大的數據以至于無法完全讀入內存,又或是依靠著大量對該平臺有經驗的技術人員,它可能會比 Spark 更加高效。
在資源處理上,MapReduce的資源申請是以Task為粒度的,在處理完Task后會立即釋放資源;而Spark Executor是粗粒度的資源分配模式,在完成任務處理后并不會關閉,繼續等待后續任務的處理,資源不能得到釋放。
在安全性上,此時的 Spark還略顯不足。MapReduce 擁有所有 Hadoop 支持的安全機制,但是如果Spark運行在Yarn上并配合使用HDFS的話,需要具備HDFS文件許可機制和節點間的加密機制。
總之,Spark作為一顆冉冉升起的新星,正在蓬勃發展,應用非常廣泛,目前已經推出3.0版本,開發了更多新的功能,賦予我們更強大處理數據的能力,值得我們每個IT人去研究學習。
參考文獻http://spark.apache.org/?
http://cnblogs.com/intsmaze/p/7197420.html
http://zhihu.com/question/51378885
顧問:許國平 李湘宜
? ? ?趙曉玲 張剛
總編:孫鵬暉
美編:白羽
-本文為“數風云”第8期文章;
-轉載本公眾號文章請聯系我們;
-歡迎來稿:請按“題目-作者”格式命名發送到sunpenghui@abchina.com。
總結
以上是生活随笔為你收集整理的f分布表完整图_分布式计算引擎之星——Spark的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀亲密关系怎么弄
- 下一篇: sklearn pipeline_skl