当发现作业运行效率不理想时,需要对作业执行进行性能监测,以及对作业本身、集群平台进行优化。优化后的集群可能最大化利用硬件资源,从而提高作业的执行效率。本文记录了在hadoop集群平台搭建以及作业运行过程中一些常用优化手段,在使用中会不断补充,不断翻阅。

一、对应用程序进行调优

1、避免输入大量小文件。大量的小文件(不足一个block大小)作为输入数据会产生很多的Map任务(默认一个分片对应一个Map任务),而每个Map任务实际工作量又非常小,系统要花更多的时间来将这些Map任务的输出进行整合。如果将大量的小文件进行预处理合并成一个或几个大文件,任务执行的效率可能会提升几十倍。可手动将小文件合并成大文件,或通过Hadoop的SequenceFile、CombineFileInputFormat将多个文件打包到一个输入单元中,使得每个Map处理更多的数据,从而提高性能。

2、预判并过滤无用数据。可以使用一些过滤工具,在作业执行之前将数据中无用的数据进行过滤,可极大提高MapReduce执行效率。Bloom Filter是一种功能强大的过滤器,执行效率高,时间复杂度为O(1),缺点是存在一定的误判可能,详细参考《Bloom Filter概念和原理》。当将一个非常大的表和一个非常小的表进行表连接操作时,可以使用Bloom Filter将小表数据作为Bloom Filter的输入数据,将大表的原始数据进行过滤(过滤不通过的数据一定是不可用的,过滤通过的数据可能有用可能无用),可提高程序执行的效率。

3、合理使用分布式缓存DistributedCache。DistributedCache可以将一些字典、jar包、配置文件等缓存到需要执行map任务的节点中,避免map任务多次重复读取这些资源,尤其在join操作时,使用DistributedCache缓存小表数据在map端进行join操作,可避免shuffle、reduce等操作,提高程序运行效率。

4、重用Writable类型。避免大量多次new这些Writable对象,这会花费java垃圾收集器大量的清理工作,建议在map函数外定义这些Writable对象,如下所示:

class MyMapper … {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
for (String word: words) {
wordText.set(word);
context.write(wordText, one);
}
}
}

5、合理设置Combiner。Combine阶段处于Map端操作的最后一步,设置Combine操作可大大提高MapReduce的执行效率,前提是增加Combine不能改变最终的结果值,换句话说,不是所有的MapReduce程序都能添加Combine,如求平均数的MapReduce程序就不适合设置Combine操作。通常Combine函数与Reduce函数一致

二、对参数进行调优(基于hadoop2.6.0)

1、HDFS参数调优(hdfs-site.xml)

   ▶ dfs.namenode.handler.count:namenode用于处理RPC的线程数,默认值10,可根据NameNode所在节点机器配置适当调大,如32、64;

   ▶ dfs.datanode.handler.count:datanode上用于处理RPC的线程数,2.6版本默认值10,早期1.x版本默认值为3,可根据datanode节点的配置适当调整;

2、MapReduce参数调优(mapred-site.xml)

   ▶ mapreduce.tasktracker.map.tasks.maximum:每个nodemanager节点上可运行的最大map任务数,默认值2,可根据实际值调整为10~100;

   ▶ mapreduce.tasktracker.reduce.tasks.maximum:每个nodemanager节点上可运行的最大reduce任务数,默认值2,可根据实际值调整为10~100;

   ▶ mapreduce.output.fileoutputformat.compress:是否对map任务产生的结果进行压缩,默认值false。对传输数据进行压缩,既可以减少文件的存储空间,又可以加快数据在网络不同节点之间的传输速度。

   ▶ mapreduce.output.fileoutputformat.compress.type:map产生任务数据的压缩方式,默认值RECORD,可配置值有:NONE、RECORD、BLOCK

   ▶ mapreduce.task.io.sort.mb:map任务输出结果的内存环形缓冲区大小,默认值100M,可根据map节点的机器进行配置,貌似不能超过值mapred.child.java.opts;

   ▶ mapreduce.map.sort.spill.percent:map任务输出环形缓冲区大小溢写触发最大比例,默认值80%,这个值一般不建议修改;

   ▶ mapreduce.reduce.shuffle.parallelcopies:reduce节点通过http拷贝map输出结果数据到本地的最大工作线程数,默认值5,可根据节点机器配置适当修改;

   ▶ mapreduce.reduce.shuffle.input.buffer.percent:reduce节点在shuffle阶段拷贝map输出结果数据到本地时,内存缓冲区大小所占JVM内存的比例,默认值0.7,一般不建议修改;

   ▶ mapreduce.reduce.shuffle.merge.percent:reduce节点shuffle内存缓冲区溢写触发最大比例,默认值0.66,一般不建议修改;

   ▶ mapred.child.java.opts:配置每个map或reduce使用的内存数量,默认值-Xmx200m,即200M。如果nodemanager所在节点

