常用的调优参数
资源相关参数
以下参数是在用户自己的mr应用程序中配置就可以生效(mapred-default.xml)
配置参数 | 参数说明 |
---|---|
mapreduce.map.memory.mb | 一个Map Task可使用的资源上限(单位:MB),默认为1024.如果Map Task实际使用的资源量超过该值,则会被强制杀死 |
mapreduce.reduce.memory.mb | 一个Reduce Task可使用的资源上限(单位:MB),默认1024.如果Reduce Task实际使用的资源量超过该值,则会被强制杀死 |
mapreduce.map.cpu.vcores | 每个Map task可使用的最多cpu core数目,默认值:1 |
mapreduce.reduce.cpu.vcores | 每个Reduce Task可使用的最多cpu core数目,默认值:1 |
mapreduce.reduce.shuffle.parallelcopies | 每个Reduce去map中拿数据的并行数,默认值是5 |
mapreduce.reduce.shuffle.merge.percent | buffer中的数据达到多少比例开始写入磁盘.默认值0.66 |
mapreduce.reduce.shuffle.input.buffer.percent | buffer大小占reduce可用内存的比例.默认值0.7 |
mapreduce.reduce.input.buffer.percent | 指定多少比例的内存用来存放buffer中的数据,默认值是0.0 |
在yarn启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)
配置参数 | 参数说明 |
---|---|
yarn.scheduler.minumum-allocation-mb 1024 | 给应用程序container分配的最小内存 |
yarn.scheduler.maximum-allocation-mb 8192 | 给应用程序container分配的最大内存 |
yarn.scheduler.minimum-allocation-vcores 1 | 每个container申请的最小cpu核数 |
yarn.scheduler.maximum-allocation-vcores 32 | 每个container申请的最大cpu核数 |
yarn.nodemanager.resource.memory-mb 8192 | 给containers分配的最大物理内存 |
shuffle性能优化的关键参数,应在yarn启动之前就配置好(mapred-default.xml)
配置参数 | 参数说明 |
---|---|
mapreduce.task.io.sort.mb 100 | shuffle的环形缓冲区大小,默认值100m |
mapreduce.map.sort.spill.percent 0.8 | 环形缓冲区溢出的阈值,默认值80% |
容错相关参数(mapreduce性能优化)
配置参数 | 参数说明 |
---|---|
mapreduce.map.maxattempts | 每个Map task最大重试次数,一旦重试参数超过该值,则认为Map task运行失败,默认值:4 |
mapreduce.reduce.maxattempts | 每个Reduce task最大重试次数,一旦重试参数超过该值,则认为Map task运行失败,默认值:4 |
mapreduce.task.timeout | Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果以个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该task处于block状态,可能是卡住了,也许是永远卡住了,为了房租因为用户程序永远block住不退出,则强制设置了一个该超时时间(单位毫秒,默认是600000).如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现错误提示是: “AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster” |
合理设置reduce端的buffer
默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据.
也就是说buffer和reduce是没有直接关联的,中间多一个写磁盘->读磁盘的过程,既然有这个弊端,那么可以通过参数来配置,使得buffer中有一部分数据可以直接输送到reduce,从而减少IO开销.
mapred.job.reduce.input.buffer.percent 默认为0
当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用.
这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整
网络性能
linux层面
每个端口监听队列的最大长度
echo net.core.somaxconn=37628>>/etc/sysctl.conf
hadoop集群限制
每个端口监听队列长度
core-site
Ipc.server.listen.queue.size控制了服务端socket的监听队列长度,默认值128,这个要和net.core.somaxconn配合使用
<property>
<name>Ipc.server.listen.queue.size</name>
<value>65535</value>
</property>
datanode数据移动的带宽
默认是1M,公司集群带宽一般能千M的,所以这个尽量调大
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>1048576</value>
</property>
namenode RPC处理线程数
dfs.namenode.handler.count=30(默认10)
datanode RPC处理线程数
dfs.datanode.handler.count=20(默认10)
集群数据传输的并行度
Name: Mapreduce.tasktracker.http.threads
Value: 40
shuffle阶段reduce拉取数据并行度
mpred.reduce.parallelcopys
最好设置为cpu的核数
中间结果压缩
Name: Mapreduce.map.output.compress
Value: true
Name: Mapreduce.map.output.compress.codec
Value: org.apache.hadoop.io.compress.SnappyCodec
提高并行度
datanode允许同时接收或发送任务数量
dfs.datanode.max.trasfer.threads=8192
内存调优
liunx
swap分区设置为0,优先使用内存
echo vm.swappiness=0>>/etc/sysctl.conf
namenode
首先必须调整新生代老年代比例,namenode内存中维护元数据,老年代比例占用较大
垃圾回收机制采用多线程,并发回收
开启永久代回收
vim hadoop-env.sh
export HADOOP_NAMENODE_OPTS="${HADOOP_NAMENODE_OPTS}
-Xms10240m -Xmx10240m
-XX:+UseParNewGC 设置年轻代为多线程并行收集
-XX:+UseConcMarkSweepGC 年老代激活CMS收集器(标记算法),可以尽量减少fullGC
-XX:+CMSConcurrentMTEnabled 当该标志被启用时,并发的CMS阶段将以多线程执行
-XX:CMSInitiatingOccupancyFraction=70 当年老代空间被占用70%的时候触发CMS垃圾收集
-XX:+CMSClassUnloadingEnaled 设置这个参数表示对永久带进行垃圾回收,CMS默认不对永久代进行垃圾回收
mapreduce
map端的内存
Name: mapreduce.map.memory.mb
Value: 1280
map端jvm堆内存
Name: Mapreduce.map.java.opts
Value: -Xmx1024m -XX:-UseGCOverheadLimit XX:+UseConcMarkSweepGC
reduce端内存
Name: Mapreduce.reduce.memory.mb
Value: 1280
reduce端jvm堆内存
Name: Mapreduce.reduce.java.opts
Value: -Xmx1024m -XX:-UseGCOverheadLimit
jvm堆内存一定要小于task容器内存,首先调大新生代与老生代内存比例.
eden和生长区比例: -XX:SurvivorRatio
yarn
给nodemanager可用的物理内存
Name: yarn.nodemanager.resource.memory-mb
Value: 8192
单个任务可申请的最少内存
Name: Yarn.scheduler.minimum-allocation-mb
Value: 1024
单个任务可申请的最大内存
Name: yarn.scheduler.maximum-allocation-mb
Value: 8192
yarn这个节点可使用的虚拟CPU个数,默认是8,但我们通常配置成跟物理CPU个数一样
Yarn.nodemanager.resource.cpu-vcores
Value:4
数据缓冲区
环形缓冲区的阈值
Mapreduce.map.sort.spill,percent默认0.8,可以调整为0.6
内部排序缓冲区大小
mapreduce.task.io.sort.mb 默认100M,可以适当调大一些
IO.file.buffer.size默认值4096(4k),hadoop集群缓冲区大小,hdfs文件读写,mapreduce程序环形缓冲区等.缓冲区大小严重影响执行效率,建议调整到95536-131072