当发现作业运行效率不理想时,需要对作业执行进行性能监测,以及对作业本身、集群平台进行优化。优化后的集群可能最大化利用硬件资源,从而提高作业的执行效率。本文记录了在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. ArcGIS 10与ArcEngine 10安装及破解

    1 2 3 4 5 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 百度经验:jingyan.baidu.com 现在常见的破解方法在下面的地址中已经详细附图说明了,但是这种破解方法,想 ...

  2. 缓存依赖中cachedependency对象

    缓存依赖主要提供以下功能:1.SQL 缓存依赖项可用于应用程序缓存和页输出缓存.2.可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项.3.可以在网络园(一台服务器上存在多个处理 ...

  3. Kinect的那些事儿

    Kinect结合Unity3d跑酷游戏体感Demo 今天收拾东西,在柜子的翻出了一台崭新的Kinect,说起来真是惭愧,大学毕业那会儿,慈老师(和名字一位慈祥的好老师,也是我的毕业设计指导老师)赞 助 ...

  4. YUM源设置

    1挂载光盘 先创建一个文件 /aaa 然后挂载mount /dev/cdrom /aaa 进入 /aaa   ls 查看是否挂载OK 2进入yum文件夹.将除Media以外的所有文件名改为XXXXXX ...

  5. wordpress 安装 "Table Prefix" must not be empty.

    时隔一年了,一年没有写代码了.又重拾代码,心情无法言表啊.互联网还是有机会的. 安装wordpress怎么装 setp2了就 报 "Table Prefix" must not b ...

  6. JS base64 加密和 后台 base64解密(防止中文乱码)

    直接上代码 1,js(2个文件,网上找的)  不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...

  7. Linux:使用nohup让进程在后台可靠运行

    学习之余我最大的乐趣是找一部不错的电影慢慢品味,这也是我缓解压力的最好方式之一,由于我常去的字幕组网站需要签到才可以下载字幕,像这种娱乐网站谁有时间天天记得去签到呢,but作为一个准程序猿应该有更好的 ...

  8. 打包ipa出现问题记录

    1.打包ipa事,Archive出现问题 解决方法:Xcode->系统偏好设置->Accounts->选中正在使用的账户->view details->download ...

  9. finnal 评论 II

    新蜂团队:俄罗斯方块界面设计给人眼前一亮的感觉,很喜欢他们界面的颜色搭配.功能上实现了俄罗斯方块的基本功能,并且没有bug.最重要的是游戏有自己的创新点在里面,很喜欢游戏的瞄准功能.总的来说项目完成的 ...

  10. elasticsearch-hadoop使用示例

    在elasticsearch-hadoop的具体使用中碰到了几个问题,有必要记录一下,避免下次遇到时又要重新研究. 利用spark读取es数据源的简单示例 import org.elasticsear ...