1. 程式人生 > >Spark比MR快是因為在記憶體中計算?錯!

Spark比MR快是因為在記憶體中計算?錯!

MapReduce 就像一臺又慢又穩的老爺車,雖然距離 MapReduce 面市到現在已經過去了十幾年的時間,但它始終沒有被淘汰,任由大資料技術日新月異、蓬蓬勃勃、花裡胡哨地發展,這個生態圈始終有它的一席之地。

不過 Spark 的到來確實給了 MapReduce 不小的衝擊,它比 MapReduce 理論上要快兩個數量級,所以近幾年不斷有人討論 Spark 是否可以完全替代 MapReduce ,但是為什麼說是不斷有人討論呢?因為這些年 Spark 始終是無法完全取代 MapReduce 。

我們今天關注的問題是Spark為什麼比 MapReduce 快?如果沒有看文章的標題,你是不是會脫口而出:

“因為 Spark 是在記憶體中計算,而 MapReduce 是基於磁碟。”

這話乍一聽沒毛病,但是作為一個對技術很嚴謹的人,這讓我忍不住想槓一下,

“那麼 MapReduce 計算的時候不需要把資料載入到記憶體,在記憶體中計算嗎?”

其實要對資料做計算,必然得把資料載入到記憶體, MapReduce 也不例外,Spark只是在計算模型和排程上做了更多的優化,不需要過多地和磁碟互動。

說到這裡不得不提的就是 Spark 的 DAG(有向無環圖),這個 DAG 就相當於改進版的 MapReduce,它可以說是由多個 MapReduce 組成,當資料處理流程中存在多個map和多個Reduce操作混合執行時,MapReduce只能提交多個Job執行,而Spark可以只提交一次,在一個任務中完成。

這就導致了 MapReduce 會存在多次耗時的資源申請和資源釋放,另外 MapReduce 每次shuffle 操作後,必須寫到磁碟,而 Spark 在 shuffle 後不一定落盤,如果Shuffle後的資料是需要反覆用到的,則可以cache到記憶體中,方便迭代時使用,所以Spark對於需要對資料進行反覆迭代的操作(比如跑機器學習演算法或者有中間結果的複雜計算等)是非常友好的。

這裡還有一個誤區,很多人會認為 Spark 在計算時的所有過程都是在記憶體中完成的不用寫磁碟,但是實際上不是這樣的,在 shuffle 過程中 Spark 同樣需要寫磁碟,研究過 Sorted-Based Shuffle 的同學對這個寫盤操作一定不陌生,如下圖。

簡單地說下,shuffle分成write和read兩個階段,write的過程不僅會寫需要發向下一個Stage的資料到磁碟,還需要寫一份資料的Index記錄下遊每個分割槽獲取的資料範圍。這裡就不詳細說了,有興趣的同學可以去研究下。

另外,剛才提到了Spark儘管比MapReduce快兩個數量級但是它始終沒有被淘汰,這是因為它在每個階段都落盤,雖然慢但是可以保證計算過程的穩定性,不會像Spark一樣,一旦中間結果太大,記憶體裝不下整個計算任務就崩了,這對於不講究時效性的後臺任務來說無疑是增加了維護成本,所以現在構建資料倉庫的主要SQL工具還是Hive(Hive的底層是MapReduce),你見過用SparkSQL來跑資料量大的數倉任務的嗎?

看完這篇,希望下次有人問你 Spark 為什麼比 MapReduce 快的時候不要再說 Spark 在記憶體中計算了。

覺得有價值請關注 ▼

相關推薦

SparkMR是因為在記憶體計算

MapReduce 就像一臺又慢又穩的老爺車,雖然距離 MapReduce 面市到現在已經過去了十幾年的時間,但它始終沒有被淘汰,任由大資料技術日新月異、蓬蓬勃勃、花裡胡哨地發展,這個生態圈始終有它的一席之地。 不過 Spark 的到來確實給了 MapReduce 不小的衝擊,它比 MapReduce 理論上

百度面試總結:sparkMapReduce的原因是什麼?(比較完整)

1、spark是基於記憶體進行資料處理的,MapReduce是基於磁碟進行資料處理的 MapReduce的設設計:中間結果儲存在檔案中,提高了可靠性,減少了記憶體佔用。但是犧牲了效能。 Spark的設計:資料在記憶體中進行交換,要快一些,但是記憶體這個東西,可靠性不如磁碟。所以效能方面比MapR

sparkMapReduce的原因是什麼?(比較完整)

1、spark是基於記憶體進行資料處理的,MapReduce是基於磁碟進行資料處理的 MapReduce的設設計:中間結果儲存在檔案中,提高了可靠性,減少了記憶體佔用。但是犧牲了效能。 Spark的設計:資料在記憶體中進行交換,要快一些,但是記憶體這個東西,可靠性不如磁碟。所以效能方面比Ma

總結SparkHadoop的原因

1. 消除了冗餘的HDFS讀寫 Hadoop的每次shuffle都必須寫到磁碟中,而Spark的shuffle不一定寫到磁碟中,而是可以快取到記憶體中,以便後續的其他迭代操作時直接使用。這樣一來,如果任務複雜,需要很多次的shuffle才能完成,那麼Hadoo

