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. nodeCZBK-笔记2

    目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...

  2. 导入spark2.3.3源码至intellij idea

    检查环境配置 maven环境 2.检查scala插件 没有的话可以到https://plugins.jetbrains.com/plugin/1347-scala/versions 下载与idea对应 ...

  3. 如何在不到12天的时间里将网站权重优化到1(纯白帽SEO方法)

    之前操作了一个IDC网站,不到1个月的时间把网站的权重从0做到了1,本来想写篇文章分享相关的操作经验.后来因为网站整体规划的原因,IDC网站需要关闭一段时间做备案的更新,排名肯定就会掉了,然后怕大家看 ...

  4. 盘一盘 NIO (一)—— Buffer源码解析

    Buffer是个啥? Buffer 即缓冲区,用来暂存输入输出数据的区域.Buffer对象是一份固定数量的数据的容器,实质上是一个数组.但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问, ...

  5. zabbix利用自带模板-监控mysql性能

    环境: zabbix3.4.4 mariadb 5.5.56 要求:  利用zabbix 自带的模板 监控mariadb 上的 并发连接数,慢查询数量,增删改查.请求流量带宽,mysql响应流量带宽等 ...

  6. 章节十六、4-TestNG高级功能--把测试方法分优先级、分组执行

    一. 把测试方法分优先级执行----->(priority=索引) 1.新建一个testng方法 package testclasses; import org.testng.annotatio ...

  7. Python笔记_初级语法

    1.标识符与变量 1.1 标识符 规范 只能由数字,字母,_(下划线)组成 不能以数字开头 不能是关键字 区分大小写 命名约束 下划线分隔法(推荐): 多个单词组成的名称,使用全小写字母书写,中间使用 ...

  8. vscode 代码补全工具之aiXcoder

    突然发现了一个好用的代码补全工具,与人工智能相关,具有自学习能力,据说用的越久补全效果越好,可以帮助我们节省掉好多敲代码的时间,所以这么好的工具当然要分享给大家了.废话不多说,直接上vscode的安装 ...

  9. Python数据分析之pandas基本数据结构:Series、DataFrame

    1引言 本文总结Pandas中两种常用的数据类型: (1)Series是一种一维的带标签数组对象. (2)DataFrame,二维,Series容器 2 Series数组 2.1 Series数组构成 ...

  10. netcore 之动态代理(微服务专题)

    动态代理配合rpc技术调用远程服务,不用关注细节的实现,让程序就像在本地调用以用. 因此动态代理在微服务系统中是不可或缺的一个技术.网上看到大部分案例都是通过反射自己实现,且相当复杂.编写和调试相当不 ...