Spark与MapReduce中Disk I/O含义及相关技术问题咨询
Spark与MapReduce核心理论问题解答
1. MapReduce和Spark场景下的Disk I/O指什么?
Disk I/O即磁盘输入输出,指的是数据在磁盘存储介质与计算节点内存之间的读写操作。不管是MapReduce还是Spark,Disk I/O的本质都是跨越磁盘与内存的数据传输:
- 读取阶段:从磁盘加载原始数据到内存供计算使用
- 写入阶段:将计算产生的中间结果或最终结果从内存写入磁盘进行存储或后续处理
2. MapReduce的中间数据存储位置,以及“磁盘”的具体所指?
MapReduce的中间数据(Map任务输出的键值对)会存储在计算节点的本地磁盘,这里的磁盘不是HDFS这类分布式文件系统的存储节点磁盘,而是集群中每个执行Map任务的节点自带的物理硬盘(本地挂载的磁盘)。
这类中间数据是临时存储,仅用于后续Reduce任务拉取计算,当整个作业完成后,本地磁盘上的中间数据会被自动清理,不需要持久化到分布式文件系统。
另外补充:你提到的“Spark计算过程中数据全程存储在内存”是常见误区——Spark优先用内存存储中间数据,但当内存不足时,会自动将部分数据溢写至本地磁盘,并非全程只在内存。
3. Spark和MapReduce的Disk I/O次数
Spark的Disk I/O次数
不存在“仅2次”的固定结论,次数取决于作业复杂度、内存配置和持久化策略:
- 最简场景(单阶段作业、内存足够、无磁盘缓存):仅2次——从磁盘读取原始数据、将最终结果写入磁盘
- 复杂场景:如果作业包含多阶段shuffle且内存不足导致数据溢写磁盘、或者主动将RDD持久化到磁盘、或者依赖磁盘上的中间结果,都会额外增加Disk I/O次数
MapReduce的Disk I/O次数
标准MapReduce作业(无Combine优化或特殊配置)通常包含4次核心Disk I/O:
- 1次:从分布式文件系统(如HDFS)读取原始数据到Map任务内存
- 1次:Map任务完成后,将中间结果写入节点本地磁盘
- 1次:Reduce任务从各个Map节点的本地磁盘读取中间数据到内存
- 1次:Reduce任务完成后,将最终结果写入分布式文件系统
如果启用Combine阶段(在Map端提前聚合数据),可以减少Map输出的磁盘写入量,但核心的四次I/O逻辑依然存在。
内容的提问来源于stack exchange,提问作者Cassius Clay
相关产品推荐
相关产品推荐

