Spark的誤解-不僅spark是記憶體計算,hadoop也是記憶體計算

来源:http://www.cnblogs.com/intsmaze/archive/2017/07/17/7197420.html
-Advertisement-
Play Games

市面上有一些初學者的誤解,他們拿spark和hadoop比較時就會說,Spark是記憶體計算,記憶體計算是spark的特性。請問在電腦領域,mysql,redis,ssh框架等等他們不是記憶體計算嗎?依據馮諾依曼體繫結構,有什麼技術的程式不是在記憶體中運行,需要數據從硬碟中拉取,然後供cpu進行執行?所有 ...


       市面上有一些初學者的誤解,他們拿spark和hadoop比較時就會說,Spark是記憶體計算,記憶體計算是spark的特性。請問在電腦領域,mysql,redis,ssh框架等等他們不是記憶體計算嗎?依據馮諾依曼體繫結構,有什麼技術的程式不是在記憶體中運行,需要數據從硬碟中拉取,然後供cpu進行執行?所有說sprk的特點是記憶體計算相當於什麼都沒有說。那麼spark的真正特點是什麼?拋開spark的執行模型的方式,它的特點無非就是多個任務之間數據通信不需要藉助硬碟而是通過記憶體,大大提高了程式的執行效率。而hadoop由於本身的模型特點,多個任務之間數據通信是必須藉助硬碟落地的。那麼spark的特點就是數據交互不會走硬碟。只能說多個任務的數據交互不走硬碟,但是sprk的shuffle過程和hadoop一樣仍然必須走硬碟的。

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

原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/7197420.html

微信:intsmaze

誤解一:Spark是一種記憶體技術

  大家對Spark最大的誤解就是spark一種記憶體技術。其實沒有一個Spark開發者正式說明這個,這是對Spark計算過程的誤解。Spark是記憶體計算沒有錯誤,但是這並不是它的特性,只是很多專家在介紹spark的特性時,簡化後就成了spark是記憶體計算。

  什麼樣是記憶體技術?就是允許你將數據持久化在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策略的技術。

誤解二: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!

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

                                               老鐵,點贊,關註

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、string(key:value類型) 2、hash(name {key1:value1,key2:value2,....}) 3、List(隊列,兩邊均可以取值) 4、set(集合,不重覆數據的集) 5、Sorted set(有序集合,帶權重) ...
  • 這裡整理5個Spark的應用實例,希望對Spark學習者能夠有所幫助 ...
  • 1.KILL掉系統里的MySQL進程; killall -TERM mysqld 2.用以下命令啟動MySQL,以不檢查許可權的方式啟動; mysqld --skip-grant-tables & 3.然後用空密碼方式使用root用戶登錄 MySQL; MySQL -u root 4.修改root用戶 ...
  • 開啟回收站RECYCLEBIN=ON,預設開啟ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;一、從回收站還原表還原刪除的表和從屬對象。如果多個回收站條目具有相同原始名稱,則:使用系統生成的唯一名稱來還原特定版本使用原始名稱時,還原的表遵循後進先出(LIFO... ...
  • 在資料庫開發過程中,字元串和關係表的轉化是一項基本技能。當字元串中存在分隔符時,有時將其轉換成關係表數據,和其他數據表進行join查詢,出現這種情況,是因為沒有遵守關係資料庫的設計範式,沒有把字元串拆分成原子項存儲,也有可能是數據傳參數;有時會遇到相反的情況,需要將關係表的相關數據拼接成一個字元串顯 ...
  • `React Native iOS RN`是使用腳本語言編寫的,實現了“解釋執行”的方式,而這種執行方式的修改只需替換腳步即可,不需要重新發佈程式,熱更新的方式極大的方便了迭代開發。 今天我們選擇的熱更新組件是 ,這是國內開發的,功能類似 (`CodePush Pushy`支持增量更新,最大化的降低 ...
  • Redis是一個Key Value資料庫。Redis有5種數據類型:字元串、列表、哈希、集合、有序集合。而字元串的底層實現方法之一就是使用sds。以下描述中請讀者註意區分sds是指簡單動態字元串這一數據結構(用大寫表示)還是sdshdr頭部中buf數組的起始地址(用小寫表示)。 SDS源碼 如下源碼 ...
  • SQL圖書管理系 0.表設計 b_user_information 列名 數據類型 約束 auto_number bigint(20) auto_increment user_id varchar(20) not null unique key user_name varchar(50) not n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...