作者: Shu, Alison
?
Hadoop作业性能调优的两种场景:
一、用户观察到作业性能差,主动寻求帮助。
(一)eBayEagle作业性能分析器
1. Hadoop作业性能异常指标
2. Hadoop作业性能调优7个建议
(二)其它参数调优方法
二、Hadoop集群报告异常,发现个别作业导致集群事故。
?
一、用户观察到作业性能差,主动寻求帮助。
(一)eBay Eagle作业性能分析器
对一般作业性能调优,eBay Eagle[i]的作业性能分析器已经能满足用户大部分需求。eBayEagle作业性能分析包含两个部分,第一部分是根据定量指标,捕捉性能异常的作业。在本文中,我们不考虑Hadoop集群或者节点故障造成作业性能的普遍下降,因此我们认为这些性能指标异常只与Hadoop作业有关,可以通过性能调优来改善。第二部分是调优建议。根据Hadoop作业性能异常指标判断作业是否需要调优,再综合采用第二部分的建议。第二部分也可以作为Hadoop作业开发的指引,并在后期性能测试中检查。
?
1. Hadoop作业性能异常指标
参阅《Hadoop作业性能指标及参数调优实例(一)Hadoop作业性能异常指标》
?
2. Hadoop作业性能调优的7个建议
参阅《Hadoop作业性能指标及参数调优实例(二)Hadoop作业性能调优7个建议》
?
(二)eBay Eagle作业分析器之外,我们仍然发现一些简单有用的参数调优办法。
§ 提高Splitmetainfo文件上限以应对输入文件包含大量小文件及文件目录
示例:
$yarn logs -applicationId application_1431213413583_263303-appOwner abc
…
2015-06-02 11:15:37,971 INFO [main]org.apache.hadoop.service.AbstractService: Serviceorg.apache.hadoop.mapreduce.v2.app.MRAppMaster failed in state STARTED; cause:org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.io.IOException:Split metadata size exceeded 10000000. Aborting job job_1431213413583_263303
…
分析:
输入文件包括大量小文件或者文件目录,造成Splitmetainfo文件超过默认上限。
解决办法:
修改默认作业参数mapreduce.jobtracker.split.metainfo.maxsize =100000000 或者mapreduce.jobtracker.split.metainfo.maxsize = -1 (默认值是1000000)
?
§ 不要轻易减少系统默认的复制因子
示例:
$yarn logs -applicationIdapplication_1431213413583_187157 -appOwner abc
…
/apache/hadoop/logs/yarn.log.2015-05-26-12:2015-05-2612:43:50,003 INFOorg.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container:Container container_1431213413583_187157_01_003934 transitioned from LOCALIZINGto KILLING
/apache/hadoop/logs/yarn.log.2015-05-26-12:2015-05-2612:43:50,004 INFOorg.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container:Container container_1431213413583_187157_01_003934 transitioned from KILLING toDONE
…
分析:
Map试图下载分布式缓存中的文件,发生time out,导致作业失败。我们检查了分布式缓存中文件,发现复制数量是3份而不是默认的10份。在apache Hadoop 的官网中有关于archive file 在 distributed cache中复制因子的说明[ii]。
“When working with a large cluster it can beimportant to increase the replication factor of the archive to increase itsavailability. This will spread the load when the nodes in the cluster localizethe archive for the first time.”
解决办法:
增加文件复制数量,把文件放到更多的节点上,尽可能实现数据的本地性,以加快文件下载速度。不要轻易减少以下参数的默认值:
dfs.replication=3(默认值)
mapreduce.client.submit.file.replication=10 (默认值)
?
§ 增加locateFollowingBlock办法的重试次数
示例:
Exception in thread "main"java.io.IOException: Unable to close file because the last block does not haveenough number of replicas.
分析:
可能是NameNode过于繁忙,locateFollowingBlock方法请求Name Node为文件添加新块发生错误,无法定位下一个块。建议增加locateFollowingBlock方法重试次数参
解决办法:
修改默认作业参数dfs.client.block.write.locateFollowingBlock.retries=15 (默认是5)
?
§ 适当提高timeout阈值
示例:
AttemptID:attempt_1429087638744_171298_r_000148_2Timed out after 600 secs
分析:
输入数据或计算量非常大,造成作业用时太长
解决办法:
修改默认作业参数mapreduce.task.timeout=1200000(默认值是600000)
?
§ 选择可用资源较多的queue或窗口
示例:
our map reduce jobs are extremely slow and some ofthem are waiting in the UNASSIGNED state for a long time.
分析:相应的queue资源用完
解决:另选一个空闲的queue或者空闲的时间窗口
?
§ 适当增加内存
示例:
客户端抛出异常Exceptionin thread "main"
Exception: java.lang.OutOfMemoryError thrown fromthe UncaughtExceptionHandler