好程式設計師分享ApacheSpark常見的三大誤解
好程式設計師 分享ApacheSpark常見的三大誤解
誤解一: Spark是一種記憶體技術
大家對 Spark最大的誤解就是其是一種記憶體技術(in-memorytechnology)。其實不是這樣的!沒有一個Spark開發者正式說明這個,這是對Spark計算過程的誤解。
我們從頭開始說明。什麼樣的技術才能稱得上是記憶體技術?在我看來,就是允許你將資料持久化( persist)在RAM中並有效處理的技術。然而Spark並不具備將資料資料儲存在RAM的選項,雖然我們都知道可以將資料儲存在HDFS,Tachyon,HBase,Cassandra等系統中,但是不管是將資料儲存在磁碟還是記憶體,都沒有內建的持久化程式碼(nativepersistencecode)。它所能做的事就是快取(cache)資料,而這個並不是資料持久化(persist)。已經快取的資料可以很容易地被刪除,並且在後期需要時重新計算。
但是即使有這些資訊,仍然有些人還是會認為 Spark就是一種基於記憶體的技術,因為Spark是在記憶體中處理資料的。這當然是對的,因為我們無法使用其他方式來處理資料。作業系統中的API都只能讓你把資料從塊裝置載入到記憶體,然後計算完的結果再儲存到塊裝置中。我們無法直接在HDD裝置上計算;所以現代系統中的所有處理基本上都是在記憶體中進行的。
雖然 Spark允許我們使用記憶體快取以及LRU替換規則,但是你想想現在的RDBMS系統,比如Oracle和PostgreSQL,你認為它們是如何處理資料的?它們使用共享記憶體段(sharedmemorysegment)作為tablepages的儲存池,所有的資料讀取以及寫入都是透過這個池的,這個儲存池同樣支援LRU替換規則;所有現代的資料庫同樣可以透過LRU策略來滿足大多數需求。但是為什麼我們並沒有把Oracle和PostgreSQL稱作是基於記憶體的解決方案呢?你再想想LinuxIO,你知道嗎?所有的IO操作也是會用到LRU快取技術的。
你現在還認為 Spark在記憶體中處理所有的操作嗎?你可能要失望了。比如Spark的核心:shuffle,其就是將資料寫入到磁碟的。如果你再SparkSQL中使用到groupby語句,或者你將RDD轉換成PairRDD並且在其之上進行一些聚合操作,這時候你強制讓Spark根據key的雜湊值將資料分發到所有的分割槽中。shuffle的處理包括兩個階段:map和reduce。Map操作僅僅根據key計算其雜湊值,並將資料存放到本地檔案系統的不同檔案中,檔案的個數通常是reduce端分割槽的個數;Reduce端會從Map端拉取資料,並將這些資料合併到新的分割槽中。所有如果你的RDD有M個分割槽,然後你將其轉換成N個分割槽的PairRDD,那麼在shuffle階段將會建立M*N個檔案!雖然目前有些最佳化策略可以減少建立檔案的個數,但這仍然無法改變每次進行shuffle操作的時候你需要將資料先寫入到磁碟的事實!
所以結論是: Spark並不是基於記憶體的技術!它其實是一種可以有效地使用記憶體LRU策略的技術。
誤解二: Spark要比Hadoop快10x-100x
這個圖片是分別使用 Spark和Hadoop執行邏輯迴歸(LogisticRegression)機器學習演算法的執行時間比較,從上圖可以看出Spark的執行速度明顯比Hadoop快上百倍!但是實際上是這樣的嗎?大多數機器學習演算法的核心部分是什麼?其實就是對同一份資料集進行相同的迭代計算,而這個地方正是Spark的LRU演算法所驕傲的地方。當你多次掃描相同的資料集時,你只需要在首次訪問時載入它到記憶體,後面的訪問直接從記憶體中獲取即可。這個功能非常的棒!但是很遺憾的是,官方在使用Hadoop執行邏輯迴歸的時候很大可能沒有使用到HDFS的快取功能,而是採用極端的情況。如果在Hadoop中執行邏輯迴歸的時候採用到HDFS快取功能,其表現很可能只會比Spark差3x-4x,而不是上圖所展示的一樣。
根據經驗,企業所做出的基準測試報告一般都是不可信的!一般獨立的第三方基準測試報告是比較可信的,比如: TPC-H。他們的基準測試報告一般會覆蓋絕大部分場景,以便真實地展示結果。
一般來說, Spark比MapReduce執行速度快的原因主要有以下幾點:
task啟動時間比較快,Spark是fork出執行緒;而MR是啟動一個新的程式;
更快的 shuffles,Spark只有在shuffle的時候才會將資料放在磁碟,而MR卻不是。
更快的工作流:典型的 MR工作流是由很多MR作業組成的,他們之間的資料互動需要把資料持久化到磁碟才可以;而Spark支援DAG以及pipelining,在沒有遇到shuffle完全可以不把資料快取到磁碟。
快取:雖然目前 HDFS也支援快取,但是一般來說,Spark的快取功能更加高效,特別是在SparkSQL中,我們可以將資料以列式的形式儲存在記憶體中。
所有的這些原因才使得 Spark相比Hadoop擁有更好的效能表現;在比較短的作業確實能快上100倍,但是在真實的生產環境下,一般只會快2.5x~3x!
誤解三: Spark在資料處理方面引入了全新的技術
事實上, Spark並沒有引入任何革命性的新技術!其擅長的LRU快取策略和資料的pipelining處理其實在MPP資料庫中早就存在!Spark做出重要的一步是使用開源的方式來實現它!並且企業可以免費地使用它。大部分企業勢必會選擇開源的Spark技術,而不是付費的MPP技術
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2642128/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 好程式設計師分享JavaScript中8個常見的陷阱程式設計師JavaScript
- 好程式設計師分享JavaScript幾個最常見的錯誤程式設計師JavaScript
- 好程式設計師Java教程分享XML常見面試題程式設計師JavaXML面試題
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- 好程式設計師分享javascript中的常見的相容寫法程式設計師JavaScript
- 好程式設計師web前端教程分享Jquery常見面試題程式設計師Web前端jQuery面試題
- 好程式設計師Java教程分享JavaScript常見面試題五程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題四程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題三程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題二程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題一程式設計師JavaScript面試題
- 好程式設計師Java教程分享:Java工程師常見面試題程式設計師Java工程師面試題
- 好程式設計師Python教程分享常見的Python面試題程式設計師Python面試題
- 好程式設計師Java分享Java語言中的常見的跳脫字元程式設計師Java字元
- Python程式設計師的常見錯誤Python程式設計師
- 好程式設計師Java培訓分享Java效能常見命令有哪些程式設計師Java
- 好程式設計師Python教程分享Python常見面試問題程式設計師Python面試
- 好程式設計師Java教程分享Java面試常見技術難題程式設計師Java面試
- 好程式設計師web前端教程分享HTML/CSS部分常見面試題程式設計師Web前端HTMLCSS面試題
- 好程式設計師Python培訓分享Python程式設計中常見的異常處理程式設計師Python
- 好程式設計師web前端培訓分享小白學web常見的問題程式設計師Web前端
- 好程式設計師Java教程分享Java多執行緒常見面試題程式設計師Java執行緒面試題
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- Web程式設計師常見的5個錯誤及解決方案Web程式設計師
- 美女程式設計師分享資料庫常見17個使用誤區 - Jaana程式設計師資料庫
- Python程式設計師的10個常見錯誤Python程式設計師
- Mark Lutz:Python程式設計師的常見錯誤Python程式設計師
- 好程式設計師web前端分享用JavaScript實現的5個常見函式程式設計師Web前端JavaScript函式
- 好程式設計師分享javascript中陣列化的一般見解程式設計師JavaScript陣列
- 好程式設計師分享Java常見面試題Tomcat最佳化經驗程式設計師Java面試題Tomcat
- 好程式設計師web前端分享HTML5常見面試題集錦五程式設計師Web前端HTML面試題
- 好程式設計師web前端分享HTML5常見面試題集錦四程式設計師Web前端HTML面試題
- 好程式設計師web前端分享HTML5常見面試題集錦三程式設計師Web前端HTML面試題
- 好程式設計師web前端分享HTML5常見面試題集錦二程式設計師Web前端HTML面試題
- 好程式設計師web前端分享常見html5語義化標籤程式設計師Web前端HTML
- 好程式設計師web前端分享JavaScript中常見的反模式程式設計師Web前端JavaScript模式
- 好程式設計師雲端計算培訓分享Linux Shell常見命令總結大全程式設計師Linux