1. 程式人生 > >spark為什麼比hadoop的mr要快?

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