Hadoop平台常用配置及优化建议的更多相关文章

  1. Mysql常用配置及优化

    [client]# 该目录下的内容常用来进行localhost登陆,一般不需要修改port = 3306 # 端口号socket = /var/lib/mysql/mysql.sock # 套接字文件 ...

  2. Jquery学习笔记--性能优化建议

    一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...

  3. Tomcat记录-tomcat常用配置详解和优化方法(转载)

    常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...

  4. tomcat常用配置详解和优化方法

    tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...

  5. Hadoop平台配置汇总

    Hadoop平台配置汇总 @(Hadoop) Hadoop hadoop-env.sh和yarn-env.sh中export log和pid的dir即可和JAVA_HOME. core-site.xm ...

  6. IDEA的常用配置(Maven)一键导入及优化内存

    IDEA的常用配置一键导入 一.在https://www.cnblogs.com/zyx110/p/10799387.html中下载如图的压缩包 下载完成后解压缩,点击settings_bak,你会看 ...

  7. 四、华为VRP平台介绍和常用配置

    一.华为VRP平台 华为现用的平台是VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台. 包含华为产品中的路由.交换.安全.无线等等 二.华为设备管 ...

  8. Unity 几种优化建议

    转: http://user.qzone.qq.com/289422269/blog/1453815561?ptlang=2052 Unity 几种优化建议 最简单的优化建议: 1.PC平台的话保持场 ...

  9. unity优化建议

    使用Profiler工具分析内存占用情况 System.ExecutableAndDlls:系统可执行程序和DLL,是只读的内存,用来执行所有的脚本和DLL引用.不同平台和不同硬件得到的值会不一样,可 ...

随机推荐

  1. iTextSharp简单生成pdf和操作pdf添加水印

    遇到需要导出页面到pdf,并添加pdf水印的业务.稍微研究了下,借阅网友的前车之鉴,经过使用可行之后的代码贴出来,做个记录,也供需要的网友借阅. public class PDFSetWaterMar ...

  2. Spring整合web开发

    正常整合Servlet和Spring没有问题的 public class UserServlet extends HttpServlet { public void doGet(HttpServlet ...

  3. iOS ---不一样的NSLog打印(精准打印)

    在iOS开发过程中,调试是很重要的过程,而除了各种断点调试(普通断点.条件断点.全局断点)之外,似乎NSLog是我们调试最常用的方法,当然,也是最简单朴素的寻debug方法. 在项目中,我们常使用的N ...

  4. Webkit 文字和背景效果

    -webkit-background-clip:padding-box | border-box | content-box | text,指定对象的背景图像向外裁剪的区域.对应的脚本特性为backg ...

  5. [NOIP2012]借教室 题解

    题目大意: 有一个n个数的数列,m个操作,第i个操作使[li,ri]区间建di,问第几个操作使数列中出现负数. 思路: 暴力显然过不了,那么就可以优化了,不难想到线段树,显然需要良好的姿势,那么就差分 ...

  6. 数据库 sql server

    1. if exists(select * from sys.objects where name='test') drop table test go create table test ( id ...

  7. 视频直播点播nginx-rtmp开发手册中文版

    2016年8月18日12:42:35 参照官方文档https://github.com/arut/nginx-rtmp-module/wiki/Directives 请注意这个是粗翻译版,仅供参考,不 ...

  8. HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  9. Android新权限机制 AppOps

    http://blog.csdn.net/hyhyl1990/article/details/46842915 http://m.blog.csdn.net/article/details?id=51 ...

  10. percona-toolkit中在线ddl

    percona-toolkit中在线ddl percona-toolkit工具提供了一组用于mysql操作的工具,比如主从复制,在线更改mysql表ddl等 一.安装1.安装perl(略)2.BI&a ...