Spark的誤解-不只spark是內存計算,hadoop也是內存計算

       市面上有一些初學者的誤解,他們拿spark和hadoop比較時就會說,Spark是內存計算,內存計算是spark的特性。請問在計算機領域,mysql,redis,ssh框架等等他們不是內存計算嗎?依據馮諾依曼體系結構,有什麼技術的程序不是在內存中運行,須要數據從硬盤中拉取,而後供cpu進行執行?全部說sprk的特色是內存計算至關於什麼都沒有說。那麼spark的真正特色是什麼?拋開spark的執行模型的方式,它的特色無非就是多個任務之間數據通訊不須要藉助硬盤而是經過內存,大大提升了程序的執行效率。而hadoop因爲自己的模型特色,多個任務之間數據通訊是必須藉助硬盤落地的。那麼spark的特色就是數據交互不會走硬盤。只能說多個任務的數據交互不走硬盤,可是sprk的shuffle過程和hadoop同樣仍然必須走硬盤的。html

本文是翻譯的出處 https://0x0fff.com/spark-misconceptions/。

原文和做者一塊兒討論:http://www.cnblogs.com/intsmaze/p/7197420.htmlmysql

微信:intsmazeredis

避免微信回覆重複諮詢問題,技術諮詢請博客留言。算法

誤解一:Spark是一種內存技術

  你們對Spark最大的誤解就是spark一種內存技術。其實沒有一個Spark開發者正式說明這個,這是對Spark計算過程的誤解。Spark是內存計算沒有錯誤,可是這並非它的特性,只是不少專家在介紹spark的特性時,簡化後就成了spark是內存計算。sql

  什麼樣是內存技術?就是容許你將數據持久化在RAM中並有效處理的技術。然而Spark並不具有將數據數據存儲在RAM的選項,雖然咱們都知道能夠將數據存儲在HDFS, HBase等系統中,可是不論是將數據存儲在磁盤仍是內存,都沒有內置的持久化代碼。它所能作的事就是緩存數據,而這個並非數據持久化。已經緩存的數據能夠很容易地被刪除,而且在後期須要時從新計算。數據庫

  可是有人仍是會認爲Spark就是一種基於內存的技術,由於Spark是在內存中處理數據的。這固然是對的,由於咱們沒法使用其餘方式來處理數據。操做系統中的API都只能讓你把數據從塊設備加載到內存,而後計算完的結果再存儲到塊設備中。咱們沒法直接在HDD設備上計算;因此現代系統中的全部處理基本上都是在內存中進行的。緩存

  雖然Spark容許咱們使用內存緩存以及LRU替換規則,可是你想一想如今的RDBMS系統,好比Oracle ,你認爲它們是如何處理數據的?它們使用共享內存段做爲table pages的存儲池,全部的數據讀取以及寫入都是經過這個池的,這個存儲池一樣支持LRU替換規則;全部現代的數據庫一樣能夠經過LRU策略來知足大多數需求。可是爲何咱們並無把Oracle 稱做是基於內存的解決方案呢?再想一想操做系統IO,你知道嗎?全部的IO操做也是會用到LRU緩存技術的。微信

  Spark在內存中處理全部的操做嗎?Spark的核心:shuffle,其就是將數據寫入到磁盤的。shuffle的處理包括兩個階段:map 和 reduce。Map操做僅僅根據key計算其哈希值,並將數據存放到本地文件系統的不一樣文件中,文件的個數一般是reduce端分區的個數;Reduce端會從 Map端拉取數據,並將這些數據合併到新的分區中。全部若是你的RDD有M個分區,而後你將其轉換成N個分區的PairRDD,那麼在shuffle階段將會建立 M*N 個文件!雖然目前有些優化策略能夠減小建立文件的個數,但這仍然沒法改變每次進行shuffle操做的時候你須要將數據先寫入到磁盤的事實!框架

 

因此結論是:Spark並非基於內存的技術!它實際上是一種能夠有效地使用內存LRU策略的技術。ssh

誤解二:Spark要比Hadoop快 10x-100x

  你們在Spark的官網確定看到了以下所示的圖片

 

  這個圖片是分別使用 Spark 和 Hadoop 運行邏輯迴歸(Logistic Regression)機器學習算法的運行時間比較,從上圖能夠看出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!

  吹一波水,最近太忙了,不只要克服競爭對手給的數據中埋的雷,還要不斷和比利時的合做夥伴通郵件去核對項目的進度與解決方案。可是不妨礙我每個月更新一篇文章,-_-。

                                               老鐵,點贊,關注

相關文章
相關標籤/搜索