mr shuffle和spark shuffle的区别

本文对比了MapReduce和Spark的Shuffle过程,分析了两者在逻辑、数据流、Shuffle写读实现、数据fetch与计算重叠粒度及性能优化方面的区别。指出Spark在数据流表达、Shuffle实现及性能优化上更为灵活和全面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言 

对比mr和spark,Shuffle 过程有着诸多类似,例如,Shuffle 过程中,提供数据的一端被称作 Map 端,Map 端每个生成数据的任务称为 Mapper,对应的,接收数据的一端被称作 Reduce 端,Reduce 端每个拉取数据的任务称为 Reducer。Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程

 

mr shuffle和spark shuffle的区别

1. 从逻辑角度来讲,Shuffle 过程就是一个 GroupByKey 的过程,两者没有本质区别。只是 MapReduce 为了方便 GroupBy 存在于不同 partition 中的 key/value records,就提前对 key 进行排序。Spark 认为很多应用不需要对 key 排序,就默认没有在 GroupBy 的过程中对 key 排序。

2. 从数据流角度讲,两者有差别。MapReduce 只能从一个 Map Stage shuffle 数据,Spark 可以从多个 Map Stages shuffle 数据(这是 DAG 型数据流的优势,可以表达复杂的数据流操作,参见 CoGroup(), join() 等操作的数据流图 SparkInternals/4-shuffleDetails.md at master · JerryLead/SparkInternals · GitHub**

Shuffle write/read 实现上有一些区别

以前对 shuffle write/read 的分类是 sort-based 和 hash-based。MapReduce 可以说是 sort-based,shuffle write 和 shuffle read 过程都是基于key sorting 的 (buffering records + in-memory sort + on-disk external sorting)。早期的 Spark 是 hash-based,shuffle write 和 shuffle read 都使用 HashMap-like 的数据结构进行 aggregate (without key sorting)。但目前的 Spark 是两者的结合体,shuffle write 可以是 sort-based (only sort partition id, without key sorting),shuffle read 阶段可以是 hash-based。因此,目前 sort-based 和 hash-based 已经“你中有我,我中有你”,界限已经不那么清晰。

 

 从数据 fetch 与数据计算的重叠粒度来讲,两者有细微区别。

MapReduce 是粗粒度,reducer fetch 到的 records 先被放到 shuffle buffer 中休息,当 shuffle buffer 快满时,才对它们进行 combine()。而 Spark 是细粒度,可以即时将 fetch 到的 record 与 HashMap 中相同 key 的 record 进行 aggregate。

 

从性能优化角度来讲,Spark考虑的更全面。

MapReduce 的 shuffle 方式单一。Spark 针对不同类型的操作、不同类型的参数,会使用不同的 shuffle write 方式
 

其中 Serialized sorting 方式既可以使用堆内内存,也可以使用堆外内存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值