第四章 Spark到底比MapReduce快在哪

為什麼spark不在內存跑,也可以比mr快,對於剛入門的新手來說,或者大家比較熟知的,都知道spark是基於內存計算的,但是怎麼會有這樣的問題出現呢?


一、背景

Spark是基於內存的計算,而Hadoop是基於磁盤的計算;Spark是一種內存計算技術。但是事實上,不光Spark是內存計算,Hadoop其實也是內存計算。Spark和Hadoop的根本差異是多個任務之間的數據通信問題:Spark多個任務之間數據通信是基於內存,而Hadoop是基於磁盤。

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


二、內存計算技術

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

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


三、那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慢了多少。



分享到:


相關文章: