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開始進(jìn)入寒冬期,率先崛起的會(huì)是呼聲最高的Spark嗎?
筆者曾經(jīng)看過一個(gè)非常有趣的比喻,Hadoop是第一家大型包工隊(duì),可以組織一大堆人合作(HDFS)搬磚蓋房(用MapReduce),但是速度比較慢。
Spark是另一家包工隊(duì),雖然成立得晚一些,但是他們搬磚很快很靈活,可以實(shí)時(shí)交互地蓋房子,比Hadoop快得多。
Hadoop開始升級(jí),指定調(diào)度專家YARN調(diào)度工人。Spark從多個(gè)倉庫搬磚(HDFS,Cassandra,S3,HBase),還允許不同專家如YARN/ MESOS對(duì)人員和任務(wù)進(jìn)行調(diào)度。
當(dāng)然,他們兩家并不是水火不容。Spark經(jīng)常和Hadoop團(tuán)隊(duì)合作,這讓問題變得更加復(fù)雜。不管怎么說,Spark和Hadoop都是兩個(gè)獨(dú)立的包工隊(duì),都有著各自的優(yōu)缺點(diǎn)和特定的業(yè)務(wù)用例。
所以,最后,哪一家會(huì)勝出呢?
本文將從這兩大系統(tǒng)的體系結(jié)構(gòu),性能,成本,安全性和機(jī)器學(xué)習(xí)能力等方面進(jìn)行比較。
Hadoop是什么?
現(xiàn)在恐怕沒有人會(huì)問“Hadoop是什么?”這個(gè)問題了,因?yàn)樗鼘?shí)在是太火了!Hadoop在2006年開始成為雅虎項(xiàng)目,隨后晉升為頂級(jí)Apache開源項(xiàng)目。它是一種通用的分布式系統(tǒng)基礎(chǔ)架構(gòu),具有多個(gè)組件:Hadoop分布式文件系統(tǒng)(HDFS),它將文件以Hadoop本機(jī)格式存儲(chǔ)并在集群中并行化; YARN,協(xié)調(diào)應(yīng)用程序運(yùn)行時(shí)的調(diào)度程序; MapReduce,這是實(shí)際并行處理數(shù)據(jù)的算法。Hadoop使用Java編程語言構(gòu)建,其上的應(yīng)用程序也可以使用其他語言編寫。通過一個(gè)Thrift客戶端,用戶可以編寫MapReduce或者Python代碼。
除了這些基本組件外,Hadoop還包括Sqoop,它將關(guān)系數(shù)據(jù)移入HDFS; Hive,一種類似SQL的接口,允許用戶在HDFS上運(yùn)行查詢; Mahout,機(jī)器學(xué)習(xí)。除了將HDFS用于文件存儲(chǔ)之外,Hadoop現(xiàn)在還可以配置使用S3 buckets或Azure blob作為輸入。
它可以通過Apache發(fā)行版開源,也可以通過Cloudera(規(guī)模和范圍最大的Hadoop供應(yīng)商),MapR或HortonWorks等廠商提供。
Spark是什么?
Spark是一個(gè)較新的項(xiàng)目,最初于2012年誕生在加州大學(xué)伯克利分校的AMPLab.它也是一個(gè)頂級(jí)Apache項(xiàng)目,專注于在集群中并行處理數(shù)據(jù),最大的區(qū)別在于它在內(nèi)存中運(yùn)行。
類似于Hadoop讀取和寫入文件到HDFS的概念,Spark使用RDD(彈性分布式數(shù)據(jù)集)處理RAM中的數(shù)據(jù)。Spark以獨(dú)立模式運(yùn)行,Hadoop集群可用作數(shù)據(jù)源,也可與Mesos一起運(yùn)行。在后一種情況下,Mesos主站將取代Spark主站或YARN以進(jìn)行調(diào)度。
Spark是圍繞Spark Core構(gòu)建的,Spark Core是驅(qū)動(dòng)調(diào)度,優(yōu)化和RDD抽象的引擎,并將Spark連接到正確的文件系統(tǒng)(HDFS,S3,RDBM或Elasticsearch)。Spark Core上還運(yùn)行了幾個(gè)庫,包括Spark SQL,允許用戶在分布式數(shù)據(jù)集上運(yùn)行類似SQL的命令,用于機(jī)器學(xué)習(xí)的MLLib,用于解決圖形問題的GraphX以及允許輸入連續(xù)流式日志數(shù)據(jù)的Streaming. Spark有幾個(gè)API.原始界面是用Scala編寫的,并且由于大量數(shù)據(jù)科學(xué)家的使用,還添加了Python和R接口。Java是編寫Spark作業(yè)的另一種選擇。
Databricks是由Spark創(chuàng)始人Matei Zaharia創(chuàng)立的公司,現(xiàn)在負(fù)責(zé)Spark開發(fā)并為客戶提供Spark分銷。
架構(gòu)對(duì)比
Hadoop
首先,所有傳入HDFS的文件都被分割成塊。根據(jù)配置的塊大小和復(fù)制因子,每個(gè)塊在集群中被復(fù)制指定的次數(shù)。該信息被傳遞給NameNode,它跟蹤集群中的所有內(nèi)容。NameNode將這些文件分配給多個(gè)數(shù)據(jù)節(jié)點(diǎn),然后將這些文件寫入其中。在2012年被實(shí)施的高可用性允許NameNode故障轉(zhuǎn)移到備份節(jié)點(diǎn)上,以跟蹤集群中的所有文件。
MapReduce算法位于HDFS之上,由JobTracker組成。一旦應(yīng)用程序以其中一種語言編寫,Hadoop接受JobTracker,然后分配工作(可包括計(jì)算單詞和清理日志文件等內(nèi)容,以及在Hive倉庫數(shù)據(jù)集之上運(yùn)行HiveQL查詢)到偵聽其他節(jié)點(diǎn)的TaskTracker. YARN分配JobTracker加速并監(jiān)控它們的資源,以提高效率。然后將所有來自MapReduce階段的結(jié)果匯總并寫入HDFS中的磁盤之上。