相信每个程序员在编程时都会问自己两个问题“我如何完成这个任务”,以及“怎么能让程序运行得更快”。同样,MapReduce计算模型的多次优化也是为了更好地解答这两个问题。
MapReduce计算模型的优化涉及了方方面面的内容,但是主要集中在两个方面:一是计算性能方面的优化;二是I/O操作方面的优化。这其中,又包含六个方面的内容。
1. 任务调度
任务调度是Hadoop中非常重要的一环,这个优化又涉及两个方面的内容。计算方面:Hadoop总会优先将任务分配给空闲的机器,使所有的任务能公平地分享系统资源。I/O方面:Hadoop会尽量将Map任务分配给InputSplit所在的机器,以减少网络I/O的消耗。
2. 数据预处理与InputSplit的大小
MapReduce任务擅长处理少量的大数据,而在处理大量的小数据时,MapReduce的性能就会逊色很多。因此在提交MapReduce任务前可以先对数据进行一次预处理,将数据合并以提高MapReduce任务的执行效率,这个办法往往很有效。如果这还不行,可以参考Map任务的运行时间,当一个Map任务只需要运行几秒就可以结束时,就需要考虑是否应该给它分配更多的数据。通常而言,一个Map任务的运行时间在一分钟左右比较合适,可以通过设置Map的输入数据大小来调节Map的运行时间。在FileInputFormat中(除了CombineFileInputFormat),Hadoop会在处理每个Block后将其作为一个InputSplit,因此合理地设置block块大小是很重要的调节方式。除此之外,也可以通过合理地设置Map任务的数量来调节Map任务的数据输入。
3. Map和Reduce任务的数量
合理地设置Map任务与Reduce任务的数量对提高MapReduce任务的效率是非常重要的。默认的设置往往不能很好地体现出MapReduce任务的需求,不过,设置它们的数量也要有一定的实践经验。
首先要定义两个概念—Map/Reduce任务槽。Map/Reduce任务槽就是这个集群能够同时运行的Map/Reduce任务的最大数量。比如,在一个具有1200台机器的集群中,设置每台机器最多可以同时运行10个Map任务,5个Reduce任务。那么这个集群的Map任务槽就是12000,Reduce任务槽是6000。任务槽可以帮助对任务调度进行设置。
设置MapReduce任务的Map数量主要参考的是Map的运行时间,设置Reduce任务的数量就只需要参考任务槽的设置即可。一般来说,Reduce任务的数量应该是Reduce任务槽的0.95倍或是1.75倍,这是基于不同的考虑来决定的。当Reduce任务的数量是任务槽的0.95倍时,如果一个Reduce任务失败,Hadoop可以很快地找到一台空闲的机器重新执行这个任务。当Reduce任务的数量是任务槽的1.75倍时,执行速度快的机器可以获得更多的Reduce任务,因此可以使负载更加均衡,以提高任务的处理速度。
4. Combine函数
Combine函数是用于本地合并数据的函数。在有些情况下,Map函数产生的中间数据会有很多是重复的,比如在一个简单的WordCount程序中,因为词频是接近与一个zipf分布的,每个Map任务可能会产生成千上万个<the, 1>记录,若将这些记录一一传送给Reduce任务是很耗时的。所以,MapReduce框架运行用户写的combine函数用于本地合并,这会大大减少网络I/O操作的消耗。此时就可以利用combine函数先计算出在这个Block中单词the的个数。合理地设计combine函数会有效地减少网络传输的数据量,提高MapReduce的效率。
在MapReduce程序中使用combine很简单,只需在程序中添加如下内容:
job.setCombinerClass(combine.class);
在WordCount程序中,可以指定Reduce类为combine函数,具体如下:
job.setCombinerClass(Reduce.class);
5. 压缩
编写MapReduce程序时,可以选择对Map的输出和最终的输出结果进行压缩(同时可以选择压缩方式)。在一些情况下,Map的中间输出可能会很大,对其进行压缩可以有效地减少网络上的数据传输量。对最终结果的压缩虽然会减少数据写HDFS的时间,但是也会对读取产生一定的影响,因此要根据实际情况来选择(第7章中提供了一个小实验来验证压缩的效果)。
6. 自定义comparator
在Hadoop中,可以自定义数据类型以实现更复杂的目的,比如,当读者想实现k-means算法(一个基础的聚类算法)时可以定义k个整数的集合。自定义Hadoop数据类型时,推荐自定义comparator来实现数据的二进制比较,这样可以省去数据序列化和反序列化的时间,提高程序的运行效率(具体会在第7章中讲解)。
相关推荐
1.计算机性能 2.I/O操作 2.Sequence File Sequence File
使用MapReduce优化大数据K均值聚类
摘要:为了提高k-nearestneighboralgorithm(KNN)算法处理大数据集的能力,本文利用MapReduce并行编程模型,同时结合KNN算法自
mapreduce开发优化文档
MapReduce平台优化详解.pdf
运用PML和EPC编码技术保证了数据存储的完整性,采用快速排序和改进XGrind压缩技术对MapReduce算法进行优化。根据实验可知,优化后MapReduce算法减小了64%的I/O吞吐和45%的CPU耗用,同时使查询数据效率提高了75%,可...
MapReduce中Shuffle优化与重构,彭辅权,金苍宏,如今Hadoop已成为目前最主流的云计算平台,在Hadoop分布式计算平台中,如何优化MapReduce计算性能是目前研究的一个热点问题。除了编写高
MapReduce模型在Hadoop实现中的性能分析及改进优化
MapReduce平台优化详解.pptx
从提高平台中每个执行节点的细粒度并行数据处理角度出发,结合Java共享内存多线程编程技术,对该模型进行了优化,提出一种MapReduce OpenMP粗细粒度相结合的分布式并行计算模型。并在由四个节点组成的Hadoop集群环境...
在实际Hadoop系统中,如何使作业完成时间最短成为了一个NP完全问题,导致这个问题的主要原因是MapReduce计算过程中大量的数据从Map节点向Reduce节点进行迁移,容易造成网络拥塞,使得数据迁移时间过长。软件定义网络...
在此研究基础之上,本文指出MapReduce应用可在程序、参数和系统三个层面进行优化。程序和参数两个层面实现优化的可选项很多,本文在第三章对此作了详细阐述。 Hadoop在管理资源中将内存和CPU两种计算资源捆绑在一起,...
基于MapReduce的大数据在线聚集优化设计.pdf
大数据挖掘中的MapReduce并行聚类优化算法研究 (1).pdf
检查在内存优化模式下系统性能的区别。 (实践二)计算器计数 模式描述、计数器结构及性能分析。 示例:计算每个州的用户数 (实践三)MapReduce 布隆过滤器 过滤器训练、过滤器应用、结果验证及分析 (实践四)...
#资源达人分享计划#
提出一种基于MapReduce技术的贝叶斯垃圾邮件过滤机制,一方面对传统贝叶斯过滤技术进行改进,另一方面利用MapReduce模型的海量数据处理优势优化邮件集训练与学习。实验,较之目前流行的传统贝叶斯算法、K最近邻(NN算法...
该文档给出了一种在异构集群上优化MapReduce的算法,并附演示文稿
文章目录一、MapReduce跑得慢的原因二、MapReduce优化方法(一)数据输入(二)Map阶段(三)Reduce阶段(四)I/O阶段(五)数据倾斜问题(六)常用的调优参数三、HDFS小文件优化方法 一、MapReduce跑得慢的原因 ...
23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化 网址:https://blog.csdn.net/chenwewi520feng/article/details/130457270 本文介绍在hadoop集群中,不适用默认的参数情况下,yarn的cpu和内容配置...