Hadoop進入寒冬期,崛起的會是Spark嗎?
Hadoop在大數(shù)據(jù)領(lǐng)域享有多年壟斷權(quán),隨著該領(lǐng)域開始出現(xiàn)新生力量,其統(tǒng)治地位正在逐漸下滑。年初的調(diào)查中,Hadoop被列為2018年大數(shù)據(jù)領(lǐng)域的“漸凍”趨勢之一,Gartner的調(diào)查也揭示了Hadoop使用量的下滑,不少人將Hadoop稱作“倒下的大象”,比如Lucidworks***執(zhí)行官Will Hayes。
如果Hadoop開始進入寒冬期,率先崛起的會是呼聲***的Spark嗎?

筆者曾經(jīng)看過一個非常有趣的比喻,Hadoop是***家大型包工隊,可以組織一大堆人合作(HDFS)搬磚蓋房(用MapReduce),但是速度比較慢。
Spark是另一家包工隊,雖然成立得晚一些,但是他們搬磚很快很靈活,可以實時交互地蓋房子,比Hadoop快得多。
Hadoop開始升級,指定調(diào)度專家YARN調(diào)度工人。Spark從多個倉庫搬磚(HDFS,Cassandra,S3,HBase),還允許不同專家如YARN/ MESOS對人員和任務(wù)進行調(diào)度。
當(dāng)然,他們兩家并不是水火不容。Spark經(jīng)常和Hadoop團隊合作,這讓問題變得更加復(fù)雜。不管怎么說,Spark和Hadoop都是兩個獨立的包工隊,都有著各自的優(yōu)缺點和特定的業(yè)務(wù)用例。
所以,***,哪一家會勝出呢?
本文將從這兩大系統(tǒng)的體系結(jié)構(gòu),性能,成本,安全性和機器學(xué)習(xí)能力等方面進行比較。
Hadoop是什么?
現(xiàn)在恐怕沒有人會問“Hadoop是什么?”這個問題了,因為它實在是太火了!Hadoop在2006年開始成為雅虎項目,隨后晉升為***Apache開源項目。它是一種通用的分布式系統(tǒng)基礎(chǔ)架構(gòu),具有多個組件:Hadoop分布式文件系統(tǒng)(HDFS),它將文件以Hadoop本機格式存儲并在集群中并行化; YARN,協(xié)調(diào)應(yīng)用程序運行時的調(diào)度程序; MapReduce,這是實際并行處理數(shù)據(jù)的算法。Hadoop使用Java編程語言構(gòu)建,其上的應(yīng)用程序也可以使用其他語言編寫。通過一個Thrift客戶端,用戶可以編寫MapReduce或者Python代碼。

除了這些基本組件外,Hadoop還包括Sqoop,它將關(guān)系數(shù)據(jù)移入HDFS; Hive,一種類似SQL的接口,允許用戶在HDFS上運行查詢; Mahout,機器學(xué)習(xí)。除了將HDFS用于文件存儲之外,Hadoop現(xiàn)在還可以配置使用S3 buckets或Azure blob作為輸入。
它可以通過Apache發(fā)行版開源,也可以通過Cloudera(規(guī)模和范圍***的Hadoop供應(yīng)商),MapR或HortonWorks等廠商提供。
Spark是什么?
Spark是一個較新的項目,最初于2012年誕生在加州大學(xué)伯克利分校的AMPLab。它也是一個***Apache項目,專注于在集群中并行處理數(shù)據(jù),***的區(qū)別在于它在內(nèi)存中運行。
類似于Hadoop讀取和寫入文件到HDFS的概念,Spark使用RDD(彈性分布式數(shù)據(jù)集)處理RAM中的數(shù)據(jù)。Spark以獨立模式運行,Hadoop集群可用作數(shù)據(jù)源,也可與Mesos一起運行。在后一種情況下,Mesos主站將取代Spark主站或YARN以進行調(diào)度。

