`
flyingdutchman
  • 浏览: 358973 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hadoop深入学习:MapReduce的Shuffle过程详解

阅读更多
         在本节中,我们再来仔细回顾一下MapReduce编程框架的所谓的“洗牌”过程,即MapReduce的Shuffle过程,可以说Shuffle是MapReduce编程框架的核心,能直接影响到MapReduce的性能。实际上,对MapReduce的调优在很大程度上就是对MapReduce Shuffle的性能的调优。
         那么,Shuffle到底在MapReduce处于哪个阶段呢?实际上,从Map Task任务中的map()方法中的最后一步调用即输出中间数据开始,一直到Reduce Task任务开始执行reduce()方法结束,这一中间处理过程就被称为MapReduce的Shuffle。Shuffle过程分为两个阶段:Map端的shuffle阶段和Reduce端的Shuffle阶段。

         Shuffle流程:
         第一步,Collect阶段。
         在Map Task任务的业务处理方法map()中,最后一步通过OutputCollector.collect(key,value)或context.write(key,value)输出Map Task的中间处理结果,在相关的collect(key,value)方法中,会调用Partitioner.getPartition(K2 key, V2 value, int numPartitions)方法获得输出的key/value对应的分区号(分区号可以认为对应着一个要执行Reduce Task的节点),然后将<key,value,partition>暂时保存在内存中的MapOutputBuffe内部的环形数据缓冲区,该缓冲区的默认大小是100MB,可以通过参数io.sort.mb来调整其大小。
         当缓冲区中的数据使用率达到一定阀值后,触发一次Spill操作,将环形缓冲区中的部分数据写到磁盘上,生成一个临时的Linux本地数据的spill文件;然后在缓冲区的使用率再次达到阀值后,再次生成一个spill文件。直到数据处理完毕,在磁盘上会生成很多的临时文件。
         MapOutputBuffe内部存数的数据采用了两个索引结构,涉及三个环形内存缓冲区。下来看一下两级索引结构:
         再来看一下这三个环形缓冲区:
         1)、kvoffsets缓冲区,也叫偏移量索引数组,用于保存key/value信息在位置索引kvindices中的偏移量。当kvoffsets的使用率超过io.sort.spill.percent(默认为80%)后,便会触发一次SpillThread线程的“溢写”操作,也就是开始一次Spill阶段的操作。
         2)、kvindices缓冲区,也叫位置索引数组,用于保存key/value在数据缓冲区kvbuffer中的起始位置。
         3)、kvbuffer即数据缓冲区,用于保存实际的key/value的值。默认情况下该缓冲区最多可以使用io.sort.mb的95%,当kvbuffer使用率超过io.sort.spill.percent(默认为80%)后,便会出发一次SpillThread线程的“溢写”操作,也就是开始一次Spill阶段的操作。
        
         第二步,Spill阶段。
         当缓冲区的使用率达到一定阀值后,触发一次“溢写”操作,将环形缓冲区中的部分数据写到Linux的本地磁盘。
         需要特别注意的是,在将数据写磁盘之前,先要对要写磁盘的数据进行一次排序操作,先按<key,value,partition>中的partition分区号排序,然后再按key排序,再必要的时候,比如说配置了Combiner并且当前系统的负载不是很高的情况下会将有相同partition分区号和key的数据做聚合操作,还有如果设置而对中间数据做压缩的配置则还会做压缩操作。
         第三步,Combine阶段。
         待Map Task任务的所有数据都处理完后,会对任务产生的所有中间数据文件做一次合并操作,以确保一个Map Task最终只生成一个中间数据文件。
         第四步,Copy阶段。
         默认情况下,当整个MapReduce作业的所有已执行完成的Map Task任务数超过Map Task总数的5%后,JobTracker便会开始调度执行Reduce Task任务。然后Reduce Task任务默认启动mapred.reduce.parallel.copies(默认为5)个MapOutputCopier线程到已完成的Map Task任务节点上分别copy一份属于自己的数据。
         这些copy的数据会首先保存的内存缓冲区中,当内冲缓冲区的使用率达到一定阀值后,则写到磁盘上。
         第五步,Merge阶段。
         在远程copy数据的同时,Reduce Task在后台启动了两个后台线程对内存和磁盘上的数据文件做合并操作,以防止内存使用过多或磁盘生的文件过多。
         第六步,Sort阶段。
         在合并的同时,也会做排序操作。由于各个Map Task已经实现对数据做过局部排序,故此Reduce Task只需要做一次归并排序即可保证copy数据的整体有序性。
         执行完合并与排序操作后,Reduce Task会将数据交给reduce()方法处理。
   
       
分享到:
评论

相关推荐

    MapReduce详解Shuffle过程

    MapReduce详解Shuffle过程 MapReduce是Hadoop生态系统中的一种分布式计算框架,而Shuffle过程是MapReduce的核心部分。Shuffle过程是将map task的输出结果传送到reduce task的过程,顾名思义,Shuffle就是洗牌或弄乱...

    深入云计算:Hadoop应用开发实战详解 源代码

    本篇文章将基于"深入云计算:Hadoop应用开发实战详解 源代码"这一主题,深入探讨Hadoop在云计算环境中的应用与开发实践。 Hadoop是Apache基金会开发的一个分布式计算系统,主要由Hadoop Distributed File System ...

    006_hadoop中MapReduce详解_3

    "006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个部分,我们可能会探讨更深入的技术细节和优化策略。 MapReduce的工作流程分为两个主要...

    hadoop文档, hdfs mapreduce,环境搭建,例子介绍等

    ### Hadoop概述与环境搭建详解 #### 一、Hadoop简介 Hadoop是一个开源软件框架,主要用于处理大规模数据集(GB到PB级别)的分布式计算。它最初由Apache基金会开发,现已成为大数据处理领域的基石之一。Hadoop的核心...

    MapReduce平台优化详解.pdf

    MapReduce平台优化详解 MapReduce平台优化是Hadoop生态系统中的一种关键技术,旨在提高MapReduce作业的执行效率和性能。本文将从MapReduce优化的角度,深入剖析MapReduce平台的优化方法,涵盖Combiner、Partitioner...

    Hadoop_MapReduce教程

    ### Hadoop MapReduce 教程知识点详解 #### 一、Hadoop MapReduce 概述 Hadoop MapReduce 是一个强大的分布式计算框架,主要用于处理大规模数据集。它通过将任务分解成多个子任务来实现并行处理,从而极大地提高了...

    005_hadoop中MapReduce详解_2

    在Hadoop生态系统中,MapReduce是一种分布式计算框架,它允许我们处理海量数据并行化,非常适合大规模数据集的处理...通过阅读和分析像`TestMR.java`这样的源代码,我们可以深入学习并熟练运用MapReduce解决实际问题。

    MapReduce计算模式详解

    ### MapReduce计算模式详解 #### 一、MapReduce简单概述 MapReduce是一种高效的大数据处理技术,它由Google提出并在Hadoop中得到了广泛的应用。MapReduce不仅是一个计算平台,还是一个并行计算框架和并行程序设计...

    Hadoop-Programs:Hadoop-MapReduce

    在2015年的夏季,通过对《Hadoop权威指南》的深入学习,我们可以理解MapReduce的基本工作原理及其编程模型。 **MapReduce的基本概念** 1. **Map阶段**: 在Map阶段,输入数据被分割成多个块,并在集群中的多台机器...

    MapReduce工作知识原理.pdf

    MapReduce工作原理详解 Hadoop是一个开源的分布式计算框架,起源于Apache项目,专注于大规模数据的分布式存储和处理。它的核心特性包括可扩展性、经济性、高效性和可靠性,使得处理PB级别的数据变得可能,同时利用...

    Hadoop应用开发技术详解

    7. Hadoop开发与调试:学习如何使用Hadoop开发工具,如Eclipse插件或IntelliJ IDEA插件,以及如何编写和测试MapReduce程序,理解和使用Hadoop命令行工具进行数据操作。 8. 性能优化:Hadoop应用的性能优化是关键,...

    Hadoop MapReduce.pdf

    ### Hadoop MapReduce知识点概述 #### 一、Hadoop MapReduce简介 Hadoop MapReduce是一种分布式数据处理模型,主要用于大规模数据集的并行处理。它包括两个主要阶段:Map(映射)和Reduce(归约)。MapReduce的...

    详解shuffle过程

    Hadoop Shuffle 过程详解 Hadoop 的 Shuffle 过程是 MapReduce 的核心,也被称为奇迹发生的地方。要想理解 MapReduce,Shuffle 是必须要了解的。Shuffle 的正常意思是洗牌或弄乱,可能大家更熟悉的是 Java API里的 ...

    Hadoop权威指南中文版(完全版)

    2. HDFS详解:深入理解HDFS的数据存储模型,块的概念,副本策略,以及NameNode和DataNode的角色与工作流程。 3. MapReduce编程模型:掌握Map函数和Reduce函数的编写,了解shuffle和sort过程,以及JobTracker和...

    MapReduce详解包括配置文件

    ### MapReduce详解包括配置文件 #### 一、MapReduce概览与原理 MapReduce作为Hadoop的核心组件之一,提供了一种高效、可靠的分布式计算框架。它最初由Doug Cutting基于Google发表的论文《MapReduce: Simplified ...

    Hadoop MapReduce

    ### Hadoop MapReduce核心知识点详解 #### 一、Hadoop MapReduce概述 **Hadoop MapReduce** 是一种分布式计算模型,被广泛应用于大数据处理领域。它通过将大规模数据集分割成若干个小数据块,然后利用分布式计算...

    hadoop应用开发技术详解代码

    本书“Hadoop应用开发技术详解”的源代码涵盖了第3、4、5、7、8、10、11和12章的内容,为读者提供了丰富的实践示例,帮助理解并应用Hadoop生态系统中的关键组件。以下是对这些章节涉及知识点的详细解释: 1. **...

    hadoop源代码存档

    4. MapReduce工作流程:分析job.xml配置文件,理解JobTracker如何解析和调度任务,TaskTracker如何执行任务,以及shuffle和sort过程的实现。 5. 容错机制:探究Hadoop如何实现硬件故障的自动检测和数据恢复,如心跳...

    Hadoop从入门到上手企业开发

    062 MapReduce Shuffle过程讲解和Map Shuffle Phase讲解 063 Reduce Shuffle Phase讲解 064 源代码跟踪查看Map Task和Reduce Task数目的个数 065 回顾MapReduce执行过程以及MapReduce核心 066 Hadoop MapReduce框架...

Global site tag (gtag.js) - Google Analytics