1. 程式人生 > >Spark四大特性以及與MapReduce比較

Spark四大特性以及與MapReduce比較

一、速度

面向磁碟的MapReduce受限於磁碟讀/寫效能和網路I/O效能的約束,在處理迭代計算、實時計算、互動式資料查詢等方面並不高效,但是這些卻在圖計算、資料探勘和機器學習等相關應用領域中非常常見。針對這一不足,將資料儲存在記憶體中並基於記憶體進行計算是一個有效的解決途徑。

Spark是面向記憶體的大資料處理引擎,這使得Spark能夠為多個不同資料來源的資料提供近乎實時的處理效能,適用於需要多次操作特定資料集的應用場景。

在相同的實驗環境下處理相同的資料,若在記憶體中執行,那麼Spark要比MapReduce快100倍,如圖1所示;在磁碟中執行時Spark要比MapReduce快10倍,如圖2所示。綜合各種實驗表明,處理迭代計算問題Spark要比MapReduce快20多倍,計算資料分析類報表的速度可提高40多倍,能夠在5~7秒的延時內互動式掃描1TB資料集。

Spark與MapReduce相比在計算效能上有如此顯著的提升,主要得益於以下兩方面。

1.Spark是基於記憶體的大資料處理框架

Spark既可以在記憶體中處理一切資料,也可以使用磁碟來處理未全部裝入到記憶體中的資料。由於記憶體與磁碟在讀/寫效能上存在巨大的差距,因此CPU基於記憶體對資料進行處理的速度要快於磁碟數倍。然而MapReduce對資料的處理是基於磁碟展開的。一方面,MapReduce對資料進行Map操作後的結果要寫入磁碟中,而且Reduce操作也是在磁碟中讀取資料,另一方面,分散式環境下不同物理節點間的資料通過網路進行傳輸,網路效能使得該缺點進一步被放大。因此磁碟的讀/寫效能、網路傳輸效能成為了基於MapReduce大資料處理框架的瓶頸。圖3為MapReduce資料處理流程示意圖。

(a) MapReduce處理流程

MapReduce資料處理流程示意圖:

2.Spark具有優秀的作業排程策略

Spark中使用了有向無環圖(Directed Acyclic Graph,DAG)這一概念。一個Spark應用由若干個作業構成,首先Spark將每個作業抽象成一個圖,圖中的節點是資料集,圖中的邊是資料集之間的轉換關係;然後Spark基於相應的策略將DAG劃分出若干個子圖,每個子圖稱為一個階段,而每個階段對應一組任務;最後每個任務交由叢集中的執行器進行計算。藉助於DAG,Spark可以對應用程式的執行進行優化,能夠很好地實現迴圈資料流和記憶體計算。

 二、易用性

Spark不僅計算效能突出,在易用性方面也是其他同類產品難以比擬的。一方面,Spark提供了支援多種語言的API,如Scala、Java、Python、R等,使得使用者開發Spark程式十分方便。另一方面,Spark是基於Scala語言開發的,由於Scala是一種面向物件的、函式式的靜態程式語言,其強大的型別推斷、模式匹配、隱式轉換等一系列功能結合豐富的描述能力使得Spark應用程式程式碼非常簡潔。Spark的易用性還體現在其針對資料處理提供了豐富的操作。

在使用MapReduce開發應用程式時,通常使用者關注的重點與難點是如何將一個需求Job(作業)拆分成Map和Reduce。由於MapReduce中僅為資料處理提供了兩個操作,即Map和Reduce,因此係統開發人員需要解決的一個難題是如何把資料處理的業務邏輯合理有效地封裝在對應的兩個類中。與之相對比,Spark提供了80多個針對資料處理的基本操作,如map、flatMap、reduceByKey、filter、cache、collect、textFile等,這使得使用者基於Spark進行應用程式開發非常簡潔高效。以分詞統計為例,雖然MapReduce固定的程式設計模式極大地簡化了並行程式開發,但是程式碼至少幾十行;若換成Spark,其核心程式碼最短僅需一行,如示例1-1所示,極大地提高了應用程式開發效率。

示例1 基於Spark的WordCount程式核心程式碼:

sc.textFile("hdfs://master:8020/user/dong/Spark/wc.input").flatMap(_.split("")).map((_,1)).reduceByKey(_ + _).collect

此外,MapReduce自身並沒有互動模式,需要藉助Hive和Pig等附加模組。Spark則提供了一種命令列互動模式,即Spark Shell,使得使用者可以獲取到查詢和其他操作的即時反饋。

但需要注意的是,在Spark的實際專案開發中多用Scala語言,約佔70%;其次是Java,約佔20%;而Python約佔10%。通常使用方便、簡潔的工具,其內部往往封裝了更為複雜的機理,因此Scala與Java等語言比較起來,學習難度要大一些。

 三、通用性

相對於第一代的大資料生態系統Hadoop中的MapReduce,Spark 無論是在效能還是在方案的統一性方面,都有著極大的優勢。Spark框架包含了多個緊密整合的元件,如圖4所示。位於底層的是Spark Core,其實現了Spark的作業排程、記憶體管理、容錯、與儲存系統互動等基本功能,並針對彈性分散式資料集提供了豐富的操作。在Spark Core的基礎上,Spark提供了一系列面向不同應用需求的元件,主要有Spark SQL、Spark Streaming、MLlib、GraphX。

