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参数调优的更多相关文章
- MapReduce任务参数调优(转)
http://blog.javachen.com/2014/06/24/tuning-in-mapreduce/ 本文主要记录Hadoop 2.x版本中MapReduce参数调优,不涉及Yarn的调优 ...
- Spark Shuffle原理、Shuffle操作问题解决和参数调优
摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...
- 大数据:Hive常用参数调优
1.limit限制调整 一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果. 有一个配置属性可以开启,避免这种情况---对数据源进行抽样 hive.limit.optimize.e ...
- MapReduce内存调优
内存调优 Hadoop处理数据时,出现内存溢出的处理方法?(内存调优) 1.Mapper/Reducer阶段JVM内存溢出(一般都是堆) 1)JVM堆(Heap)内存溢出:堆内存不足时,一般会抛出如下 ...
- MapReduce如何调优
Map阶段优化 1.在代码书写时优化,如尽量避免在map端创建变量等,因为map端是循环调用的,创建变量会增加内存的消耗,尽量将创建变量放到setup方法中 2.配置调优,可以在集群配置和任务运行时进 ...
- Hbase和Hadoop的内存参数调优 + 前端控制台
1.hadoop的内存配置调优 mapred-site.xml的内存调整 <property> <name>mapreduce.map.memory.mb</name&g ...
- 搭建 windows(7)下Xgboost(0.4)环境 (python,java)以及使用介绍及参数调优
摘要: 1.所需工具 2.详细过程 3.验证 4.使用指南 5.参数调优 内容: 1.所需工具 我用到了git(内含git bash),Visual Studio 2012(10及以上就可以),xgb ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- spark参数调优
摘要 1.num-executors 2.executor-memory 3.executor-cores 4.driver-memory 5.spark.default.parallelism 6. ...
随机推荐
- 废弃fastjson!大型项目迁移Gson保姆级攻略
前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...
- Java设计模式精讲之UML急速入门
简单记录 - 慕课网 - Java设计模式精讲 Debug方式+内存分析 文章目录 第2章 UML急速入门 2-1.UML简单入门 UML定义 UML特点 UML 2.2分类 UML类图 理解泛化.实 ...
- 【Oracle】regexp_substr()函数详解
环境:Oracle10.2.0.5 在SQL中尝试使用正则 可以试下regexp_substr()来进行分割 首先创建一个实验视图: SQL> create or replace view te ...
- 入门训练 - 蓝桥杯(Python实现)
A+B问题: 题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入A.B,输出A+B. 输入格式 输入的第一行包括两个整数,由空格分隔,分别表示A.B. 输出格式 输出一行, ...
- mount: /dev/sdxx already mounted or /xxxx busy解决方法
异常现象: 解决方法: 1. 輸入root的密碼,進入單用戶2. 重新掛載/目錄,使其變為可讀可寫 # mount –o rw,remount / 3. 修改/etc/fstab文件 ...
- IE浏览器直接在页面中显示7z文件而不是下载问题解决
IE浏览器中输入7z文件的完整下载URL后,不是保存文件,而是直接在页面中显示(当然是乱码) 这是因为浏览器对不同的资源文件处理的方式不同,例如图片文件,一般会直接打开,所以我们可以不用7z,使用zi ...
- 使用SimpleUpdater实现现有程序升级功能
项目:https://github.com/iccfish/FSLib.App.SimpleUpdater C/S程式一般需要部署在多台机器上,如果程式有变动,需要一台一台重新安装,相当麻烦,如果我们 ...
- 腾讯云COS对象存储占据数据容灾C位
说到公有云容灾,大家首先想到的是云上数据备份. 然而,随着企业核心业务逐渐从线下迁移到云上,客户提出了更高的要求.如何确保云上业务的高可用.数据的高可靠,这对云厂商提出了新的挑战. 腾讯云作为全球领先 ...
- qt for webassembly环境搭建图文教程
一.前言 从Qt5.14开始,官方的在线安装提供了qt for webassembly构建套件,这对很多小白来说绝对是个好消息,也绝对是个好东西,好消息是不用再去交叉编译自己生成qt for weba ...
- ctfshow_djb杯
桐桑又开始摸鱼了 ctfshow的比赛整的一手好活.djb杯. web1_veryphp 打开就是源码: 1 <?php 2 error_reporting(0); 3 highlight_fi ...