原文件下载:《Hadoop Performance Tuning Guide》
部分翻译:
3.0性能优化
hadoop集群的软件和硬件都正常工作的情况下,我们可以进一步优化hadoop配置文件来提升hadoop系统的性能。配置参数从
hadoop框架、jvm到系统都会影响hadoop工作性能。在此,依据TeraSort在hadoop的上的经验,总结出一些提升hadoop性能
的指导意见。
3.1 hadoop配置优化
1、hadoop默认的map、reduce 槽位数、java内存等或许并不适合你现有的hadoop系统。所以,首先调整这些到一个合适的
水平,以提高hadoop集群对cpu、内存等硬件的利用率。内存的工作负载、map reduce tasks的工作负载、cpu的核数、线程
数以及io带宽、可用内存的量等都会影响配置文件的配置。
a)调整磁盘数以满足最低的存储需求。(每个datanode使用4个盘)
b)配置map、reduce槽位数,以充分利用cpu。reduce阶段充分利用cpu资源。(每个cpu核分配2个map,1个reduce)
c)配置map、reduce 任务的内存大小,但是需要确保为系统预留了足够的系统缓存和缓存以满足map、reduce任务需要。
(map、reduce jvm最大1G内存)
需要配置的参数有:
mapred-site.xml 中的
mapred.map.tasks,mapred.tasktracker.map.tasks.maximum,
mapred.reduce.tasks,mapred.tasktracker.reduce.tasks.maximum,
mapred.map.child.java.opts,
mapred.reduce.child.java.opts
3.1.2数据磁盘扩展
可以通过配置mapred-site.xml 中的mapred.local.dir和hdfs-site.xml中的dfs.name.dir、dfs.data.dir来配置磁盘的使用。可以增加
磁盘数提高io性能。
3.1.3压缩
hadoop在输入、中间数据、输出均提供压缩支持。同时,提供众多的压缩、解压缩算法。需要在压缩时间、压缩效率、压缩负载
等方面做好平衡。
对中间数据进行压缩可以减小系统io、降低网络负载,但需要消耗cpu资源。
可用参数:mapred-site.xml
mapred.compress.map.output,
mapred.map.output.compression.codec,
mapred.output.compress,
mapred.output.compression.type,
mapred.output.compression.codec
Snappy 或者lzo压缩
3.1.4 jvm重用策略
jvm重用策略决定了map、reduce的jvm是否可以继续使用以执行下一个任务。默认为1;若为-1那么将没有限制。jvm重用可以节省
task启动jvm、关闭jvm的耗时,毕竟相对来说,启动、关闭jvm比较耗时。
参数:
mapred.job.reuse.jvm.num.tasks
3.1.5hdfs块大小
每一个map的输入都是一个文件分片。由mapred.min.split.size\dfs.block.size\mapred.max.split.size确定。分片大小和输入文件的大小
决定了map任务的个数。 增大输入文件分片来减少map任务数,也就一位置减少的jvm启动、关闭的耗时,从而减少工作负载。
应尽量确保输入分片跟块大小一致。
3.1.6map端分片
map将生成的中间数据放到缓存中。这个缓存块占用的是map jvm的最内存。默认值是100m,可以通过io.sort.mb来配置。
这个缓存块中的一部分来存储分片记录的元信息,默认是io.sort.mb的0.05,即5mb,可以通过io.sort.record.percent配置。
每条记录的元信息室16字节,那么总共能存储的元数据就是327680条。若缓存块的使用量或者元数据量达到阈值,那么信息将被存储到磁盘
阈值可以通过io.sort.spill.percent来配置,默认是0.8。
通过计算map的总输出的大小和map输出中的总记录数,然后可以计算出所需的缓存块大小,那么就可以设置合适的io.sort.mb、
和io.sort.spill.percent来满足缓存块和缓存元信息的需求。io.sort.spill.percent可以设置为0.99,那么一个map 任务的输出信息就可以在
一个buffer中完成,而不需要写到磁盘。
3.1.7 copy、shuffle阶段优化
如果所有的map任务结束后,map的复制任务没有很快在之后完成,那么表面这个集群的配置是很差的。又多个原因可以造成复制进度的
缓慢。
a)map并行拷贝的最大数,又mapred.reduce.parallel.copies控制,默认为5。
b)tasktracker支持map输出到reduce端的最大工作线程数,由tasktracker.http.threads控制,默认40.这事TaskTracker级别的参数。可以
逐级调整这个参数,观察对copy阶段的影响。
c)优化dfs.datanode.handler.count、dfs.namenode.handler.count、mapred.job.tracker.handler.count等参数。
d)reduce端的瓶颈同样会减慢copy阶段。避免reduce端的磁盘分片的溢出同样可以提高copy阶段的效率。
e)网络硬件的瓶颈同样也是因素之一。用跑分工具如netperf可以确定网络带宽是否达到所有工作节点都可以接受的水平。
3.1.8 reduce端的分片
reduce阶段对hadoop工作时长的影响是很大的。reduce阶段又更多的网络和磁盘io有关的工作。毕竟,由大量的map任务生成的中间数据需要
复制、聚合、处理,而且,有可能需要写回hdfs。因此,要使得reduce阶段达到最大优化,需要的更多的reduce任务和比map的jvm更大的内存需求。
当map task完成,那么map的输出就开始排序、按reducer进行分区,并写到TaskTracker所在的节点。然后,这些map分区被复制到reducer所在
的节点。由mapred.job.shuffle.input.buffer.percent 控制的reduce jvm内存,默认0.7,buffer将保存这些数据。若超出buffer的阈值,则写到磁盘。此阈值由mapred.job.shuffle.merge.percent ,默认0.66