spark与hadoop对比

Spark 与 Hadoop:不是替代,是”存储 + 计算”的分工

Hadoop 和 Spark 经常被放在一起比较,但它们的关系不是”谁取代谁”——更像基础设施和上层应用

层次 Hadoop 提供 Spark 提供
存储 HDFS(分布式文件系统) 依赖外部存储,不自己管存
计算 MapReduce(磁盘级批处理) 内存计算引擎
资源调度 YARN 可以跑在 YARN 上

最常用的组合:HDFS 存数据 + YARN 管资源 + Spark 算数据

先看定位:一个管存,一个管算

Hadoop Spark
核心定位 分布式存储 + 批量计算 通用计算引擎
存储能力 自带 HDFS 依赖 HDFS/S3/Kafka
计算模型 磁盘级批处理(MapReduce) 内存级计算(RDD/DAG)
资源管理 自带 YARN 可独立,也可跑在 YARN/K8s
适用场景 离线批处理、冷数据存储 批处理、流处理、SQL、机器学习

Hadoop 的核心是”存”——它是一个存储底座。Spark 的核心是”算”——它是一个计算引擎。

计算层对比:MapReduce vs Spark

这是两者最直接的差异。

对比项 MapReduce Spark
中间结果 写磁盘(HDFS) 优先内存,不够才写磁盘
多阶段任务 每阶段写一次磁盘 DAG 串联,内存流转
任务启动 每个任务起 JVM(秒级) 线程池复用(毫秒级)
排序策略 强制排序 按需排序
迭代计算 每次读磁盘,效率低 内存缓存,效率高
延迟 分钟-小时级 秒-分钟级

一个直观的例子:

机器学习训练迭代 100 次,MapReduce 每次都要从 HDFS 读数据、写中间结果;Spark 第一次读进内存,后面 99 次都在内存里算。

速度差 10-100 倍。

存储层对比:HDFS vs Spark 无内置存储

HDFS Spark
存什么 原始数据、中间结果、最终结果 不存长期数据
数据持久化 多副本,高可靠 任务结束内存释放
容错 副本机制 Lineage(血缘重算)
存储介质 磁盘 内存为主

Hadoop 的核心资产是 HDFS——它存储海量数据,多副本保可靠性,廉价硬件也能跑。

Spark 不存数据,它从 HDFS 读数据,算完写回 HDFS 或输出到其他系统。

所以 Spark 依赖 Hadoop(或 S3 等存储系统)作为数据源和目标。

调度层对比:YARN vs Standalone

Hadoop YARN Spark Standalone
定位 通用资源管理平台 Spark 自带的集群管理
支持框架 MapReduce / Spark / Flink 仅 Spark
资源隔离 支持 CPU、内存 支持内存
高可用 支持 支持

实际生产中:

  • 已有 Hadoop 集群 → Spark 直接跑在 YARN 上,统一资源管理
  • 纯 Spark 集群 → 用 Standalone 或 K8s

数据通信方式:这是根本区别

MapReduce 和 Spark 最大的技术差异在于”阶段之间的数据怎么传递”。

MapReduce:先写磁盘,再读磁盘

Map → 写 HDFS → Reduce → 写 HDFS → 下一个 Map → 写 HDFS → ...

每个阶段之间都要落盘,磁盘 IO 是主要瓶颈。

Spark:内存传递,不够才落盘

Stage 1 → 内存 → Stage 2 → 内存 → Stage 3 → ...

Shuffle 数据优先放内存,只有内存不够才写磁盘。

为什么 Spark 能这么做?

  • RDD 的 Lineage(血缘关系)记录了数据来源和转换过程
  • 某个分区丢了,从源头重算就行,不需要每次都持久化
  • DAG 调度器知道哪些 Stage 能合并、哪些必须 Shuffle

它们是怎么配合的

一个典型的大数据平台架构:

数据源(日志/DB)
    ↓
HDFS(存储原始数据)
    ↓
Spark(清洗、转换、分析)
    ↓
HDFS(存储结果)
    ↓
BI 工具 / 报表

YARN 管着谁用什么资源,HDFS 存着数据,Spark 算着数据。

适用场景

场景 推荐 原因
海量数据离线批处理(TB/PB 级,小时级容忍) Hadoop MapReduce 磁盘存储成本低,容错强
数据仓库 ETL(分钟级响应) Spark SQL 内存计算快
机器学习迭代训练 Spark MLlib 迭代计算优势大
实时流处理 Spark Streaming / Flink Spark 微批处理,延迟秒级
数据长期存储(冷数据) HDFS 低成本、高可靠
即席查询(Ad-hoc 分析) Spark SQL 响应快