Mapreduce参数调节
http://blog.javachen.com/2014/06/24/tuning-in-mapreduce/
本文主要记录Hadoop 2.x版本中MapReduce参数调优,不涉及Yarn的调优。
Hadoop的默认配置文件(以cdh5.0.1为例):
说明:
在hadoop2中有些参数名称过时了,例如原来的
mapred.reduce.tasks改名为mapreduce.job.reduces了,当然,这两个参数你都可以使用,只是第一个参数过时了。
1. 操作系统调优
- 增大打开文件数据和网络连接上限,调整内核参数
net.core.somaxconn,提高读写速度和网络带宽使用率 - 适当调整
epoll的文件描述符上限,提高Hadoop RPC并发 关闭swap。如果进程内存不足,系统会将内存中的部分数据暂时写入磁盘,当需要时再将磁盘上的数据动态换置到内存中,这样会降低进程执行效率- 增加
预读缓存区大小。预读可以减少磁盘寻道次数和I/O等待时间 - 设置
openfile
2. Hdfs参数调优
2.1 core-default.xml:
hadoop.tmp.dir:
- 默认值: /tmp
- 说明: 尽量手动配置这个选项,否则的话都默认存在了里系统的默认临时文件/tmp里。并且手动配置的时候,如果服务器是多磁盘的,每个磁盘都设置一个临时文件目录,这样便于mapreduce或者hdfs等使用的时候提高磁盘IO效率。
fs.trash.interval:
- 默认值: 0
- 说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。一般开启这个会比较好,以防错误删除重要文件。单位是分钟。
io.file.buffer.size:
- 默认值:4096
- 说明:SequenceFiles在读写中可以使用的缓存大小,可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 到 131072。
2.2 hdfs-default.xml:
dfs.blocksize:
- 默认值:134217728
- 说明: 这个就是hdfs里一个文件块的大小了,CDH5中默认128M。太大的话会有较少map同时计算,太小的话也浪费可用map个数资源,而且文件太小namenode就浪费内存多。根据需要进行设置。
dfs.namenode.handler.count:
- 默认值:10
- 说明:设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanodes 沟通。当 datanodes 数量太多时会发現很容易出現 RPC timeout,解決方法是提升网络速度或提高这个值,但要注意的是 thread 数量多也表示 namenode 消耗的内存也随着增加
3. MapReduce参数调优
包括以下节点:
- 合理设置槽位数目
- 调整心跳配置
- 磁盘块配置
- 设置RPC和线程数目
- 启用批量任务调度
3.1 mapred-default.xml:
mapred.reduce.tasks(mapreduce.job.reduces):
- 默认值:1
- 说明:默认启动的reduce数。通过该参数可以手动修改reduce的个数。
mapreduce.task.io.sort.factor:
- 默认值:10
- 说明:Reduce Task中合并小文件时,一次合并的文件数据,每次合并的时候选择最小的前10进行合并。
mapreduce.task.io.sort.mb:
- 默认值:100
- 说明: Map Task缓冲区所占内存大小。
mapred.child.java.opts:
- 默认值:-Xmx200m
- 说明:jvm启动的子线程可以使用的最大内存。建议值
-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@taskid@.gc
mapreduce.jobtracker.handler.count:
- 默认值:10
- 说明:JobTracker可以启动的线程数,一般为tasktracker节点的4%。
mapreduce.reduce.shuffle.parallelcopies:
- 默认值:5
- 说明:reuduce shuffle阶段并行传输数据的数量。这里改为10。集群大可以增大。
mapreduce.tasktracker.http.threads:
- 默认值:40
- 说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。
mapreduce.map.output.compress:
- 默认值:false
- 说明: map输出是否进行压缩,如果压缩就会多耗cpu,但是减少传输时间,如果不压缩,就需要较多的传输带宽。配合 mapreduce.map.output.compress.codec使用,默认是 org.apache.hadoop.io.compress.DefaultCodec,可以根据需要设定数据压缩方式。
mapreduce.reduce.shuffle.merge.percent:
- 默认值: 0.66
- 说明:reduce归并接收map的输出数据可占用的内存配置百分比。类似mapreduce.reduce.shuffle.input.buffer.percen属性。
mapreduce.reduce.shuffle.memory.limit.percent:
- 默认值: 0.25
- 说明:一个单一的shuffle的最大内存使用限制。
mapreduce.jobtracker.handler.count:
- 默认值: 10
- 说明:可并发处理来自tasktracker的RPC请求数,默认值10。
mapred.job.reuse.jvm.num.tasks(mapreduce.job.jvm.numtasks):
- 默认值: 1
- 说明:一个jvm可连续启动多个同类型任务,默认值1,若为-1表示不受限制。
mapreduce.tasktracker.tasks.reduce.maximum:
- 默认值: 2
- 说明:一个tasktracker并发执行的reduce数,建议为cpu核数
4. 系统优化
4.1 避免排序
对于一些不需要排序的应用,比如hash join或者limit n,可以将排序变为可选环节,这样可以带来一些好处:
- 在Map Collect阶段,不再需要同时比较partition和key,只需要比较partition,并可以使用更快的计数排序(O(n))代替快速排序(O(NlgN))
- 在Map Combine阶段,不再需要进行归并排序,只需要按照字节合并数据块即可。
- 去掉排序之后,Shuffle和Reduce可同时进行,这样就消除了Reduce Task的屏障(所有数据拷贝完成之后才能执行reduce()函数)。
4.2 Shuffle阶段内部优化
- Map端--用Netty代替Jetty
- Reduce端--批拷贝
- 将Shuffle阶段从Reduce Task中独立出来
5. 总结
在运行mapreduce任务中,经常调整的参数有:
mapred.reduce.tasks:手动设置reduce个数mapreduce.map.output.compress:map输出结果是否压缩mapreduce.map.output.compress.codec
mapreduce.output.fileoutputformat.compress:job输出结果是否压缩mapreduce.output.fileoutputformat.compress.typemapreduce.output.fileoutputformat.compress.codec
Mapreduce参数调节的更多相关文章
- Yarn&Mapreduce参数的具体含义和配置参考
Yarn & Mapreduce 参数的具体含义和配置 http://zh.hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp ...
- linux 内核参数VM调优 之 参数调节和场景分析
1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时 ...
- (转)linux IO 内核参数调优 之 参数调节和场景分析
1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时 ...
- inux IO 内核参数调优 之 参数调节和场景分析
http://backend.blog.163.com/blog/static/2022941262013112081215609/ http://blog.csdn.net/icycode/arti ...
- 【Hadoop离线基础总结】MapReduce参数优化
MapReduce参数优化 资源相关参数 这些参数都需要在mapred-site.xml中配置 mapreduce.map.memory.mb 一个 MapTask 可使用的资源上限(单位:MB),默 ...
- MapReduce参数调优
原文链接:http://blog.javachen.com/2014/06/24/tuning-in-mapreduce/ 本文主要记录Hadoop 2.x版本中MapReduce参数调优,不涉及Ya ...
- spark优化参数调节和故障参数调节
1:“物尽其用”,但给spark分配多个机器后,先需配置spark-submit shell如下: /usr/local/spark/bin/spark-submit \ --class com.sp ...
- PID参数调节口诀
参数整定找最佳, 从小到大顺序查. 先是比例后积分, 最后再把微分加. 曲线振荡很频繁, 比例度盘要放大. 曲线漂浮绕大弯, 比例度盘往小扳. 曲线偏离回复慢, 积分时间往下降. 曲线波动周期长, 积 ...
- Hadoop Mapreduce 参数 (二)
MergeManagerImpl 类 内存参数计算 maxInMemCopyUse 位于构造函数中 final float maxInMemCopyUse = jobConf.getFloat(MRJ ...
随机推荐
- 微信小程序开源项目库集合
UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wema ...
- HostingEnvironment RegisterObject和QueueBackgroundWorkItem
其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的 QueueBackgroundWorkItem ...
- 解决安装失败的 Internet Explorer 11
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成.微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章.然而由机器翻译的文章并不总是完美的.它 ...
- 蓝桥杯 C语言 入门训练 Fibonacci数列
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- JavaScript中遍历数组 最好不要使用 for in 遍历
先看一段代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- NG2入门 - 架构
AngularJS2 学习 继TypeScript之后,终于到了ng2的学习路程,同样学习根据angular官网文档进行,对文档中的内容根据自己的理解略有改动.看官可看官网文档,也可以看本系列博文 首 ...
- linux 查看磁盘占用情况
查看"/usr/local/"路径下,所有文件大小总和.只列出总和,不显示该路径下各子文件的大小. du -sh /usr/local/ 结果显示如下图: 如果要详细显示出各子文件 ...
- Python机器学习包
常用Python机器学习包 Numpy:用于科学计算的包 Pandas:提供高性能,易于使用的数据结构和数据分析工具 Scipy:用于数学,科学工程的软件 StatsModels:用于探索数据.估计统 ...
- 用SecureCRT连接虚拟机
1.Root用户进入虚拟机系统 2.打开控制台 3.永久关闭防火墙,打开sshd,这样SecureCRT才能连接 chkconfig iptables off;service sshd start 4 ...
- android studio 将library导出为jar 亲测成功
本人使用的是helloChart这个开源项目,其主要用于图表,来自git 地址为:https://github.com/lecho/hellocharts-android 下载命令为 git clon ...