用Spark來替代Hadoop的觀點在很早之前筆者就有耳聞,其實提出這種觀點的緣由仍是在於Spark和Hadoop二者之間存在的差別。首先,二者都是開源的,這使得他們可以大規模應用在大數據分析領域,也可以在其基礎上進行多樣性的開發;其次,Spark立足與Scala,使得Scala擁有了高性能的計算框架;同時,Spark與Hadoop相比,不受HDFS的侷限,在海量數據的計算、挖掘性能上優於Hadoop,在當下較爲流行的機器學習上,Spark也有較好的表現,因此在這些因素的做用下,Spark日益受到用戶的喜好。
但這並不能說明Hadoop再也不擁有優點,Hadoop擁有強大的生態,做爲一種分佈式系統架構,Hadoop適用於低成本、大規模的數據分析環境,可以接受海量數據的存儲和運算,雖然Spark改進了不少MapReduce的算法,但實際上更多的是做爲Hadoop的一種補充。
要深入理解二者之間的關係,首先須要對Hadoop進行詳細瞭解:算法
Hadoop可以解決什麼問題?
Hadoop解決了大數據(大到一臺計算機沒法進行存儲,一臺計算機沒法在要求的時間內進行處理)的可靠存儲和處理。
HDFS,在由普通PC組成的集羣上提供高可靠的文件存儲,經過將塊保存多個副本的辦法解決服務器或硬盤壞掉的問題。
MapReduce,經過簡單的Mapper和Reducer的抽象提供一個編程模型,能夠在一個由幾十臺上百臺的PC組成的不可靠集羣上併發地,分佈式地處理大量的數據集,而把併發、分佈式(如機器間通訊)和故障恢復等計算細節隱藏起來。而Mapper和Reducer的抽象,又是各類各樣的複雜數據處理均可以分解爲的基本元素。複雜的數據處理能夠分解爲由多個Job(包含一個Mapper和一個Reducer)組成的有向無環圖(DAG),而後每一個Mapper和Reducer放到Hadoop集羣上執行,就能夠得出結果。
在MapReduce中,Shuffle是一個很是重要的過程,正是有了看不見的Shuffle過程,纔可使在MapReduce之上寫數據處理的開發者徹底感知不到分佈式和併發的存在。編程
那麼,Hadoop有哪些侷限於不足呢?
可是,MapRecue存在如下侷限,使用起來比較困難。
1.抽象層次低,須要手工編寫代碼來完成,使用上難以上手;
2.只提供兩個操做,Map和Reduce,表達力欠缺;
3.一個Job只有Map和Reduce兩個階段(Phase),複雜的計算須要大量的Job完成,Job之間的依賴關係是由開發者本身管理的;
4.處理邏輯隱藏在代碼細節中,沒有總體邏輯;
5.中間結果也放在HDFS文件系統中;
6.ReduceTask須要等待全部MapTask都完成後才能夠開始,時延高,只適用Batch數據處理,對於交互式數據處理,實時數據處理的支持不夠;
7.對於迭代式數據處理性能比較差。安全
因而,針對以上內容,Spark作了必定程度上的改進:
從性能方面來比較,Spark在於運算速度快。Spark還能夠執行批量處理,然而它真正擅長的是處理流工做負載、交互式查詢和機器學習。
相比MapReduce基於磁盤的批量處理引擎,Spark賴以成名之處是其數據實時處理功能。Spark與Hadoop及其模塊兼容。實際上,在Hadoop的項目頁面上,Spark就被列爲是一個模塊。Spark有本身的頁面,由於雖然它能夠經過YARN(另外一種資源協調者)在Hadoop集羣中運行,可是它也有一種獨立模式。它能夠做爲 Hadoop模塊來運行,也能夠做爲獨立解決方案來運行。MapReduce和Spark的主要區別在於,MapReduce使用持久存儲,而Spark使用彈性分佈式數據集(RDDS)。
Spark之因此如此快速,緣由在於它在內存中處理一切數據。沒錯,它還可使用磁盤來處理未所有裝入到內存中的數據。
Spark的內存處理爲來自多個來源的數據提供了近乎實時分析的功能:營銷活動、機器學習、物聯網傳感器、日誌監控、安全分析和社交媒體網站。另外,MapReduce使用批量處理,其實歷來就不是爲驚人的速度設計的。它的初衷是不斷收集來自網站的信息,不須要這些數據具備實時性或近乎實時性。服務器
從簡單易用角度來講,Spark支持Scala(原生語言)、Java、Python和Spark SQL。Spark SQL很是相似於SQL 92,因此幾乎不須要經歷一番學習,立刻能夠上手。Spark還有一種交互模式,那樣開發人員和用戶均可以得到查詢和其餘操做的即時反饋。MapReduce沒有交互模式,不過有了Hive和Pig等附加模塊,採用者使用MapReduce來得容易一點。架構
在容錯性方面,MapReduce和Spark從兩個不一樣的方向來解決問題。MapReduce使用TaskTracker節點,它爲 JobTracker節點提供了心跳(heartbeat)。若是沒有心跳,那麼JobTracker節點從新調度全部將執行的操做和正在進行的操做,交給另外一個TaskTracker節點。這種方法在提供容錯性方面頗有效,但是會大大延長某些操做(即使只有一個故障)的完成時間。
Spark使用彈性分佈式數據集(RDD),它們是容錯集合,裏面的數據元素可執行並行操做。RDD能夠引用外部存儲系統中的數據集,好比共享式文件系統、HDFS、HBase,或者提供Hadoop InputFormat的任何數據源。Spark能夠用Hadoop支持的任何存儲源建立RDD,包括本地文件系統,或前面所列的其中一種文件系統。併發
因此,經過上面內容的論述,筆者認爲,Spark能夠對Hadoop起到一個很好的補充做用,並且在某種程度上,二者能夠並行。Hadoop創建分佈式文件系,而Spark負責進行高效地數據運算,從而搭建一個理想的大數據處理平臺。
app