每一年,市場上都會出現種種不一樣的數據管理規模、類型與速度表現的分佈式系統。在這些系統中,Spark和hadoop是得到最大關注的兩個。然而該怎麼判斷哪一款適合你?算法
若是想批處理流量數據,並將其導入HDFS或使用Spark Streaming是否合理?若是想要進行機器學習和預測建模,Mahout或MLLib會更好地知足您的需求嗎?編程
爲了增長混淆,Spark和Hadoop常常與位於HDFS,Hadoop文件系統中的Spark處理數據一塊兒工做。可是,它們都是獨立個體,每個體都有本身的優勢和缺點以及特定的商業案例。安全
本文將從如下幾個角度對Spark和Hadoop進行對比:體系結構,性能,成本,安全性和機器學習。架構
什麼是Hadoop?機器學習
Hadoop在2006年開始成爲雅虎項目,隨後成爲頂級的Apache開源項目。它是一種通用的分佈式處理形式,具備多個組件:編程語言
HDFS(分佈式文件系統),它將文件以Hadoop本機格式存儲,並在集羣中並行化;分佈式
YARN,協調應用程序運行時的調度程序;oop
MapReduce,實際並行處理數據的算法。性能
Hadoop使用Java搭建,可經過多種編程語言訪問,用於經過Thrift客戶端編寫MapReduce代碼(包括Python)。學習
除了這些基本組件外,Hadoop還包括:
Sqoop,它將關係數據移入HDFS;
Hive,一種相似SQL的接口,容許用戶在HDFS上運行查詢;
Mahout,機器學習。
除了將HDFS用於文件存儲以外,Hadoop如今還能夠配置爲使用S3存儲桶或Azure blob做爲輸入。
它能夠經過Apache發行版開源,也能夠經過Cloudera(規模和範圍最大的Hadoop供應商),MapR或HortonWorks等廠商提供。
##什麼是Spark?
Spark是一個較新的項目,最初於2012年在加州大學伯克利分校的AMPLab開發。它也是一個頂級Apache項目,專一於在羣集中並行處理數據,但最大的區別在於它在內存中運行。
鑑於Hadoop讀取和寫入文件到HDFS,Spark使用稱爲RDD,彈性分佈式數據集的概念處理RAM中的數據。 Spark能夠以獨立模式運行,Hadoop集羣可用做數據源,也能夠與Mesos一塊兒運行。在後一種狀況下,Mesos主站將取代Spark主站或YARN以進行調度。
Spark是圍繞Spark Core搭建的,Spark Core是驅動調度,優化和RDD抽象的引擎,並將Spark鏈接到正確的文件系統(HDFS,S3,RDBM或Elasticsearch)。有幾個庫在Spark Core上運行,包括Spark SQL,它容許在分佈式數據集上運行相似SQL的命令,用於機器學習的MLLib,用於圖形問題的GraphX以及容許連續流式傳輸的流式傳輸記錄數據。
Spark有幾個API。原始界面是用Scala編寫的,基於數據科學家的大量使用,還添加了Python和R端點。 Java是編寫Spark做業的另外一種選擇。
Databricks由也Spark創始人Matei Zaharia建立的,致力於提供基於 Spark 的雲服務,可用於數據集成,數據管道等任務
在這裏仍是要推薦下我本身建的大數據學習交流羣:784557197,羣裏都是學大數據開發的,若是你正在學習大數據 ,小編歡迎你加入,你們都是軟件開發黨,不按期分享乾貨(只有大數據軟件開發相關的),包括我本身整理的一份2018最新的大數據進階資料和高級開發教程,歡迎進階中和進想深刻大數據的小夥伴加入。
Hadoop
首先,全部傳入HDFS的文件都被分割成塊。根據配置的塊大小和複製因子,每一個塊在整個羣集中被複制指定的次數。該信息被傳遞給NameNode,它跟蹤整個集羣中的全部內容。 NameNode將這些文件分配給一些數據節點,而後將這些文件寫入其中。 2012年實施高可用性,容許NameNode故障轉移到備份節點上,以跟蹤羣集中的全部文件。
MapReduce算法位於HDFS之上,由JobTracker組成。一旦應用程序以其中一種語言編寫,Hadoop接受JobTracker,而後分配工做(可包括計算單詞和清理日誌文件的任何內容),以便在存儲在Hive倉庫中的數據之上運行HiveQL查詢)到偵聽其餘節點的TaskTracker。
YARN分配JobTracker加速並監控它們的資源,以提升效率。而後將全部來自MapReduce階段的結果彙總並寫入HDFS中的磁盤
Spark
除了計算在內存中執行並在那裏存儲直到用戶積極保存它們以外,Spark處理的工做方式與Hadoop相似。最初,Spark從HDFS,S3或其餘文件存儲中的文件讀取到名爲SparkContext的已創建機制。除此以外,Spark建立了一個名爲RDD或彈性分佈式數據集的結構,它表示一組可並行操做的元素的不可變集合。
隨着RDD和相關操做的建立,Spark還建立了一個DAG或有向無環圖,以即可視化DAG中的操做順序和操做之間的關係。每一個DAG都有階段和步驟;經過這種方式,它與SQL中的解釋計劃相似。
您能夠對RDD執行轉換,中間步驟,操做或最終步驟。給定轉換的結果進入DAG,但不會保留到磁盤,但操做的結果會將內存中的全部數據保留到磁盤。
Spark中的一個新抽象是DataFrames,它是在Spark 2.0中做爲RDD的配套接口開發的。這二者很是類似,但DataFrames將數據組織成命名列,相似於Python的熊貓或R包。這使得它們比RDD更方便用戶,RDD沒有相似的一系列列級標題引用。 SparkSQL還容許用戶像關係數據存儲中的SQL表同樣查詢DataFrame。
發現Spark在內存中運行速度快100倍,在磁盤上運行速度快10倍。在十分之一的機器上,它也被用於對100 TB數據進行排序,比Hadoop MapReduce快3倍。特別發現Spark在機器學習應用中更快,例如樸素貝葉斯和k-means。
由處理速度衡量的Spark性能已經發現比Hadoop更優,緣由以下:
每次運行MapReduce任務的選定部分時,Spark都不會受到輸入輸出問題的束縛。事實證實,應用程序的速度要快得多
Spark的DAG能夠在步驟之間進行優化。 Hadoop在MapReduce步驟之間沒有任何週期性鏈接,這意味着在該級別不會發生性能調整。
可是,若是Spark與其餘共享服務在YARN上運行,則性能可能會下降並致使RAM開銷內存泄漏。出於這個緣由,若是用戶有批處理的用例,Hadoop被認爲是更高效的系統。
Spark和Hadoop均可以做爲開源Apache項目免費得到,這意味着您能夠以零安裝成本運行它。可是,重要的是要考慮整體擁有成本,其中包括維護,硬件和軟件購買以及僱用瞭解羣集管理的團隊。內部安裝的通常經驗法則是Hadoop須要更多的磁盤內存,而Spark須要更多的內存,這意味着設置Spark集羣可能會更加昂貴。此外,因爲Spark是較新的系統,所以它的專家更爲稀少,並且成本更高。另外一種選擇是使用供應商進行安裝,例如Cloudera for Hadoop或Spark for DataBricks,或使用AWS在雲中運行EMR / Mapreduce流程。
因爲Hadoop和Spark是串聯運行的,即便在配置爲在安裝Spark的狀況下運行的EMR實例上,也能夠將提取訂價比較分離出來。對於很是高級別的比較,假設您爲Hadoop選擇計算優化的EMR羣集,最小實例c4.large的成本爲每小時0.026美圓。 Spark最小的內存優化集羣每小時成本爲0.067美圓。所以,Spark每小時更昂貴,但對計算時間進行優化,相似的任務應該在Spark集羣上花費更少的時間。
Hadoop具備高度容錯性,由於它旨在跨多個節點複製數據。每一個文件都被分割成塊,並在許多機器上覆制無數次,以確保若是單臺機器停機,能夠從別處的其餘塊重建文件。
Spark的容錯主要是經過RDD操做來實現的。最初,靜態數據存儲在HDFS中,經過Hadoop的體系結構進行容錯。隨着RDD的創建,譜系也是如此,它記住了數據集是如何構建的,而且因爲它是不可變的,若是須要能夠從頭開始重建。跨Spark分區的數據也能夠基於DAG跨數據節點重建。數據在執行器節點之間複製,若是執行器和驅動程序之間的節點或通訊失敗,一般可能會損壞數據。
Spark和Hadoop均可以支持Kerberos身份驗證,但Hadoop對HDFS具備更加細化的安全控制。 Apache Sentry是一個用於執行細粒度元數據訪問的系統,是另外一個專門用於HDFS級別安全性的項目。
Spark的安全模型目前不多,但容許經過共享密鑰進行身份驗證。
Hadoop使用Mahout來處理數據。 Mahout包括集羣,分類和基於批處理的協做過濾,全部這些都在MapReduce之上運行。目前正在逐步推出支持Scala支持的DSL語言Samsara,容許用戶進行內存和代數操做,並容許用戶編寫本身的算法。
Spark有一個機器學習庫MLLib,用於內存迭代機器學習應用程序。它可用於Java,Scala,Python或R,包括分類和迴歸,以及經過超參數調整構建機器學習管道的能力。