1.Spark SQL

Spark SQL是Spark用來操作結構化資料的元件。通過Spark SQL,使用者可以使用SQL或者Apache Hive版本的SQL方言(HQL)來查詢資料。Spark SQL支援多種資料來源型別,例如Hive表、Parquet以及JSON等。Spark SQL不僅為Spark提供了一個SQL介面,還支援開發者將SQL語句融入到Spark應用程式開發過程中,無論是使用Python、Java還是Scala,使用者可以在單個的應用中同時進行SQL查詢和複雜的資料分析。由於能夠與Spark所提供的豐富的計算環境緊密結合,Spark SQL得以從其他開源資料倉庫工具中脫穎而出。Spark SQL在Spark l.0中被首次引入。在Spark SQL之前,美國加州大學伯克利分校曾經嘗試修改Apache Hive以使其執行在Spark上,進而提出了元件Shark。然而隨著Spark SQL的提出與發展,其與Spark引擎和API結合得更加緊密,使得Shark已經被Spark SQL所取代。

2.Spark Streaming

眾多應用領域對實時資料的流式計算有著強烈的需求,例如網路環境中的網頁伺服器日誌或是由使用者提交的狀態更新組成的訊息佇列等,這些都是實時資料流。Spark Streaming是Spark平臺上針對實時資料進行流式計算的元件,提供了豐富的處理資料流的API。由於這些API與Spark Core中的基本操作相對應,因此開發者在熟知Spark核心概念與程式設計方法之後,編寫Spark Streaming應用程式會更加得心應手。從底層設計來看,Spark Streaming支援與Spark Core同級別的容錯性、吞吐量以及可伸縮性。

3.MLlib

MLlib是Spark提供的一個機器學習演算法庫,其中包含了多種經典、常見的機器學習演算法,主要有分類、迴歸、聚類、協同過濾等。MLlib不僅提供了模型評估、資料匯入等額外的功能,還提供了一些更底層的機器學習原語,包括一個通用的梯度下降優化基礎演算法。所有這些方法都被設計為可以在叢集上輕鬆伸縮的架構。

4.GraphX

GraphX是Spark面向圖計算提供的框架與演算法庫。GraphX中提出了彈性分散式屬性圖的概念,並在此基礎上實現了圖檢視與表檢視的有機結合與統一;同時針對圖資料處理提供了豐富的操作,例如取子圖操作subgraph、頂點屬性操作mapVertices、邊屬性操作mapEdges等。GraphX還實現了與Pregel的結合,可以直接使用一些常用圖演算法,如PageRank、三角形計數等。

上述這些Spark核心元件都以jar包的形式提供給使用者,這意味著在使用這些元件時,與MapReduce上的Hive、Mahout、Pig等元件不同,無需進行復雜煩瑣的學習、部署、維護和測試等一系列工作,使用者只要搭建好Spark平臺便可以直接使用這些元件,從而節省了大量的系統開發與運維成本。將這些元件放在一起,就構成了一個Spark軟體棧。基於這個軟體棧,Spark提出並實現了大資料處理的一種理念——“一棧式解決方案(one stack to rule them all)”,即Spark可同時對大資料進行批處理、流式處理和互動式查詢,如圖5所示。藉助於這一軟體棧使用者可以簡單而低耗地把各種處理流程綜合在一起,充分體現了Spark的通用性。

Spark面向大資料的綜合處理示意圖

四、多種執行模式,可以訪問多種資料來源

Spark支援多種執行模式:本地local執行模式、分散式執行模式。Spark叢集的底層資源可以藉助於外部的框架進行管理,目前Spark對Mesos和Yarn提供了相對穩定的支援。在實際生產環境中,中小規模的Spark叢集通常可滿足一般企業絕大多數的業務需求,而在搭建此類叢集時推薦採用Standalone模式(不採用外部的資源管理框架)。該模式使得Spark叢集更加輕量級。

Spark on Yarn模式:在這一模式下,Spark作為一個提交程式的客戶端將Spark任務提交到Yarn上,然後通過Yarn來排程和管理Spark任務執行過程中所需的資源。在搭建此模式的Spark叢集過程中,需要先搭建Yarn叢集,然後將Spark作為Hadoop中的一個元件納入到Yarn的排程管理下,這樣將更有利於系統資源的共享。

Spark on Mesoes模式:Spark和資源管理框架Mesos相結合的執行模式。Apache Mesos與Yarn類似,能夠將CPU、記憶體、儲存等資源從計算機的物理硬體中抽象地隔離出來,搭建了一個高容錯、彈性配置的分散式系統。Mesos同樣也採用Master/Slave架構,並支援粗粒度模式和細粒度模式兩種排程模式。

Spark Standalone模式:該模式是不借助於第三方資源管理框架的完全分散式模式。Spark使用自己的Master程序對應用程式執行過程中所需的資源進行排程和管理。對於中小規模的Spark叢集首選Standalone模式。