当前位置: 首页 > news >正文

Hadoop和Spark的对比

Hadoop

Spark

场景

大数据数据集的批处理

迭代计算、流计算

编程范式

Map+Reduce API较低层,适应性差

RDD组成DAG有向无环图,API顶层,方便使用

存储

中间结果在磁盘,延迟大

RDD结果在内存,延迟小

运行方式

Task以进程方式维护,启动任务慢

Task以线程方式维护,启动快

1. 原理比较

Hadoop和Spark都是并行计算,

Hadoop一个作业称为一个Job,Job里面分为Map Task和Reduce Task阶段,每个Task都在自己的进程中运行,当Task结束时,进程也会随之结束;
好处在于进程之间是互相独立的,每个task独享进程资源,没有互相干扰,监控方便,
但是问题在于task之间不方便共享数据,执行效率比较低。比如多个map task读取不同数据源文件需要将数据源加载到每个map task中,造成重复加载和浪费内存。

Spark的任务称为application,一个SparkContext对应一个application;
application中存在多个job,每触发一次行动算子就会产生一个job;
每个job中有多个stage,stage是shuffle过程中DAGScheduler通过RDD之间的依赖关系划分job而来的,stage数量=宽依赖(shuffle)数量+1 (默认有一个ResultStage);
每个stage里面有多个task,组成taskset,由TaskScheduler分发到各个executor中执行;
executor的生命周期是和application一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算。
Spark基于线程的方式计算是为了数据共享和提高执行效率,
Spark采用了线程的最小的执行单位,但缺点是线程之间会有资源竞争。

2. 应用场景

Hadoop MapReduce 其设计初衷是一次性数据计算(一个job中 只有一次map和reduce),并不是为了满足循环迭代式数据流处理,因此在多并行运行的数据可复用场景(如:机器学习、图挖掘算法、交互式数据挖掘算法)中存在诸多计算效率等问题(使用磁盘交互,进度非常慢)。

Spark 应运而生,Spark 就是在传统的MapReduce 计算框架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更适合并行计算和重复使用的RDD 计算模型。
Spark将job的结果放到了内存当中,为下一次计算提供了更加便利的处理方式,所以Spark做迭代效率更高。

Hadoop适合处理静态数据,对于迭代式流式数据的处理能力差;
Spark通过在内存中缓存处理的数据,提高了处理流式数据和迭代式数据的性能;

3. 处理速度

Hadoop是磁盘级计算,计算时需要在磁盘中读取数据;其采用的是MapReduce的逻辑,把数据进行切片计算用这种方式来处理大量的离线数据.;

Spark它会在内存中以接近“实时”的时间完成所有的数据分析。Spark的批处理速度比MapReduce快近10倍,【内存中】的数据分析速度则快近100倍。

4. 启动速度

Spark Task 的启动时间快。Spark 采用 fork 线程的方式,而 Hadoop 采用创建新的进程的方式。

5. 中间结果存储

Hadoop中 ,中间结果存放在HDFS中,每次MR都需要刷写-调用
Spark中间结果存放优先存放在内存中,内存不够再存放在磁盘中,不放入HDFS,避免了大量的IO和刷写读取操作;

6. 根本差异

Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据通信是基于内存,而 Hadoop 是基于磁盘
在这里插入图片描述

Spark 只有在 shuffle 的时候将数据写入磁盘,而 Hadoop 中多个 MR 作业之间的数据交互都要依赖于磁盘交互

Spark能否代替Hadoop ?

但是Spark 是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以 Spark 并不能完全替代 MR

参考:https://blog.csdn.net/weixin_42058550/article/details/121951509

相关文章:

  • 智能座舱行为识别数据解决方案,助力打造第三空间新体验
  • centos8同步时间安装时间校准服务
  • PHP 图像处理组件:Intervention/image
  • java幼儿园信息管理系统
  • 599. 两个列表的最小索引总和
  • Vcenter6.5扩容存储后无法创建虚机处理方法
  • Docker基础-3.本地镜像发布与容器数据卷
  • C#对象序列化
  • Java常用集合总结
  • C++ string容器
  • 锂电池储能系统建模发展现状及其数据驱动建模初步探讨
  • 你的密码安全吗?如何加密才安全?
  • 【Python】-- 列表list(基本语法、常用方法)
  • 8月汽车销量出炉:问界破万,智己破千,理想腰斩!埃安近创新高
  • Python语言及其应用
  • [iOS]Core Data浅析一 -- 启用Core Data
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Java程序员幽默爆笑锦集
  • Linux下的乱码问题
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • log4j2输出到kafka
  • php ci框架整合银盛支付
  • Python 反序列化安全问题(二)
  • Python利用正则抓取网页内容保存到本地
  • React 快速上手 - 07 前端路由 react-router
  • SwizzleMethod 黑魔法
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue 2.3、2.4 知识点小结
  • 基于游标的分页接口实现
  • 简析gRPC client 连接管理
  • 前端攻城师
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用 @font-face
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一文看透浏览器架构
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ![CDATA[ ]] 是什么东东
  • #Z0458. 树的中心2
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (6)STL算法之转换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)elasticsearch 源码之启动流程分析
  • (算法二)滑动窗口
  • (未解决)macOS matplotlib 中文是方框
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • ::前边啥也没有
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @SuppressWarnings(unchecked)代码的作用
  • [1204 寻找子串位置] 解题报告
  • [20171102]视图v$session中process字段含义