Spark 为什么比 MapReduce 快100倍?

news2024/11/17 12:26:59

文章目录

  • 1. 内存计算与磁盘刷写
    • 1.1 MapReduce 的 Shuffle 需要频繁 IO
    • 1.2 Spark 计算走 IO 少
  • 2. 进程和线程
    • 2.1 基于进程的 MapReduce
    • 2.2 基于线程的 Spark
    • 2.3 基于进程 VS 基于线程
  • 3. 持久化缓存机制
  • 4. 数据格式和序列化

在这里插入图片描述
通常我们认为 Spark 引擎是基于内存进行计算,无论如何,速度都是比 MapReduce 快,因为 MapReduce 需要频繁 Shuffle 。在 Spark 的官网早期介绍中,也有过一张 Spark 比 Hadoop 计算速度快100倍的宣传,虽然它似乎违反了我们的广告法。

本文不讨论技术源码,从内存计算、数据共享、任务调度优化多种角度,总结 Spark 快的真因。


1. 内存计算与磁盘刷写

1.1 MapReduce 的 Shuffle 需要频繁 IO

MapReduce 在 Shuffle 阶段,数据要经过环形缓冲区进行溢写,需要按键进行排序,以便相同键的数据可以被发送到同一个 Reducer。这可能涉及大量的数据传输,对网络和磁盘 I/O 造成负担。

1.2 Spark 计算走 IO 少

Spark 计算比 MapReduce 快的根本原因在于 DAG(有向无环图) 计算模型。一般而言,DAG 相比 MapReduce 在大多数情况下可以减少 shuffle 次数。

Spark 的 DAGScheduler 相当于一个改进版的 MapReduce,如果计算不涉及与其他节点进行数据交换,Spark可以在内存中一次性完成这些操作,也就是中间结果无须落盘,减少了磁盘IO的操作,只在最后进行落盘。但是,如果计算过程中涉及数据交换,Spark 也是会把 shuffle 的数据写磁盘的!

2. 进程和线程

2.1 基于进程的 MapReduce

在 MapReduce 中,任务(Mapper 和 Reducer)是进程级别的,每个任务通常运行在单独的进程中。每个 Mapper 或 Reducer 任务的执行过程中可能涉及多个线程来处理输入数据、执行计算和进行 I/O 操作。

2.2 基于线程的 Spark

在 Spark 中,任务是线程级别的,由执行器(Executor)中的线程池处理。每个 Executor 可以运行多个任务,每个任务由一个或多个线程处理,共享 Executor 内的内存。Spark 的任务调度和执行都是在 Executor 内部进行,Spark 管理着任务的分发、调度、失败恢复以及数据的本地性优化。

因此 Spark 的任务创建开销相对较小,使得任务可以更快地启动和执行。而MapReduce 框架中创建和销毁进程的开销较大。

2.3 基于进程 VS 基于线程

  1. 资源共享: 线程是进程内的执行单元,多个线程共享进程的内存空间和资源。这意味着在切换线程时,不需要像进程切换那样涉及大量的上下文切换和资源分配,从而减少了开销。

  2. 上下文切换开销较小: 由于线程共享同一进程的上下文,所以在线程之间进行上下文切换的开销相对较小。进程切换需要切换不同的内存空间和资源,而线程切换只需要切换一部分上下文信息。

  3. 创建和销毁开销小: 创建一个线程的开销通常比创建一个新进程的开销要小。线程只需要分配一些线程私有的资源,而进程需要分配独立的内存空间和资源。

  4. 通信效率高: 在同一个进程内的线程之间通信通常比不同进程之间的通信效率高。因为线程之间共享内存,可以直接进行数据传递,而进程之间需要通过更复杂的机制,如管道、套接字等。

  5. 适合多核处理器: 现代计算机通常有多个处理核心,线程可以在多个核心上并行执行,从而更好地利用多核处理器的性能。进程的并行执行通常需要更复杂的机制。

  6. 线程相对进程更快的优势在于资源共享和上下文切换方面,但也存在一些潜在问题,如线程之间的共享数据可能引发竞态条件和同步问题。此外,线程的高并发性也可能导致调试和维护的复杂性增加。因此,在处理数据时,需要根据具体的需求和情况选择适当的线程或进程策略。

3. 持久化缓存机制

Spark 提供了持久化缓存机制,通过将需要复用的数据存储在内存中,可以显著提高 Spark 应用程序的速度。这种机制可以避免重复计算和磁盘读取,从而加快数据访问和处理速度,这也正是因为线程中资源共享的特点而决定的。

而 MapReduce 每个阶段之间都需要将数据写入分布式文件系统,这会造成数据的多次复制和移动。

4. 数据格式和序列化

Spark 使用更高效的数据序列化格式,例如 Parquet、Avro 等,从而减少数据在网络上的传输和存储开销。MapReduce 默认使用的是文本格式,传输和解析开销较大。


最后,Spark 一定比 MapReduce 快100倍吗?
我们是否可以测试一种情况,使程序在 Spark 和 MapReduce 中都只走一次 Shuffle ,进行一次磁盘的IO,此时两种计算引擎谁更有优势?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STL】-- 知识总结

目录 STL六大组件介绍 容器 序列式容器 vector list 知识点考察 关联式容器 map/set set介绍 set常用接口 map介绍 map常用接口 底层结构:红黑树 unordered_map/set unordered_map/set介绍 底层结构:哈希表 知识考察 适配器 stack qu…

【ESP系列】ESP01S官方MQTT案例实验

前言 偶然发现安信可官网有ESP01S和STM32连接TCP和MQTT的案例。弄了一两天,把我使用的流程在这里记录下。MQTT的固件一定要烧录进去,默认固件是没有MQTT相关的AT指令的。 环境 Keli5,STM32F103C8T6 官方Keil工程链接:ESP8266的S…

