
作者:陈乔怀古,资深数据仓库工程师
关注公众号:【数据界的老司机】,回复关键字:【资料】,进社群下载全部 word/ppt/pdf 文件。
添加v:cqhg_bigdata,备注大数据面试,领取对应资料。
送你一张优惠券👇

核心总结
MapReduce Shuffle:可以看作是 “标准操作手册”。它非常稳定,但步骤固定、机械,每一步操作(Map, Spill, Merge, Fetch, Merge, Reduce)都涉及磁盘I/O,非常沉重(Heavy-weight)。 Spark Shuffle:更像一个 “自适应优化引擎”。它提供了多种实现方式(Hash, Sort, Tungsten-Sort),并会尝试选择最优策略(如避免排序、使用堆外内存等),其核心目标是最大限度地减少磁盘I/O和网络I/O,因此更轻量(Light-weight) 和灵活。
详细对比表
| 1. 设计哲学与模型 | 强制排序 (Sort-Based) | 灵活可选 (Sort-Based / Hash-Based) | |
| 2. 磁盘I/O | 重度依赖磁盘 | 尽力优化,减少磁盘I/O | |
| 3. 内存使用 | 使用固定大小的环形缓冲区 | 动态使用内存,更高效 | |
| 4. 流水线化与物化 | 物化 (Materialization) | 更流水线化 (Pipelined) | |
| 5. 容错机制 | 通过重新执行任务 | 通过血统(Lineage)和重计算 | |
| 6. 实现与可扩展性 | 单一实现 | 可插拔的架构 | hash, sort, tungsten-sort),并且提供了接口允许用户自定义Shuffle实现(如 Managed),社区也因此能不断优化(如推出更好的 SortShuffleManager)。 |
流程详解
MapReduce Shuffle 流程(沉重但清晰)
Map 端: Map Task 将输出写入一个环形内存缓冲区。 缓冲区快满时(默认80%),会溢写 (Spill) 到磁盘文件。溢写前会对数据进行分区(Partition) 和**排序(Sort)**。 所有Map输出完成后,会将多个溢写文件合并(Merge) 成一个大的、已排序的分区文件。 Copy/Fetch 阶段: Reduce Task 启动Fetcher线程,通过HTTP从各个完成Map任务的节点上拉取(Fetch) 属于自己的分区数据。 Reduce 端: 先将拉取到的数据放入内存缓冲区,不够时溢写到磁盘。 当所有数据都拉取完毕后,会将所有数据(内存和磁盘的)进行一个**归并排序(Merge Sort)**,形成一个更大的、完全有序的数据文件。 最后,Reduce Task 处理这个有序文件。
关键点:每一步都有磁盘操作,非常“踏实”但也非常慢。
Spark Shuffle 流程(灵活且优化)
以默认的 SortShuffleManager
为例:
Map 端(称为 Shuffle Write): 数据不会立即写入磁盘。它使用一种高效的数据结构(如类似AppendOnlyMap的结构)在内存中进行聚合(如果需要)和排序。 当内存压力大时,会将内存中的数据溢写(Spill) 到磁盘文件。可能会产生多个溢写文件。 Map Task 结束时,会将所有内存中的数据和溢写的文件进行合并,最终为每个分区生成两个文件:一个 .data
文件(存储合并后的数据)和一个.index
文件(存储索引,记录每个Reduce分区数据的偏移量)。Reduce 端(称为 Shuffle Read): Reduce Task 首先会去读取各个Map Task生成的 .index
文件,定位到需要拉取的数据位置。然后通过网络拉取(Fetch) 属于自己的数据块。 拉取到的数据可以放入内存中进行聚合操作(如果定义了聚合函数如 reduceByKey
),Spark会使用高效的内存数据结构(如HashMap)进行运算,内存不足时也会溢写到磁盘。最后将处理好的数据交给后续的计算操作。
关键点:内存优先,避免不必要的排序和磁盘I/O。.index
文件的使用使得数据拉取非常高效,不再是盲目的全量拷贝。
总结与类比
MapReduce Shuffle 就像是一个老式的图书馆:每本书(数据)必须先被分类、编号、上架(写磁盘)后,读者(Reduce任务)才能根据索书号来借阅。过程规范但耗时。 Spark Shuffle 就像是一个现代化的智能仓库:货物(数据)进来后,机器人会尽量在移动中(内存中)就进行分拣和预处理。同时,它维护了一个精确的电子索引( .index
文件)。取货员(Reduce任务)根据电子索引直接开车到货架前取走需要的货物,效率极高。
正是因为 Shuffle 阶段的巨大优化,以及内存计算的广泛使用,Spark 在迭代计算(如机器学习算法)和交互式查询上的性能通常远超 MapReduce。
据统计,99%的大咖都关注了这个公众号👇
猜你喜欢👇

文章转载自陈乔数据观止,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




