大家都在說Spark正在使用內存,因爲它比Hadoop快得多。Apache Spark與Hadoop方法有何不同?
我從Spark文檔中不能理解真正的區別。
- Spark在何處將數據存儲在內存中,而Hadoop卻沒有?
- 如果數據對於內存來說太大會發生什麼?在這種情況下,它與Hadoop有多相似?
大家都在說Spark正在使用內存,因爲它比Hadoop快得多。Apache Spark與Hadoop方法有何不同?
我從Spark文檔中不能理解真正的區別。
Spark tries to keep things in memory, whereas MapReduce keeps shuffling things in and out of disk.
主存儲器中的平均中間輸出存儲器,其中hadoop在二級存儲器中存儲中間結果。 MapReduce插入障礙,並且將事情寫入磁盤並將其讀回需要很長時間。因此MapReduce可能會很慢並且很費力。消除這一限制使得Spark數量級更快。對於像Hive這樣的SQL引擎,通常需要一系列MapReduce操作,這需要大量的I/O活動。在磁盤上,關閉磁盤,關閉磁盤。當在Spark上運行類似的操作時,Spark可以將內容保存在內存中,而無需I/O,因此您可以快速操作相同的數據。這導致了性能的顯着提升,這意味着Spark絕對會讓我們至少進入互動類。爲了記錄,MapReduce對磁盤進行所有記錄都有一些好處,因爲將所有內容記錄到磁盤都允許在發生故障後重新啓動。如果你正在運行一個多小時的工作,你不想從頭開始。對於以秒或分鐘運行的Spark上的應用程序,重新啓動顯然不是一個問題。
It’s easier to develop for Spark
。就你如何給它指導緊縮數據而言,Spark更強大和更有表現力。 Spark具有像MapReduce這樣的Map和Reduce功能,但它添加了諸如Filter,Join和Group-by等其他功能,因此Spark開發起來更容易。
Spark also adds libraries for doing things like machine learning, streaming, graph programming and SQL
在Hadoop中的MapReduce的輸入數據在磁盤上,您執行地圖和減少,並把結果返回到磁盤上。 Apache Spark允許更復雜的管道。也許你需要地圖兩次,但不需要減少。也許你需要減少然後地圖然後再次減少。 Spark API可以非常直觀地通過幾十個步驟設置非常複雜的流水線。
你也可以用MapReduce實現同樣的複雜管道。但是,然後在每個階段之間寫入磁盤並將其讀回。 Spark儘可能避免這種開銷。保持內存中的數據是一種方法。但即使這樣也不是必要的。一個階段可以將計算的數據傳遞到下一個階段,而無需將整個數據存儲在任何地方。
這不是MapReduce的選項,因爲一個MapReduce不知道下一個。它必須在下一個可以開始之前完全完成。這就是Spark對於複雜計算更高效的原因。
API,尤其是在Scala中,也非常乾淨。經典的MapReduce通常是單行的。這是非常強大的使用。
要完成此答案:Spark使用名爲「Resilient Distributed Dataset」的自定義數據結構,該結構可以顯式存儲在內存中。如果一個RDD不適合內存,它就會「溢出」以優雅的方式進行驅動(即無法放入內存的內容會傳送到磁盤)。 Spark最初是爲迭代計算而設計的,該計算可能會發揮(可能)很長的操作流程。 Hadoop必須使用諸如Tez之類的工具來編排這樣的流水線,而不必前後訪問磁盤。 – Bacon
如果數據對於內存來說太大會發生什麼?在這種情況下,它與Hadoop有多相似? – member555
Spark在其分佈式工作人員的內存中緩存部分結果(中間輸出不是整個數據),從而可以實現更快/更低延遲的計算。如果在這種情況下,中間數據不適合存儲在內存中,則會在磁盤上存儲中間數據。 –
Spark可讓您在內存中緩存中間結果。如果您有經常使用的數據結構(例如查找表或機器學習算法中的分數矩陣),緩存可以顯着提高性能。緩存也可能引入問題,因爲它通常需要大量內存 –