1.Jvm重用
JVM重用不是指同一Job的两个或两个以上的Task同时运行于同一JVM上,而是 N个Task按顺序在同一个Jvm上运行,即省去了Jvm关闭和再重启的时间。N值可以在Hadoop的mapre-site.xml文件mapreduce.job.jvm.numtasks(默认1)属性进行设置。也可在hive的执行设置:set mapred.job.reuse.jvm.num.tasks=10;(默认1)
一个TT最多可以同时运行的task数目由mapred-site.xml中mapreduce.tasktracker.map.tasks.maximum 和 mapreduce.tasktracker.reduce.tasks.maximum设置。其他方法,如在JobClient端通过命令行:-D mapred.tasktracker.map.tasks.maximum=number 或者 conf.set("mapred.tasktracker.map.tasks.maximum","number")设置都是【无效的】。
2.哪些因素影响作业的运行效率?
mapper的数量:尽量将输入数据切分成数据块的整数倍。如有太多小文件,则考虑CombineFileInputFormat
reducer的数量:为了达到最高性能,集群中reducer数应该略小于reducer的任务槽数
combiner使用: 充分使用合并函数减少map和reduce之间传递的数据量,combiner在map后运行
中间值的压缩:对map输出值进行压缩减少到reduce前的传递量conf.setCompressMapOutput(true)和setMapOutputCompressorClass(GzipCodec.class)
自定义Writable:如果使用自定义的Writable对象或自定义的comparator,则必须确保已实现RawComparator
调整shuffle参数:MapReduce的shuffle过程可以对一些内存管理的参数进行调整,以弥补性能不足
3.避免context.write(new Text(),new Text())
提倡key.set(); value.set(); output.collect(key,value);
前者会产生大量的Text对象,使用完后Java垃圾回收器会花费大量的时间去收集这些对象
4.使用DistributedCache加载文件
比如配置文件,词典,共享文件,避免使用static变量
5.充分使用Combiner + Parttitioner + Comparator
Combiner: 对map任务进行本地聚合
Parttitioner:合适的Parttitioner避免reduce端负载不均
Comparator:二次排序
6.Uber模式
是Hadoop2.0中实现的一种针对MR小作业的优化机制。即如果作业足够小,则所有task在一个jvm(mrappmaster)中完成要比为每个task启动一个container更划算。下面是该机制的相关参数,这些参数均为客户端配置。
总开关
•mapreduce.job.ubertask.enable 默认值:false
•mapreduce.job.ubertask.maxmaps 最大map数,默认值:9
•mapreduce.job.ubertask.maxreduces 最大reduce数,默认值:1 (社区2.2.0只支持0或1个reduce)
•mapreduce.job.ubertask.maxbytes 最大输入字节数,默认值:默认的blocksize,即64MB
map或reduce的内存需求不大于appmaster的内存需求
•mapreduce.map.memory.mb (默认值:0) <= yarn.app.mapreduce.am.resource.mb (默认值:1536)
•mapreduce.reduce.memory.mb (默认值:0) <= yarn.app.mapreduce.am.resource.mb (默认值:1536)
map或reduce的CPU需求不大于appmaster的CPU需求
•mapreduce.map.cpu.vcores (默认值:1) <= yarn.app.mapreduce.am.resource.cpu-vcores (默认值:1)
•mapreduce.reduce.cpu.vcores (默认值:1) <= yarn.app.mapreduce.am.resource.cpu-vcores (默认值:1)
•mapreduce.job.map.class 不继承于 org.apache.hadoop.mapreduce.lib.chain.ChainMapper
•mapreduce.job.reduce.class 不继承于 org.apache.hadoop.mapreduce.lib.chain.ChainReducer