`
翻滚吧--少年
  • 浏览: 25031 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Shuffle过程剖析及MapReduce性能优化

阅读更多

 

Shuffle过程剖析及性能优化

MapReduce确保每个reducer的输入都按键排序。

Shuffle:系统执行排序的过程—将map输出作为输入传给reducer(如图1、图2)。


1


2

如图1、图2所示,从map输出到reduce输入就是shuffle阶段。但实际执行过程远比上图所示复杂。

Shuffle 是指从Map 产生输出开始,包括系统执行排序以及传送Map 输出到Reducer 作为输入的过程。

详细执行如图3所示:


3

1.    Map

Map 开始产生输出时,它并不是简单的把数据写到磁盘,因为频繁的磁盘操作会导致性能严重下降。它的处理过程更复杂,数据首先是写到内存中的一个缓冲区,并做了一些预排序,以提升效率。

每个Map 任务都有一个用来写入输出数据的循环内存缓冲区。这个缓冲区默认大小是100MB,可以通过io.sort.mb属性来设置具体大小。当缓冲区中的数据量达到一个特定阀值(io.sort.mb * io.sort.spill.percent,其中io.sort.spill.percent默认是0.80)时,系统将会启动一个后台线程把缓冲区中的内容spill 到磁盘。在spill 过程中,Map 的输出将会继续写入到缓冲区,但如果缓冲区已满,Map 就会被阻塞直到spill 完成。spill 线程在把缓冲区的数据写到磁盘前,会对它进行一个二次快速排序,首先根据数据所属的partition 排序,然后每个partition 中再按Key 排序。输出包括一个索引文件和数据文件。

如果设定了Combiner,将在排序输出的基础上运行。Combiner 就是一个Mini Reducer,它在执行Map 任务的节点本身运行,先对Map 的输出做一次简单Reduce,使得Map 的输出更紧凑,更少的数据会被写入磁盘和传送到Reducer

spill 文件保存在由mapred.local.dir指定的目录中,Map 任务结束后删除。

每当内存中的数据达到spill 阀值的时候,都会产生一个新的spill 文件,所以在Map任务写完它的最后一个输出记录时,可能会有多个spill 文件。在Map 任务完成前,所有的spill 文件将会被归并排序为一个索引文件和数据文件。这是一个多路归并过程,最大归并路数由io.sort.factor控制(默认是10)。如果设定了Combiner,并且spill文件的数量至少是3(由min.num.spills.for.combine 属性控制),那么Combiner 将在输出文件被写入磁盘前运行以压缩数据。

对写入到磁盘的数据进行压缩,通常是一个很好的方法,因为这样做使得数据写入磁盘的速度更快,节省磁盘空间,并减少需要传送到Reducer 的数据量。默认输出是不被压缩的, 但可以很简单的设置mapred.compress.map.outputtrue 启用该功能。压缩所使用的库由mapred.map.output.compression.codec来设定。

spill 文件归并完毕后,Map 将删除所有的临时spill 文件,并告知TaskTracker 任务已完成。Reducers 通过HTTP 来获取对应的数据。用来传输partitions 数据的工作线程数由tasktracker.http.threads控制,这个设定是针对每一个TaskTracker 的,并不是单个Map,默认值为40,在运行大作业的大集群上可以增大以提升数据传输速率。

2.    Reduce

2.1 copy阶段

Map 的输出文件放置在运行Map 任务的TaskTracker 的本地磁盘上(注意:Map 输出总是写到本地磁盘,但Reduce 输出不是,一般是写到HDFS),它是运行Reduce 任务的TaskTracker 所需要的输入数据。Reduce 任务的输入数据分布在集群内的多个Map 任务的输出中,Map 任务可能会在不同的时间内完成,只要完成的Map 任务数达到占总Map任务数一定比例(mapred.reduce.slowstart.completed.maps默认0.05),Reduce 任务就开始拷贝它的输出。

         Reduce 任务拥有多个拷贝线程, 可以并行的获取Map 输出。可以通过设定mapred.reduce.parallel.copies来改变线程数,默认是5

如果Map 输出足够小,它们会被拷贝到Reduce TaskTracker 的内存中(缓冲区的大小

mapred.job.shuffle.input.buffer.percent控制,指定了用于此目的的堆内存的百分比);如果缓冲区空间不足,会被拷贝到磁盘上。当内存中的缓冲区用量达到一定比例阀值(由mapred.job.shuffle.merge.percent控制),或者达到了Map 输出的阀值大小(由mapred.inmem.merge.threshold控制),缓冲区中的数据将会被归并然后spill 到磁盘。

拷贝来的数据叠加在磁盘上,有一个后台线程会将它们归并为更大的排序文件,这样做节省了后期归并的时间。对于经过压缩的Map 输出,系统会自动把它们解压到内存方便对其执行归并。

2.2 sort阶段

当所有的Map 输出都被拷贝后,Reduce 任务进入排序阶段(更恰当的说应该是归并阶段,因为排序在Map 端就已经完成),这个阶段会对所有的Map 输出进行归并排序,这个工作会重复多次才能完成。

假设这里有50 Map 输出(可能有保存在内存中的),并且归并因子是10(由io.sort.factor控制,就像Map 端的merge 一样),那最终需要5 次归并。每次归并会把10个文件归并为一个,最终生成5 个中间文件。

注:每趟合并的文件数实际上比示例中展示的更微妙。目标是合并最小数量的文件以便满足最后一趟的合并系数。因此如果是40个文件,我们不会在四趟中,每趟合并10个文件从而得到4个文件。相反,第一趟只合并4个文件,随后三趟合并所有十个文件。在最后一趟中,4个已合并的文件和余下的6个(未合并的)文件合计10个文件。这并没有改变合并的次数,它只是一个优化措施,尽量减少写到磁盘的数据量,因为最后一趟总是直接合并到reduce

2.3 reduce阶段

Reduce 阶段,Reduce 函数会作用在排序输出的每一个key 上。这个阶段的输出被直接写到输出文件系统,一般是HDFS。在HDFS 中,因为TaskTracker 节点也运行着一个DataNode 进程,所以第一个块备份会直接写到本地磁盘。

3.    配置调优

该配置调优方案主要是对以上Shuffle整个过程中涉及到的配置项按流程顺序一一呈现并给以调优建议。

1. Map

1) io.sort.mb

用于map输出排序的内存缓冲区大小

类型:Int

默认:100mb

备注:如果能估算map输出大小,就可以合理设置该值来尽可能减少溢出写的次数,这对调优很有帮助。

 

2)io.sort.spill.percent

map输出排序时的spill阀值(即使用比例达到该值时,将缓冲区中的内容spill 到磁盘)

类型:float

默认:0.80

 

3)io.sort.factor

归并因子(归并时的最多合并的流数),mapreduce阶段都要用到

类型:Int

默认:10

备注:将此值增加到100是很常见的。

 

4)min.num.spills.for.combine

运行combiner所需的最少溢出写文件数(如果已指定combiner

类型:Int

默认:3

 

5)mapred.compress.map.output

map输出是否压缩

类型:Boolean

默认:false

备注:如果map输出的数据量非常大,那么在写入磁盘时压缩数据往往是个很好的主意,因为这样会让写磁盘的速度更快,节约磁盘空间,并且减少传给reducer的数据量。

 

6)mapred.map.output.compression.codec

用于map输出的压缩编解码器

类型:Classname

默认:org.apache.hadoop.io.compress.DefaultCodec

备注:推荐使用LZO压缩。Intel内部测试表明,相比未压缩,使用LZO压缩的 TeraSort作业,运行时间减少60%,且明显快于Zlib压缩。

 

7) tasktracker.http.threads

每个tasktracker的工作线程数,用于将map输出到reducer

(注:这是集群范围的设置,不能由单个作业设置)

类型:Int

默认:40

备注:tasktrackerhttp服务的线程数。用于reduce拉取map输出数据,大集群可以将其设为40~50

 

2. reduce

1)mapred.reduce.slowstart.completed.maps

调用reduce之前,map必须完成的最少比例

类型:float

默认:0.05

 

2)mapred.reduce.parallel.copies

reducercopy阶段同时从mapper上拉取的文件数

类型:int

默认:5

 

3)mapred.job.shuffle.input.buffer.percent

shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比

类型:float

默认:0.70

 

4)mapred.job.shuffle.merge.percent

map输出缓冲区(由mapred.job.shuffle.input.buffer.percent定义)使用比例阀值,当达到此阀值,缓冲区中的数据将会被归并然后spill 到磁盘。

类型:float

默认:0.66

 

5)mapred.inmem.merge.threshold

map输出缓冲区中文件数

类型:int

默认:1000

备注:0或小于0的数意味着没有阀值限制,溢出写将有mapred.job.shuffle.merge.percent单独控制。

 

6)mapred.job.reduce.input.buffer.percent

reduce过程中,在内存中保存map输出的空间占整个堆空间的比例。

类型:float

默认:0.0

备注:reduce阶段开始时,内存中的map输出大小不能大于该值。默认情况下,在reduce任务开始之前,所有的map输出都合并到磁盘上,以便为reducer提供尽可能多的内存。然而,如果reducer需要的内存较少,则可以增加此值来最小化访问磁盘的次数,以提高reduce性能。

 

3.性能调优补充

相对于大批量的小文件,hadoop更合适处理少量的大文件。一个原因是FileInputFormat生成的InputSplit是一个文件或该文件的一部分。如果文件很小,并且文件数量很多,那么每次map任务只处理很少的输入数据,每次map操作都会造成额外的开销。

 

问题一:大批量的小文件处理(如果可能,应该尽量避免该情况)

解决方案:用CombineFileInputFormat输入文件,它能把多个文件打包到一个分片中以便每个mapper可以处理更多的数据。关键是,决定哪些块放入同一个分片时,CombineFileInputFormat会考虑到节点和机架的因素,所以在典型MapReduce作业中处理输入的速度并不会下降。

 

问题二:如何控制map数量以及设置合适的reduce数量

参考:

   http://chenwq.iteye.com/blog/1535809

           http://blog.csdn.net/strongerbit/article/details/7440111

           http://blog.csdn.net/wf1982/article/details/6672607

 

 

文中图片详见附件

若有说的不恰当的地方欢迎指教。。。

  • 大小: 27.6 KB
  • 大小: 36.2 KB
  • 大小: 113.3 KB
分享到:
评论

相关推荐

    MapReduce中shuffle优化与重构 (2012年)

    详细介绍 MapReduce编程框架,具体分析yMapReduce中shuffle阶段流程。分别从Map端数据压缩、重构远程数据拷贝传输协议、Reduce端内存分配优化三方面来...实验结果证明优化重构后的Shuffle能显著提高MapReduce计算性能。

    Spark的Shuffle总结分析

    一、shuffle原理分析 1.1 shuffle概述 Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。 在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据...

    MapReduceshuffle过程剖析及调优

    本文来自于网络,介绍了Mapper端,环形Buffer数据结构,Spill,合并Spill文件,Reducer端,...本文详细地解析shuffle过程,深入理解这个过程对于MapReduce调优至关重要,某种程度上说,shuffle过程是MapReduce的核心

    Hadoop从入门到上手企业开发

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

    javashuffle源码-MapReduce-Demo:Hadoop,MapReduce编程学习练手实例

    这里放一个我学习MapReduce的编程实例项目吧,本来是想把这些分开写成多篇文章的,能够详细叙述我学习过程中感想。但无奈,时间不够,只好在Github上创建了该项目,在代码中由较为详细的注释,我想也足够了吧。 该...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    6.2.1 了解哪些因素会影响MapReduce 作业的性能 6.2.2 map 端异常 技术点28 发现输入数据中的坑 技术点29 确定map 端数据倾斜问题 技术点30 判定map 任务吞吐量 技术点31 小文件 技术点32 不可切割的...

    Hadoop实战(第2版)

    技术点41 内存交换技术点42 磁盘健康技术点43 网络6.3 可视化技术点44 提取并可视化任务执行时间6.4 优化 .6.4.1 剖析MapReduce 的用户代码 技术点45 剖析map 和reduce 任务 6.4.2 参数配置6.4.3...

    Hadoop权威指南 第二版(中文版)

     剖析MapReduce作业运行机制  作业的提交  作业的初始化  任务的分配  任务的执行  进度和状态的更新  作业的完成  失败  任务失败  tasktracker失败  jobtracker失败  作业的调度  Fair Scheduler  ...

    Java大数据培训学校全套教程-50)Hadoop与MapReduce最入门

     通过学习Hadoop的安装与配置,hdfs常用命令,WordCount程序详解,Shuffle过程详解,WordCount程序结果分析,Hadoop,HDFS,MapReduce,NameNode和DataNode,yarn,ResourceManager,NodeManager的概念等让大家对Hadoop和...

    论文研究-基于延迟调度策略的reduce调度优化算法.pdf

    提出了一种基于延迟调度策略的reduce任务调度优化算法,通过提高reduce任务的数据本地性来减少作业执行时间以及提高作业吞吐量,该算法在Hadoop架构的early shuffle阶段,使用多级延迟调度策略来提高reduce任务的...

    Hadoop权威指南(中文版)2015上传.rar

    剖析MapReduce作业运行机制 作业的提交 作业的初始化 任务的分配 任务的执行 进度和状态的更新 作业的完成 失败 任务失败 tasktracker失败 jobtracker失败 作业的调度 Fair Scheduler Capacity Scheduler shuffle和...

    Hadoop开发者第一期入门专刊

    50 MapReduce 中的Shuffle 和Sort 分析 53 海量数据存储和计算平台的调试器研究 56 探讨MapReduce 模型的改进 58 运行eclipse 编译出的Hadoop 框架 59 表关联在MapReduce 上的实现 63 Hadoop 计算平台和Hadoop 数据...

    Apache Spark的设计与实现 PDF中文版

    本文主要讨论 Apache Spark 的设计与实现,重点关注其设计思想、运行原理、实现架构及性能调优,附带讨论与 Hadoop MapReduce 在设计与实现上的区别。不喜欢将该文档称之为“源码分析”,因为本文的主要目的不是去...

    《ApacheSpark设计与实现》.zip

    本文主要讨论 Apache Spark 的设计与实现,重点关注其设计思想、运行原理、实现架构及性能调优,附带讨论与 Hadoop MapReduce 在设计与实现上的区别。不喜欢将该文档称之为“源码分析”,因为本文的主要目的不是...

    大数据导论-6.1.4-熟悉大数据处理技术——大数据的处理模式.pptx

    MapReduce提供了以下的主要功能: 1)数据划分和计算任务调度 2)数据/代码互定位 3)系统优化 4)出错检测和恢复 二、批处理模式——1. MapReduce批处理 MapReduce设计上具有以下主要的技术特征: 1)向"外"横向...

    hadoop段海涛老师八天实战视频

    03-mapreduce介绍及wordcount.avi 04-wordcount的编写和提交集群运行.avi 05-mr程序的本地运行模式.avi 06-job提交的逻辑及YARN框架的技术机制.avi 07-MR程序的几种提交运行模式.avi 08-YARN的通用性意义.avi ...

    基于大数据下的spark快速大数据分析.pdf

    Spark 通过优化传统的 MapReduce 模型来满足之前 HDFS 以及 MapReduce 无法解决的问题, 大大提高了效率, 为处理流式数据以及 其他需求提供了捷径。 关键词: 大数据; 数据分析; 计算; 数据处理 中图分类号: TP...

Global site tag (gtag.js) - Google Analytics