虫情测报灯

在农业生产过程中,农作物的虫害问题永远都是放在首位的。随着现代生活科技的发展和社会进步,人们对物质也有了新的要求。伴随农作物品种的增加,农药和化肥的使用也在导致农业虫害问题日益加剧,在这种不良的耕作状态下,…

JSP介绍

目录 获取表单提交的数据 请求对象 request response 在请求中存取属性 转发与重定向 session cookie pageContext对象 jsp 动作标签 JSP内置对象是什么: 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使…

JavaWeb 速通Listener

目录 一、Listener快速入门 1.Listener简介 : 2.Java事件处理机制 : 二、ServletContextListener 1.作用 : 2.相关方法 : 3.应用实例 : 三、ServletContextAttributeListener 1.作用 : 2.相关方法 : 3.应用实例 : 四、HttpSessionListener 1.作用 : 2.相关方法 :…

KeilMDk软仿真设置_STM32F03C8

1、KeilMDK软仿真的价值 (1)在没有硬件的情况下进行程序的编写调试。 (2)避免频繁的下载程序,延长单片机Flash寿命。 2、软仿真配置。 (1)打开Keil工程。 (2)点击“Options for Target ***”,如下图所示。 (3)点击“Debug”。 (4)进行如下配置。 U…

无涯教程-TensorFlow - XOR实现

在本章中,无涯教程将学习使用TensorFlow的XOR实现,在TensorFlow中开始XOR实施之前,看一下XOR表值。这将帮助了解加密和解密过程。 A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 XOR密码加密方法基本上用于加密,即通过生成与适当密钥匹配…

科技大厂GenAI最新动态一览!AI创意字终极全攻略;一文入门LLM应用开发框架LangChain;Llama初学者指南 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 使用浏览器插件 immersive translate,将外语书翻译成双语对照版 immersive translate 是一款非常好用的浏览器翻译插件。今…

idea2023 springboot2.7.5+mybatisplus3.5.2+jsp 初学单表增删改查

创建项目 修改pom.xml 为2.7.5 引入mybatisplus 2.1 修改pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mysq…

XSS攻击是什么?它有哪些类型?

xss攻击是什么&#xff1f; XSS全称是Cross Site Scripting即跨站脚本&#xff0c;当目标网站目标用户浏览器渲染HTML文档的过程中&#xff0c;出现了不被预期的脚本指令并执行时&#xff0c;XSS就发生了。 作为一种HTML注入攻击&#xff0c;XSS攻击的核心思想就是在HTML页面中…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

使用Pandas处理Excel文件

Excel工作表是非常本能和用户友好的&#xff0c;这使得它们非常适合操作大型数据集&#xff0c;即使是技术人员也不例外。如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方&#xff0c;请不要再找了。你来对地方了。 在本文中&#xff0c;您将学习如何使用Pan…

ansible(1)-- 部署ansible连接被控端

目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56被控端 一、部署ansible 1.1 安装 zabbix-s只是主机名&#xff0c;不用在意&#xff0c;更好该主机也安装了zabbix&#xff0c;不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…

33.Netty源码之读写数据

highlight: arduino-light 写数据 写数据的三种方式 md 快递场景(包裹) Netty 写数据(数据) 揽收到仓库 write&#xff1a;写到一个 buffer 从仓库发货 flush: 把 buffer 里的数据发送出去 揽收到仓库并立马发货 (加急件) writeAndFlush&#xff1a;写到 buffer&#xff0c;立马…

Android5:活动生命周期

创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

产品经理必知必会0.2

Q1:产品经理需要具备的能力&#xff1f; A:硬实力&#xff1a;产品设计、需求分析、竞品分析、数据分析、撰写文档 软实力&#xff1a;沟通能力、学习能力、用户思维、主动性、好奇心、同理心、责任心、抗压能力、目标导向.... 扩展能力&#xff1a;商业思维、市场敏感度... Q…

3D与沉浸式技术,如何助力企业数字化转型?

说起3D&#xff0c;估计许多读者朋友会在第一时间想起《阿凡达》系列和《侏罗纪公园》系列电影大作。每一帧细节纤毫毕现的逼真画面&#xff0c;让观众几乎分不清虚拟与现实&#xff0c;完全沉浸在导演打造的视觉盛宴中。 事实上&#xff0c;除了大家所熟知的3D影视动画之外&am…

ps丢失d3dcompiler_47.dll怎么办,启动无反应,分享三个解决方法

d3dcompiler_47.dll64位是windows系统中重要的dll文件&#xff0c;缺少了它可能会引起部分软件或者游戏不能运行。 如果系统出现“找不到d3dcompiler_47.dll”或“d3dcompiler_47.dll丢失”等错误信息&#xff0c;那么我们就该着手修复它。 先带了解一下d3dcompiler_47.dll是什…

【MATLAB基础绘图第16棒】绘制热图(Heatmap)

热图&#xff08;Heatmap&#xff09; 热图的主要作用是直观展示重点研究对象的差异情况&#xff0c;多用于经济学与工学差异性分析之中。 heatmap函数创建热图 语法 hheatmap(tbl,xvar,yvar) hheatmap(tbl,xvar,yvar,ColorVariable,cvar) hheatmap(cdata) hheatmap(xvalue…

开发板启动过程

开发板启动过程 开发板上电后首先运行SOC内部iROM中固化的代码(BL0)&#xff0c;这段代码先对基本的软硬件环境(时钟等…)进行初始化&#xff0c;然后再检测拨码开关位置获取启动方式&#xff0c;然后再将对应存储器中的uboot搬移到内存&#xff0c;然后跳转到uboot运行 uboot…