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 在内存中计算了。

觉得有价值请关注 ▼

Spark比MR快是因为在内存中计算?错!的更多相关文章

  1. JS获取对象在内存中计算后的样式

    通过obj.style的方式只能取得"内联style"的值,对于<style></style>中的css属性值,则无能为力 . 我们可以用obj.curre ...

  2. 内存中OLTP(Hekaton)里的事务日志记录

    在今天的文章里,我想详细讨论下内存中OLTP里的事务日志如何写入事务日志.我们都知道,对于你的内存优化表(Memory Optimized Tables),内存中OLTP提供你2个持久性(durabi ...

  3. Spark(Python) 从内存中建立 RDD 的例子

    Spark(Python) 从内存中建立 RDD 的例子: myData = ["Alice","Carlos","Frank"," ...

  4. QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

    FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QL ...

  5. 使用spark将内存中的数据写入到hive表中

    使用spark将内存中的数据写入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" st ...

  6. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  7. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  8. C/C++数据在内存中的存储方式

    目录 1 内存地址 2 内存空间   在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...

  9. Linux内存中Swap机制(转)

    在做监控时,发现内存中有一项Swap space,不是很理解,这里查了一些资料: http://blog.sina.com.cn/s/blog_502d765f0100krph.html 在linux ...

随机推荐

  1. 循环 与 分支语句 和 字符函数库cctype 文件简单处理

    循环 for循环 while循环 do  while循环 通常,入口条件循环比出口条件循环好,因为循环开始前对条件进行检查 c++11基于范围的for循环    对数组(或容器类,如:vector和a ...

  2. linux系统破解密码。

    Linux系统Centos7及RedHat7破解密码 步骤如下: 1.开机之后按"e"键 2.找到以linux16的开头的行在行尾添加 rd.break console=tty0 ...

  3. Vue入门到TodoList练手

    学习资料 慕课网 - vue2.5入门 基础语法 示例代码1 <div id="root"> <h1>hello {{msg}}</h1> &l ...

  4. Linux 用户和组 权限管理 常用命令与参数

    ========================================================================== 1.基本概念: 所有者 : 一般为文件的创建者,谁 ...

  5. CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析

    [CocosBuilder]学习笔记目录 1. 相关的类 先介绍和AnimationManager相关的几个类: CCBSequence 时间线.有成员duration(时间线时间,默认10秒).na ...

  6. log4j配置相对路径

    整理自网上: 一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便, 1.log4j的FileAppender本身就有这样的机制, ...

  7. wps10.1中将txt转为excel

    1.将想要保存的内容保存为txt格式,用分隔符分隔好(包括空格.制表符.英文的逗号以及分号四种). 2.打开wps 3.点击数据->导入数据,选择刚才的txt文件 4.一步步操作,即可.

  8. 洛谷P1582 倒水 二进制 lowbit __builtin_popcount

    P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...

  9. P1603 斯诺登的密码-字符串加法的妙用

    传送门:https://www.luogu.org/problemnew/show/P1603 题意: 首先在给定的字符串中,找出特定的单词,把它转化成特定的数字, 然后在这些数字中,找出排列结果最小 ...

  10. HDU - 3966 树链刨分

    题目传送门 操作就是询问某个点的值, 然后就是对一条路径上的值全部修改. 最基本的树刨题目了. 树刨的思想: 1. 对于每个点找到他的重儿子. void dfs1(int o, int u){ sz[ ...