spark為什么比hadoop的mr要快?


1.前言

Spark是基於內存的計算,而Hadoop是基於磁盤的計算;Spark是一種內存計算技術。

但是事實上,不光Spark是內存計算,Hadoop其實也是內存計算。

Spark和Hadoop的根本差異是多個任務之間的數據通信問題:Spark多個任務之間數據通信是基於內存,而Hadoop是基於磁盤。

Spark SQL比Hadoop Hive快,是有一定條件的,而且不是Spark SQL的引擎一定比Hive的引擎快,相反,Hive的HQL引擎還比Spark SQL的引擎更快。

2.內存計算技術

內存計算技術是指將數據持久化至內存RAM中進行加工處理的技術。Spark並不支持將數據持久化至內存中,我們通常所說的是spark的數據緩存技術,如將RDD數據緩存至內存,但並沒有實現持久化。緩存數據是可以擦除的,擦除后同樣是需要我們重新計算的。Spark的數據處理是在內存中進行的,這話並沒有錯,其實當前的所有操作系統的數據處理都是在內存中進行的。所以,這內存計算並不是Spark的特性。

Spark是允許我們利用緩存技術和LRU算法緩存數據的。Spark的所有運算並不是全部都在內存中,當shuffle發生的時候,數據同樣是需要寫入磁盤的。所以,Spark並不是基於內存的技術,而是使用了緩存機制的技術。

3. 那Spark主要快在哪里呢?

Spark最引以為豪的就是官網介紹的經典案例。這個案例是邏輯回歸機器學習算法,該算法主要特征是對同一份數據的反復迭代運算。Spark是內存緩存,所以數據只加載一次,Hadoop則需要反復加載。實際情況下,Spark通常比Hadoop快十倍以內是合理的。主要快在哪里呢?

其實,關鍵還是在於Spark 本身快。

Spark比Hadoop快的主要原因有:

1.消除了冗余的HDFS讀寫
Hadoop每次shuffle操作后,必須寫到磁盤,而Spark在shuffle后不一定落盤,可以cache到內存中,以便迭代時使用。如果操作復雜,很多的shufle操作,那么Hadoop的讀寫IO時間會大大增加。

2.消除了冗余的MapReduce階段
Hadoop的shuffle操作一定連着完整的MapReduce操作,冗余繁瑣。而Spark基於RDD提供了豐富的算子操作,且reduce操作產生shuffle數據,可以緩存在內存中。

3.JVM的優化
Spark Task的啟動時間快。Spark采用fork線程的方式,Spark每次MapReduce操作是基於線程的,只在啟動。而Hadoop采用創建新的進程的方式,啟動一個Task便會啟動一次JVM。

Spark的Executor是啟動一次JVM,內存的Task操作是在線程池內線程復用的。

每次啟動JVM的時間可能就需要幾秒甚至十幾秒,那么當Task多了,這個時間Hadoop不知道比Spark慢了多少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM