热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sparkshuffle和Hadoopshuffle区别

本文来源于知乎上一大牛的回答作者:LijieXu1.是否需要对key提前进行排序。从逻辑角度来讲,Shuffle过程就是一个GroupByKey的过程,两者没有本质区别。只是Map

本文来源于知乎上一大牛的回答作者:Lijie Xu

1. 是否需要对key提前进行排序。

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

2.DAG数据流的优势。

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

3. 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 已经“你中有我,我中有你”,界限已经不那么清晰。

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

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

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

MapReduce 的 shuffle 方式单一。Spark 针对不同类型的操作、不同类型的参数,会使用不同的 shuffle write 方式。比如 Shuffle write 有三种实现方式:

《spark shuffle和Hadoop shuffle区别》

其中 Serialized sorting 方式既可以使用堆内内存,也可以使用堆外内存。更多的细节就不详述了,感兴趣可以看相关的实现类。


推荐阅读
author-avatar
闻人特荷焦黄01965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有