每年,市場(chǎng)上都會(huì)出現(xiàn)種種不同的數(shù)據(jù)管理規(guī)模、類(lèi)型與速度表現(xiàn)的分布式系統(tǒng)。在這些系統(tǒng)中,Spark和hadoop是獲得最大關(guān)注的兩個(gè)。然而該怎么判斷哪一款適合你?
如果想批處理流量數(shù)據(jù),并將其導(dǎo)入HDFS或使用Spark Streaming是否合理?如果想要進(jìn)行機(jī)器學(xué)習(xí)和預(yù)測(cè)建模,Mahout或MLLib會(huì)更好地滿(mǎn)足您的需求嗎?
為了增加混淆,Spark和Hadoop經(jīng)常與位于HDFS,Hadoop文件系統(tǒng)中的Spark處理數(shù)據(jù)一起工作。但是,它們都是獨(dú)立個(gè)體,每一個(gè)體都有自己的優(yōu)點(diǎn)和缺點(diǎn)以及特定的商業(yè)案例。
本文將從以下幾個(gè)角度對(duì)Spark和Hadoop進(jìn)行對(duì)比:體系結(jié)構(gòu),性能,成本,安全性和機(jī)器學(xué)習(xí)。
什么是Hadoop?
Hadoop在2006年開(kāi)始成為雅虎項(xiàng)目,隨后成為頂級(jí)的Apache開(kāi)源項(xiàng)目。它是一種通用的分布式處理形式,具有多個(gè)組件:
HDFS(分布式文件系統(tǒng)),它將文件以Hadoop本機(jī)格式存儲(chǔ),并在集群中并行化;
YARN,協(xié)調(diào)應(yīng)用程序運(yùn)行時(shí)的調(diào)度程序;
MapReduce,實(shí)際并行處理數(shù)據(jù)的算法。
Hadoop使用Java搭建,可通過(guò)多種編程語(yǔ)言訪(fǎng)問(wèn),用于通過(guò)Thrift客戶(hù)端編寫(xiě)MapReduce代碼(包括Python)。
除了這些基本組件外,Hadoop還包括:
Sqoop,它將關(guān)系數(shù)據(jù)移入HDFS;
Hive,一種類(lèi)似SQL的接口,允許用戶(hù)在HDFS上運(yùn)行查詢(xún);
Mahout,機(jī)器學(xué)習(xí)。
除了將HDFS用于文件存儲(chǔ)之外,Hadoop現(xiàn)在還可以配置為使用S3存儲(chǔ)桶或Azure blob作為輸入。
它可以通過(guò)Apache發(fā)行版開(kāi)源,也可以通過(guò)Cloudera(規(guī)模和范圍最大的Hadoop供應(yīng)商),MapR或HortonWorks等廠商提供。
什么是Spark?
Spark是一個(gè)較新的項(xiàng)目,最初于2012年在加州大學(xué)伯克利分校的AMPLab開(kāi)發(fā)。它也是一個(gè)頂級(jí)Apache項(xiàng)目,專(zhuān)注于在群集中并行處理數(shù)據(jù),但最大的區(qū)別在于它在內(nèi)存中運(yùn)行。
鑒于Hadoop讀取和寫(xiě)入文件到HDFS,Spark使用稱(chēng)為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搭建的,Spark Core是驅(qū)動(dòng)調(diào)度,優(yōu)化和RDD抽象的引擎,并將Spark連接到正確的文件系統(tǒng)(HDFS,S3,RDBM或Elasticsearch)。有幾個(gè)庫(kù)在Spark Core上運(yùn)行,包括Spark SQL,它允許在分布式數(shù)據(jù)集上運(yùn)行類(lèi)似SQL的命令,用于機(jī)器學(xué)習(xí)的MLLib,用于圖形問(wèn)題的GraphX以及允許連續(xù)流式傳輸?shù)牧魇絺鬏斢涗洈?shù)據(jù)。
Spark有幾個(gè)API。原始界面是用Scala編寫(xiě)的,基于數(shù)據(jù)科學(xué)家的大量使用,還添加了Python和R端點(diǎn)。 Java是編寫(xiě)Spark作業(yè)的另一種選擇。
Databricks由也Spark創(chuàng)始人Matei Zaharia創(chuàng)建的,致力于提供基于 Spark 的云服務(wù),可用于數(shù)據(jù)集成,數(shù)據(jù)管道等任務(wù)
1. 架構(gòu)
Hadoop
首先,所有傳入HDFS的文件都被分割成塊。根據(jù)配置的塊大小和復(fù)制因子,每個(gè)塊在整個(gè)群集中被復(fù)制指定的次數(shù)。該信息被傳遞給NameNode,它跟蹤整個(gè)集群中的所有內(nèi)容。 NameNode將這些文件分配給一些數(shù)據(jù)節(jié)點(diǎn),然后將這些文件寫(xiě)入其中。 2012年實(shí)施高可用性,允許NameNode故障轉(zhuǎn)移到備份節(jié)點(diǎn)上,以跟蹤群集中的所有文件。
MapReduce算法位于HDFS之上,由JobTracker組成。一旦應(yīng)用程序以其中一種語(yǔ)言編寫(xiě),Hadoop接受JobTracker,然后分配工作(可包括計(jì)算單詞和清理日志文件的任何內(nèi)容),以便在存儲(chǔ)在Hive倉(cāng)庫(kù)中的數(shù)據(jù)之上運(yùn)行HiveQL查詢(xún))到偵聽(tīng)其他節(jié)點(diǎn)的TaskTracker。
YARN分配JobTracker加速并監(jiān)控它們的資源,以提高效率。然后將所有來(lái)自MapReduce階段的結(jié)果匯總并寫(xiě)入HDFS中的磁盤(pán)。
Spark
除了計(jì)算在內(nèi)存中執(zhí)行并在那里存儲(chǔ)直到用戶(hù)積極保存它們之外,Spark處理的工作方式與Hadoop類(lèi)似。最初,Spark從HDFS,S3或其他文件存儲(chǔ)中的文件讀取到名為SparkContext的已建立機(jī)制。除此之外,Spark創(chuàng)建了一個(gè)名為RDD或彈性分布式數(shù)據(jù)集的結(jié)構(gòu),它表示一組可并行操作的元素的不可變集合。
隨著RDD和相關(guān)操作的創(chuàng)建,Spark還創(chuàng)建了一個(gè)DAG或有向無(wú)環(huán)圖,以便可視化DAG中的操作順序和操作之間的關(guān)系。每個(gè)DAG都有階段和步驟;通過(guò)這種方式,它與SQL中的解釋計(jì)劃類(lèi)似。
您可以對(duì)RDD執(zhí)行轉(zhuǎn)換,中間步驟,操作或最終步驟。給定轉(zhuǎn)換的結(jié)果進(jìn)入DAG,但不會(huì)保留到磁盤(pán),但操作的結(jié)果會(huì)將內(nèi)存中的所有數(shù)據(jù)保留到磁盤(pán)。
Spark中的一個(gè)新抽象是DataFrames,它是在Spark 2.0中作為RDD的配套接口開(kāi)發(fā)的。這兩者非常相似,但DataFrames將數(shù)據(jù)組織成命名列,類(lèi)似于Python的熊貓或R包。這使得它們比RDD更方便用戶(hù),RDD沒(méi)有類(lèi)似的一系列列級(jí)標(biāo)題引用。 SparkSQL還允許用戶(hù)像關(guān)系數(shù)據(jù)存儲(chǔ)中的SQL表一樣查詢(xún)DataFrame。
2. 性能
發(fā)現(xiàn)Spark在內(nèi)存中運(yùn)行速度快100倍,在磁盤(pán)上運(yùn)行速度快10倍。在十分之一的機(jī)器上,它也被用于對(duì)100 TB數(shù)據(jù)進(jìn)行排序,比Hadoop MapReduce快3倍。特別發(fā)現(xiàn)Spark在機(jī)器學(xué)習(xí)應(yīng)用中更快,例如樸素貝葉斯和k-means。
由處理速度衡量的Spark性能已經(jīng)發(fā)現(xiàn)比Hadoop更優(yōu),原因如下:
每次運(yùn)行MapReduce任務(wù)的選定部分時(shí),Spark都不會(huì)受到輸入輸出問(wèn)題的束縛。事實(shí)證明,應(yīng)用程序的速度要快得多
Spark的DAG可以在步驟之間進(jìn)行優(yōu)化。 Hadoop在MapReduce步驟之間沒(méi)有任何周期性連接,這意味著在該級(jí)別不會(huì)發(fā)生性能調(diào)整。
但是,如果Spark與其他共享服務(wù)在YARN上運(yùn)行,則性能可能會(huì)降低并導(dǎo)致RAM開(kāi)銷(xiāo)內(nèi)存泄漏。出于這個(gè)原因,如果用戶(hù)有批處理的用例,Hadoop被認(rèn)為是更高效的系統(tǒng)。
3. 成本
Spark和Hadoop都可以作為開(kāi)源Apache項(xiàng)目免費(fèi)獲得,這意味著您可以以零安裝成本運(yùn)行它。但是,重要的是要考慮總體擁有成本,其中包括維護(hù),硬件和軟件購(gòu)買(mǎi)以及雇用了解群集管理的團(tuán)隊(duì)。內(nèi)部安裝的一般經(jīng)驗(yàn)法則是Hadoop需要更多的磁盤(pán)內(nèi)存,而Spark需要更多的內(nèi)存,這意味著設(shè)置Spark集群可能會(huì)更加昂貴。此外,由于Spark是較新的系統(tǒng),因此它的專(zhuān)家更為稀少,而且成本更高。另一種選擇是使用供應(yīng)商進(jìn)行安裝,例如Cloudera for Hadoop或Spark for DataBricks,或使用AWS在云中運(yùn)行EMR / Mapreduce流程。
由于Hadoop和Spark是串聯(lián)運(yùn)行的,即使在配置為在安裝Spark的情況下運(yùn)行的EMR實(shí)例上,也可以將提取定價(jià)比較分離出來(lái)。對(duì)于非常高級(jí)別的比較,假設(shè)您為Hadoop選擇計(jì)算優(yōu)化的EMR群集,最小實(shí)例c4.large的成本為每小時(shí)0.026美元。 Spark最小的內(nèi)存優(yōu)化集群每小時(shí)成本為0.067美元。因此,Spark每小時(shí)更昂貴,但對(duì)計(jì)算時(shí)間進(jìn)行優(yōu)化,類(lèi)似的任務(wù)應(yīng)該在Spark集群上花費(fèi)更少的時(shí)間。
4. 安全性
Hadoop具有高度容錯(cuò)性,因?yàn)樗荚诳缍鄠€(gè)節(jié)點(diǎn)復(fù)制數(shù)據(jù)。每個(gè)文件都被分割成塊,并在許多機(jī)器上復(fù)制無(wú)數(shù)次,以確保如果單臺(tái)機(jī)器停機(jī),可以從別處的其他塊重建文件。
Spark的容錯(cuò)主要是通過(guò)RDD操作來(lái)實(shí)現(xiàn)的。最初,靜態(tài)數(shù)據(jù)存儲(chǔ)在HDFS中,通過(guò)Hadoop的體系結(jié)構(gòu)進(jìn)行容錯(cuò)。隨著RDD的建立,譜系也是如此,它記住了數(shù)據(jù)集是如何構(gòu)建的,并且由于它是不可變的,如果需要可以從頭開(kāi)始重建。跨Spark分區(qū)的數(shù)據(jù)也可以基于DAG跨數(shù)據(jù)節(jié)點(diǎn)重建。數(shù)據(jù)在執(zhí)行器節(jié)點(diǎn)之間復(fù)制,如果執(zhí)行器和驅(qū)動(dòng)程序之間的節(jié)點(diǎn)或通信失敗,通??赡軙?huì)損壞數(shù)據(jù)。
Spark和Hadoop都可以支持Kerberos身份驗(yàn)證,但Hadoop對(duì)HDFS具有更加細(xì)化的安全控制。 Apache Sentry是一個(gè)用于執(zhí)行細(xì)粒度元數(shù)據(jù)訪(fǎng)問(wèn)的系統(tǒng),是另一個(gè)專(zhuān)門(mén)用于HDFS級(jí)別安全性的項(xiàng)目。
Spark的安全模型目前很少,但允許通過(guò)共享密鑰進(jìn)行身份驗(yàn)證。
5. 機(jī)器學(xué)習(xí)
Hadoop使用Mahout來(lái)處理數(shù)據(jù)。 Mahout包括集群,分類(lèi)和基于批處理的協(xié)作過(guò)濾,所有這些都在MapReduce之上運(yùn)行。目前正在逐步推出支持Scala支持的DSL語(yǔ)言Samsara,允許用戶(hù)進(jìn)行內(nèi)存和代數(shù)操作,并允許用戶(hù)編寫(xiě)自己的算法。
Spark有一個(gè)機(jī)器學(xué)習(xí)庫(kù)MLLib,用于內(nèi)存迭代機(jī)器學(xué)習(xí)應(yīng)用程序。它可用于Java,Scala,Python或R,包括分類(lèi)和回歸,以及通過(guò)超參數(shù)調(diào)整構(gòu)建機(jī)器學(xué)習(xí)管道的能力。
總結(jié)
那么它是Hadoop還是Spark?這些系統(tǒng)是目前市場(chǎng)上處理數(shù)據(jù)最重要的兩個(gè)分布式系統(tǒng)。 Hadoop主要用于使用MapReduce范例的大規(guī)模磁盤(pán)操作,而Spark則是一種更靈活,但成本更高的內(nèi)存處理架構(gòu)。兩者都是Apache的頂級(jí)項(xiàng)目,經(jīng)常一起使用,并且有相似之處,但在決定使用它們時(shí),了解每個(gè)項(xiàng)目的特征是非常重要的。
評(píng)論
查看更多