sparkmapreduce的一個原因

接觸spark時間不長,但是有些概念還是沒有太校準,於是回顧了一下spark的文件。讀到shuffle操作那塊發現spark的shuffle操作後的reduce也是儲存到檔案然後從檔案中讀取。以前一直以為spark快是因為這部分操作是在記憶體中執行,也就是red

sparkhadoop的原因

(1)spark大量使用記憶體 (2)核心資料結構:RDD(彈性分散式資料集),在此基礎上提供了許多計算函式, (3)在原先hadoop下一個map或reduce實現的功能,在spark下可以拆分成多個job.如果把hadoop看做罐子裡的大石頭,那麼spark的jo

spark部分:spark的四種執行模式,Spark MapReduce 的原因,spark執行程式流程,spark運算元種類,spark持久化運算元,cache 和 persist,調節引數的方式

Spark 有 4 中執行模式: 1. local 模式,適用於測試 2. standalone,並非是單節點,而是使用 spark 自帶的資源排程框架 3. yarn,最流行的方式,使用 yarn 叢集排程資源 4. mesos,國外使用的多 Spark 比 M

iOS 如何計算圖片載入記憶體所佔的大小

首先圖片自動縮放到2的n次方大小,例如200 * 300畫素 會變成256 * 512大小。 圖片記憶體大小的計算公式 寬度 * 高度 * bytesPerPixel/8。 bytesPerPixel : 每個畫素所佔的位元組數。 RGB顏色空間下 每個顏色分量由8位組成

使用spark記憶體的資料寫入到hive表

使用spark將記憶體中的資料寫入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configurati

C++ Builder TMemIniFile讀取效率TIniFile很多

ini 檔案操作記要(2): 使用 TMemIniFile unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics,

Android Automotive 記憶體磨損管理 emmc

Android Automotive 中的快閃記憶體磨損管理 Android Automotive 內部儲存裝置使用了支援上千次清空/寫入週期的嵌入式多媒體卡 (eMMC);如果 eMMC 發生故障,系統可能會變得無法使用。由於汽車的使用壽命較長(通常為 10 年以上),因此 eMMC 必須非常穩定可靠。

Android圖片佔用記憶體計算

本人的網易部落格原文 在Android開發中,我現在發現很多人還不會對圖片佔用記憶體進行很好的計算。因此撰寫該博文來做介紹,期望達到拋磚引玉的作用。   Android中一張圖片(BitMap)佔用的記憶體主要和以下幾個因數有關:圖片長度,圖片寬度,單位畫素佔用的位元組

[深度學習] [Tensorflow] Tensorflow 計算 PSNR 峰值信噪

峰值信噪比,Peak signal-to-noise ratio(PSNR)是測量有失真壓縮編/解碼器的重建質量的重要指標,在影象處理領域很常見,因為在影象壓縮處理過程中,常常會引入噪聲,這些噪聲就會影響影象重建質量,對於影象重建,較高的PSNR指標通常表明重建質量較高,影象失真越小。

spark資料快取到記憶體的方法

RDD.cache() 或RDD.persist1.1.  RDD的快取Spark速度非常快的原因之一,就是在不同操作中可以在記憶體中持久化或快取資料集。當持久化某個RDD後,每一個節點都將把計算的分片結果儲存在記憶體中,並在對此RDD或衍生出的RDD進行的其他動作中重用。這

為啥別人幹事那麽多因為他掌握了這些Excel技巧速學

alt image 條件 fff 司機 ces -- 成就 mark 作為辦公職場老司機的我們經常與電腦打交道,如果手上沒有幾個Excel技巧怎麽行?小編介紹4個簡單又使用的Excel技巧,希望能對大家的工作有所幫助! 快速填充日期如何快速錄入日期?這裏我們選中日期,點

Spark 拼 Flink:下一代大資料計算引擎之爭,誰主沉浮?

下一代大資料計算引擎 自從資料處理需求超過了傳統資料庫能有效處理的資料量之後,Hadoop 等各種基於 MapReduce 的

Mach-O在記憶體符號表地址、字串表地址的計算

KSCrash 是一個用於 iOS 平臺的崩潰捕捉框架,最近讀了其部分原始碼,在 KSDynamicLinker 檔案中有一個函式,程式碼如下: /** Get the segment base address of the specified image. * * This is required fo

Java計算對象的大小

bject tro 項目依賴 all 返回值 not 檢測 app main 一、計算對象大小的方法 Java中如何計算對象的大小呢,找到了4種方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法; 2.BT

Oracle計算兩個日期時間的差

weight span num log 方法 bsp round code oracl --方法1 select floor((sysdate - to_date(‘2006-09-01 08:00:00‘, ‘yyyy-mm-dd hh24:m

關於匿名函數的使用,購物車計算銷售稅的應用

blog 神奇 php匿名函數 ons spa 3.0 walk color back php匿名函數又叫閉包函數,可以起到精簡代碼的作用,下面是購物車中的應用: class Cart { const PRICE_BUTTER = 1.00; const