Spark是圍繞Spark Core構(gòu)建的,Spark Core是驅(qū)動調(diào)度,優(yōu)化和RDD抽象的引擎,并將Spark連接到正確的文件系統(tǒng)(HDFS,S3,RDBM或Elasticsearch)。Spark Core上還運行了幾個庫,包括Spark SQL,允許用戶在分布式數(shù)據(jù)集上運行類似SQL的命令,用于機器學(xué)習(xí)的MLLib,用于解決圖形問題的GraphX以及允許輸入連續(xù)流式日志數(shù)據(jù)的Streaming。
Spark有幾個API。原始界面是用Scala編寫的,并且由于大量數(shù)據(jù)科學(xué)家的使用,還添加了Python和R接口。Java是編寫Spark作業(yè)的另一種選擇。
Databricks是由Spark創(chuàng)始人Matei Zaharia創(chuàng)立的公司,現(xiàn)在負責(zé)Spark開發(fā)并為客戶提供Spark分銷。
架構(gòu)對比
Hadoop
首先,所有傳入HDFS的文件都被分割成塊。根據(jù)配置的塊大小和復(fù)制因子,每個塊在集群中被復(fù)制指定的次數(shù)。該信息被傳遞給NameNode,它跟蹤集群中的所有內(nèi)容。NameNode將這些文件分配給多個數(shù)據(jù)節(jié)點,然后將這些文件寫入其中。在2012年被實施的高可用性允許NameNode故障轉(zhuǎn)移到備份節(jié)點上,以跟蹤集群中的所有文件。
MapReduce算法位于HDFS之上,由JobTracker組成。一旦應(yīng)用程序以其中一種語言編寫,Hadoop接受JobTracker,然后分配工作(可包括計算單詞和清理日志文件等內(nèi)容,以及在Hive倉庫數(shù)據(jù)集之上運行HiveQL查詢)到偵聽其他節(jié)點的TaskTracker。
YARN分配JobTracker加速并監(jiān)控它們的資源,以提高效率。然后將所有來自MapReduce階段的結(jié)果匯總并寫入HDFS中的磁盤之上。
Spark
Spark的計算過程在內(nèi)存中執(zhí)行并在內(nèi)存中存儲,直到用戶保存為止。除此之外,Spark處理工作的方式基本與Hadoop類似。最初,Spark從HDFS,S3或其他文件存儲系統(tǒng)讀取到名為SparkContext的程序執(zhí)行入口。除此之外,Spark創(chuàng)建了一個名為RDD(彈性分布式數(shù)據(jù)集)的結(jié)構(gòu),它表示一組可并行操作元素的不可變集合。
隨著RDD和相關(guān)操作的創(chuàng)建,Spark還創(chuàng)建了一個DAG(有向無環(huán)圖),以便可視化DAG中的操作順序和操作之間的關(guān)系。每個DAG都有確定的階段和步驟。
用戶可以在RDD上執(zhí)行轉(zhuǎn)換,中間操作或最終步驟。給定轉(zhuǎn)換的結(jié)果進入DAG,不會保留到磁盤,但每一步操作都會將內(nèi)存中的所有數(shù)據(jù)保留到磁盤。
Spark RDD頂部的一個新抽象是DataFrames,它是在Spark 2.0中作為RDD配套接口開發(fā)的。這兩者非常相似,但DataFrames將數(shù)據(jù)組織成命名列,類似于Python的pandas或R包。這使得它們比RDD更方便,RDD沒有類似的一系列列級標(biāo)題引用。SparkSQL還允許用戶像存儲關(guān)系數(shù)據(jù)的SQL表一樣查詢DataFrame。
性能
Spark在內(nèi)存中運行速度比Hadoop快100倍,在磁盤上運行速度快10倍。眾所周知,Spark在數(shù)量只有十分之一的機器上,對100TB數(shù)據(jù)進行排序的速度比Hadoop MapReduce快3倍。此外,Spark在機器學(xué)習(xí)應(yīng)用中的速度同樣更快,例如Naive Bayes和k-means。
由處理速度衡量的Spark性能之所以比Hadoop更優(yōu),原因如下:
- 每次運行MapReduce任務(wù)時,Spark都不會受到輸入輸出的限制。事實證明,應(yīng)用程序的速度要快得多。
- Spark的DAG可以在各個步驟之間進行優(yōu)化。Hadoop在MapReduce步驟之間沒有任何周期性連接,這意味著在該級別不會發(fā)生性能調(diào)整。
但是,如果Spark與其他共享服務(wù)在YARN上運行,則性能可能會降低并導(dǎo)致RAM開銷內(nèi)存泄漏。出于這個原因,如果用戶有批處理的訴求,Hadoop被認為是更高效的系統(tǒng)。
成本
Spark和Hadoop都可以作為開源Apache項目免費獲得,這意味著用戶都可以零成本安裝運行。但是,考慮總體擁有成本才是最重要的,比如維護、硬件和軟件購買,雇傭集群管理團隊的開銷。內(nèi)部安裝的一般經(jīng)驗法則是Hadoop需要更多的磁盤內(nèi)存,而Spark需要更多的RAM,這意味著設(shè)置Spark集群可能會更加昂貴。此外,由于Spark是較新的系統(tǒng),因此它的專家更為***,成本更高。另一種選擇是使用供應(yīng)商進行安裝,例如Cloudera for Hadoop或Spark for DataBricks,或使用AWS在云中運行EMR / Mapreduce。
由于Hadoop和Spark是串聯(lián)運行的,將各自的價格分離出來進行比較可能是困難的。對于高級別的比較,假設(shè)為Hadoop選擇計算優(yōu)化的EMR集群,最小實例c4.large的成本為每小時0.026美元。 Spark最小內(nèi)存優(yōu)化集群每小時成本為0.067美元。因此,Spark每小時更昂貴,但考慮到計算時間,類似的任務(wù)在Spark集群上花費的時間更少。
容錯和安全性
Hadoop具有高度容錯性,因為它旨在跨多個節(jié)點復(fù)制數(shù)據(jù)。每個文件都被分割成塊,并在許多機器上復(fù)制無數(shù)次,以確保如果單臺機器停機,可以從其他塊重建文件。
Spark的容錯主要是通過RDD操作來實現(xiàn)。最初,靜態(tài)數(shù)據(jù)存儲在HDFS中,通過Hadoop的體系結(jié)構(gòu)進行容錯。隨著RDD的建立,lineage也是如此,它記住了數(shù)據(jù)集是如何構(gòu)建的,由于它是不可變的,如果需要可以從頭開始重建。跨Spark分區(qū)的數(shù)據(jù)也可以基于DAG跨數(shù)據(jù)節(jié)點重建。數(shù)據(jù)在執(zhí)行器節(jié)點之間復(fù)制,如果執(zhí)行器和驅(qū)動程序之間的節(jié)點通信失敗,通常可能會損壞數(shù)據(jù)。
Spark和Hadoop都可以支持Kerberos身份驗證,但Hadoop對HDFS具有更加細化的安全控制。 Apache Sentry是一個用于執(zhí)行細粒度元數(shù)據(jù)訪問的系統(tǒng),是另一個專門用于HDFS級別安全性的項目。
Spark的安全模型目前很少,但允許通過共享密鑰進行身份驗證。
機器學(xué)習(xí)
Hadoop使用Mahout來處理數(shù)據(jù)。Mahout包括集群,分類和基于批處理的協(xié)作過濾,所有這些都在MapReduce之上運行。目前正在逐步推出支持Scala和DSL語言的Samsara(類似R的矢量數(shù)學(xué)環(huán)境),允許用戶進行內(nèi)存和代數(shù)操作,并允許用戶自己編寫算法。
Spark有一個機器學(xué)習(xí)庫叫MLLib,充分利用了Spark快速內(nèi)存計算,迭代效率高的優(yōu)勢開發(fā)機器學(xué)習(xí)應(yīng)用程序。它可用于Java,Scala,Python或R,包括分類和回歸,以及通過超參數(shù)調(diào)整構(gòu)建機器學(xué)習(xí)管道的能力。
總結(jié)
所以,到底是選Hadoop還是Spark呢?兩者都是Apache的***項目,經(jīng)常一起使用,并且有相似之處,但Spark并不是離不開Hadoop,目前已有超過20%的Spark獨立于Hadoop運行,并且這一比例還在增加。從性能、成本、高可用性、易用性、安全性和機器學(xué)習(xí)諸多方面參考,Spark都略勝一籌!
或許,Hadoop確實老了,大數(shù)據(jù)世界應(yīng)該出現(xiàn)更年輕的統(tǒng)治者。