浅谈MapReduce核心之shuffle

2024-09-06 05:48

本文主要是介绍浅谈MapReduce核心之shuffle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hadoop拥有三大核心组件,HDFS作为底层的分布式文件系统,MapReduce作为计算框架,yarn作为资源调度管理器。

对于开发人员来说,理解MapReduce是很重要的。

在WordCount程序中,map生成的结果是一个个的元组,类似于(hello,1),非常非常多的元组,由context写入到hdfs中,而后续的Reduce阶段,实际上reduce方法接收的参数类似于这种,(hello,<1,2,3,4,5>);这里面,问题就出现了,为什么map的输出结果,到了reduce端成了这个样子,其中最为关键的就是称为shuffle的阶段。

本文,就对shuffle阶段做一定的介绍。


上图,是诸多介绍shuffle过程用得比较多的一张图。

实际上,我们的实现知识map的逻辑以及reduce的逻辑,而以上很多的逻辑,隐藏在MapReduce的内核,只有深刻理解其内部原理,才能写出更好的MapReduce程序,譬如可以很好地避免数据倾斜问题。

以下介绍,全部基于WordCount。

1:数据读取阶段

代码中,最基本的读取应该是InputFormat,其本身是个抽象类,具有很多实现,可以从数据库,本地文件或者HDFS等很多地方读取数据,对于wordCount来说,使用的是FileInputFormat,其会读取文件,并且按照HDFS的存储格式,将文件存储起来,这样就会将文件进行切片,生成一个一个小的split,切分的标准应该是依据于block的大小;而读入的效果,则是类似于这种<offset,line>,offset指的是每一行的偏移量,而line则是每一行的内容,这就是接下来Map阶段的输入。

2:map阶段

map阶段,就是我们通常使用的逻辑,当然,执行起来肯定不单单一个map,而是有很多map在众多节点上分布执行,这里面map基本上都会本地化读取,就是尽可能地读取本机的数据来进行map的处理;而对于处理的结果,会先写到内存中;就单说一个map吧,会源源不断地把结果写入到内存中,但是,这块内存区的大小是有限制的,不可能一直写,通常在其内存区写入达到80%的时候,map输出的结果,就会往磁盘内spill数据。

3:spill阶段

这部分,就是map生成的结果不断往磁盘内写数据的过程,而实际上,spill过程中,会按照partition的不同,分成不同的区,而在区内,数据是有序的;这里提到的区,数量与后面的reducetask的数量是一致的,方便reducetask拉取数据,简单说,就是分区有序,排序算法用的是快速排序;其实我觉得,在内存中排序其实更快一些,没看源码,具体逻辑不清楚了,总之,每次spill都会生成多个对应于多个partition的有序数据;而随着map执行完毕,通常会有partitionNum * spillTimes的文件;而且,每个map任务都有数据。

4:merge

其实,在Map端,应该也是有数据的merge,不仅仅是最后reduce拉取数据之前的combine使用;在这里,对于每个partition来说,都有很多的spill小文件,所以会把这些小文件汇聚成大文件,当然,这里也是排序的,采用归并排序的算法;最后,对于一个map任务来说,其管辖下的众多partition,各自会有自己的大文件,这里,就是reduce处理的Iterator的一小部分了;另外,这里必须要提一下combine,其内部实现逻辑基本与reduce一致,会把数据进行合并,目的就是减小拉取到reduce阶段的数据,比如说如果是max操作或者min操作,可以很大程度减小发送给reducer需要拉取的结果了。

这里,reducer也是优先处理本地的map生成的数据,但通常都要拉取很多文件,因为有些时候最终的reducer只有一个;这里,还要插播一句,map文件存储到本地会有一定的压缩策略,这也是减小reducer拉取数据的一个办法;综上,map端会对数据进行压缩,执行简单的combine逻辑,进行spill文件的合并,准备好reducer拉取的文件。

5:copy

这就是拉取的逻辑了,每个reducer都会从其他的mapper拉取数据,而且这里还存在一个mapReduce的瓶颈,那就是必须所有的map全部结束之后,reducer才能开始拉取数据;一般来说,reducer拉取到的数据,来自于多个mapper。

6:sort & merge

数据拉取过来之后,还需要进行排序:原因在于,虽然拉取到的数据属于一定的范围,但是直接组合在一起并不一定是有序的,所以还需要一定的排序操作;这里边的merge,指的是reducer端的merge,生成最终用于Reducer处理的数据;而reducer对于这些文件进行处理,生成最终的结果。

其实大家计算的过程中会看到,最终有多少个reducer,对应多少个分区,最后就会生成几个文件的。

shuffle原理大致如上。

其实MapReduce是存在几个瓶颈的:

  1. map结果写入磁盘:写入磁盘之后,后期还需要再进行读取出来,进行传输,这个性能其实是比较差的。注解:网上很多地方提到这一点,但是我觉得,如果不落盘的话,那怎么传输给reducer?内存传输?没搞懂大家为啥都一致认为这一点是spark要优于MR的地方,都是说spark内存运算。
  2. 当所有的mapper都结束之后,才能开始reducer的操作,这样导致有些执行比较快的mapper,只能空等,而如果让先完成的mapper可以直接把数据发送给reducer的话,对于性能有一定提升。

参考资料:

  1. http://blog.csdn.net/aijiudu/article/details/72353510
  2. http://blog.csdn.net/techchan/article/details/53405519

这篇关于浅谈MapReduce核心之shuffle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141175

相关文章

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

JAVA初级掌握的J2SE知识(二)和Java核心的API

/** 这篇文章送给所有学习java的同学,请大家检验一下自己,不要自满,你们正在学习java的路上,你们要加油,蜕变是个痛苦的过程,忍受过后,才会蜕变! */ Java的核心API是非常庞大的,这给开发者来说带来了很大的方便,经常人有评论,java让程序员变傻。 但是一些内容我认为是必须掌握的,否则不可以熟练运用java,也不会使用就很难办了。 1、java.lang包下的80%以上的类

浅谈java向上转型和乡下转型

首先学习每一种知识都需要弄明白这知识是用来干什么使用的 简单理解:当对象被创建时,它可以被传递给这些方法中的任何一个,这意味着它依次被向上转型为每一个接口,由于java中这个设计接口的模式,使得这项工作不需要程序员付出任何特别的努力。 向上转型的作用:1、为了能够向上转型为多个基类型(由此而带来的灵活性) 2、使用接口的第二个原因却是与使用抽象基类相同,防止客户端创建该类的对象,并确保这仅仅

JVM、JRE和 JDK:理解Java开发的三大核心组件

Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心组件。本文将探讨JVM、JDK和JRE的区别,帮助你更好地理解Java的运行机制。 1. JVM:Java虚拟机(Java Virtual Machine) 什么是JVM? JVM,即

【前端安全】浅谈XSS攻击和防范

定义 XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 分类 大分类小分类原理非存储DOM型① 不需要经过服务器