常用的调优参数

资源相关参数

以下参数是在用户自己的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开销.

  1. mapred.job.reduce.input.buffer.percent 默认为0

当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用.

这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整

网络性能

linux层面

每个端口监听队列的最大长度

  1. echo net.core.somaxconn=37628>>/etc/sysctl.conf

hadoop集群限制
每个端口监听队列长度
core-site
Ipc.server.listen.queue.size控制了服务端socket的监听队列长度,默认值128,这个要和net.core.somaxconn配合使用

  1. <property>
  2. <name>Ipc.server.listen.queue.size</name>
  3. <value>65535</value>
  4. </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