每年,市場上都會出現種種不同的數據管理規模、類型與速度表現的分布式系統。在這些系統中,Spark和hadoop是獲得最大關注的兩個。然而該怎么判斷哪一款適合你?
如果想批處理流量數據,并將其導入HDFS或使用Spark Streaming是否合理?如果想要進行機器學習和預測建模,Mahout或MLLib會更好地滿足您的需求嗎?
為了增加混淆,Spark和Hadoop經常與位于HDFS,Hadoop文件系統中的Spark處理數據一起工作。但是,它們都是獨立個體,每一個體都有自己的優點和缺點以及特定的商業案例。
本文將從以下幾個角度對Spark和Hadoop進行對比:體系結構,性能,成本,安全性和機器學習。
什么是Hadoop?
Hadoop在2006年開始成為雅虎項目,隨后成為頂級的Apache開源項目。它是一種通用的分布式處理形式,具有多個組件:
HDFS(分布式文件系統),它將文件以Hadoop本機格式存儲,并在集群中并行化;
YARN,協調應用程序運行時的調度程序;
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集群可用作數據源,VPS租用 國內服務器,也可以與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 的云服務,VPS租用 國內服務器,可用于數據集成,數據管道等任務
1. 架構
首先,所有傳入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。
2. 性能