~~ 核心答案讲解:
Hadoop参数调优
一、 hdfs-site.xml 配置文件
1、 dfs.blocksize
参数:hadoop文件块大小
描述:新文件的默认块大小,以字节为单位,默认 134217728 字节。
可以使用以下后缀(大小写不敏感):k(kilo)、m(mega)、g(giga)、t(tera)、p(peta)、e(exa)来指定大小(如128k、512m、1g等),
或者以字节为单位提供完整的大小。
2、 dfs.namenode.handler.count
参数:namenode的服务器线程数
描述:NameNode有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用。处理程序数量越多意味着要更大的池来处理来自不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。
3、 dfs.datanode.balance.bandwidthPerSec
参数: datanode 平衡带宽
描述:指定每个datanode可以利用每秒字节数来平衡目标的最大带宽。
4、 dfs.replication
参数:块副本数
描述:默认的块复制。可以在创建文件时指定复制的实际数量。如果在create time中没有指定复制,则使用默认值3。
5、dfs.datanode.max.transfer.threads
参数:datanode 最大传输线程数
描述:指定用于传输数据进出DN的最大线程数。集群中如果不一致,会造成数据分布不均。
二、 core-site.xml 配置文件
1、 io.file.buffer.size
参数:文件的缓冲区大小
描述:用于顺序文件的缓冲区大小。这个缓冲区的大小应该是硬件页面大小的倍数(在Intel x86上是4096),它决定了在读写操作中缓冲了多少数据。SequenceFiles 读取和写入操作的缓存区大小,还有map的输出都用到了这个缓冲区容量, 可减少 I/O 次数。建议设定为 64KB 到 128KB
三、 yarn-site.xml 配置文件
1、 yarn.nodemanager.resource.memory-mb
参数:该节点 nodemanager 资源池内存
描述:NodeManager节点上可使用的物理内存总量,默认是8192(MB),根据节点所能分配的最大的内存进行分配即可,注意为操作系统与其他服务预留资源。
2、yarn.nodemanager.resource.cpu-vcores
参数:该节点 有多少cpu加入资源池 , 默认值为8
描述:表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。
·
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
问题扩展
工作中具体用过哪些调优方式。
结合项目中使用
项目中合理设置reduceTask个数。合理设置快大小。