【Google三驾马车系列】MapReduce原理总结

MapReduce基本框架

在这里插入图片描述

MapReduce计算模型的两个重要阶段:

  • Map:映射,将数据转化为键值对的形式。切片操作在集群中并发执行,切片大小默认取最大切片、最小切片、块大小(128M)中间值。
  • Reduce:规约,负责数据的计算合并。

shuffle作为Map和Reduce两端的衔接,是MapReduce的核心,分布在MapReduce的Mapper端和Reducer端,主要包含以下几个阶段:

Collect阶段

将Map任务输出的“键-值对”数据存储到内存中的环形缓冲区。等待缓冲区满到一定阈值(如80%)触发Spill,将数据转存到磁盘。

在环形缓冲区内,设置了索引数据和Partition分区信息。数据区域和索引区域在缓冲区中是相邻不重叠的两个区域,通常使用一个分界点来划分。数据的存储方式是向上增长,索引数据的存储方式是向下增长。初始的分界点是0,之后在每次Spill之后都会更新一次,重定位到空闲区域的中间位置。

分区规则是对key进行哈希(或者随机)取模分区,分区数通常为reduce的个数。
Sort阶段:将缓冲区的数据按照Partition值和Key关键字进行排序,只需要移动索引数据。排序结果是缓冲区中的数据按照Partition为单位聚集在一起,同一Partition内的数据按照Key有序。

Combiner阶段

可选的,分区内部相同key数据的合并或处理,如词频统计或者求最大值,来减少拷贝到reduce的文件,主要的性能提升在于网络开销

Spill阶段

根据排序后的索引,将缓冲区的Partition逐个转存到文件中。为了定位每个Partion在文件中的位置,设置三元组(起始位置、原始数据长度、压缩数据长度)索引存储到索引文件。

Merge阶段

将所有Spill出来的临时文件(数据和索引)进行聚合(我理解就是归并排序)。此时Map任务已经结束,内存已有空闲。

Copy阶段

Reduce任务通过HTTP到已经完成Map任务的节点上拷贝数据。默认保存在内存的缓冲区,当内存的缓冲区达到一定的阈值时,就会将数据写到磁盘上。

Merge Sort阶段

Merge操作通常是跟Copy操作同时进行,在后台开启两个线程对内存到本地的数据文件进行合并排序操作。分组默认是将相同的key的value放在一起。作用是为了reduce函数更好的计算相同key值出现的次数。

相关的问题理解

Mapper和Reducer的数量

Mapper的数量通常由切片数量决定,与文件大小和数量,以及切片大小有关,不能人为设定;而Reduce的数量可以自己设置。

数据倾斜

数据倾斜是由于partition分区时会将相同键值的数据分配到同一个partition,导致存在部分reduce需要处理非常多的数据。

解决方案是根据实际数据的特点自定义partition分区的规则。

MapReduce优化思路

  • 小文件事先合并成大文件,减少“边角料”式的切片,充分利用计算资源(可能是HDFS的操作,切片时候需要注意的
  • 环形缓冲区批量收集map结果,可以减少磁盘IO,可以增大缓冲区容量或者阈值。
  • 对Map输出的数据进行压缩,减少网络传输和磁盘IO带来的性能损耗
  • 避免Reduce端出现数据倾斜,自定义partition规则;
  • 自定义conbiner,及时归并spill出来的文件;
  • 集群优化的核心思路是减少磁盘IO和网络读写(在实际经验中分布式系统运行的瓶颈一般都是IO而不是CPU),例如、对Map输出的数据进行压缩等。

Combiner和Reduce的区别

combiner发生在map端,处理一个任务中的文件数据,不能跨map任务;reduce可以接收多个map任务进行处理。

Shuffle是必需的吗?

不是的,只有在需要去重、聚合、排序、统计等操作时。不然的话可以不要(如求平均,降低计算和磁盘的性能损耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值