zoukankan      html  css  js  c++  java
  • Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议

    作者: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个建议

    §  压缩输出文件

    压缩能够节省磁盘和网络的IO,提高作业性能。

    Gzip/Snappy/Lzo/Bzip2都是经常使用的压缩格式,依据须要选用。

    四种经常使用压缩格式的特征[ii]

    压缩格式

    split

    native

    压缩率

    速度

    Hadoop自带

    linux命令

    换成压缩格式后,原来的应用程序是否要改动

    Gzip

    非常高

    比較快

    和文本处理一样,不须要改动

    Lzo

    比較高

    非常快

    须要建索引。还须要指定输入格式

    Snappy

    比較高

    非常快

    没有

    和文本处理一样,不须要改动

    Bzip2

    最高

    和文本处理一样,不须要改动



    參数调优(用lzo压缩):

    mapreduce.output.fileoutputformat.compress=true

    mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.LzoCodec

    mapreduce.map.output.compress=true

    mapreduce.map.output.compress.codec=com.hadoop.compression.lzo.LzoCodec

    §  应对数据倾斜

    假设一些Reduce比其它Reduce明显耗时很多其它,我们觉得发生数据倾斜,整个作业会由于数据倾斜而耗时很多其它。

    eBay Eagle对数据倾斜的定义:

    (WorstReduceTime - avgReduceTime > 30 minutes)and (WorstReduceInputRecords / avgReduceInputRecords > 5)

    有非常多解决方式。比如写MapReduce作业时,合并中间数据。避免大量小文件。

    在工作中,我们碰到数据倾斜的咨询集中在Hive查询。參数调优例如以下:

    -合并小文件((文件再小,Block再大,每一个小文件都会占用一个Block)

    hive.merge.mapfiles=true

    hive.merge.size.per.task=256000000

    -利用Map端聚合。达到Reduce负载均衡

    hive.groupby.skewindata=true

    hive.optimize.skewjoin=true

    hive.map.aggr=true

    hive.groupby.mapaggr.checkinterval = 100000

    §  添加内存,降低GC时间

    当Map或Reduce内存不够时。须要很多其它的GC时间,从而影响作业性能。

    eBay Eagle对GC时间过长的定义:

    GC_TIME_MILLIS / CPU_MILLISECONDS > 0.1

    作业參数调优。提高Heap size:

    mapreduce.map.java.opts=-Xmx4g

    mapreduce.reduce.java.opts=-Xmx4g

    在提高Heap Size參数时,注意Heap Size不得超过物理内存。

    mapreduce.map.memory.mb > mapreduce.map.java.opts

    mapreduce.reduce.memory.mb >mapreduce.reduce.java.opts

    §  避开资源竞争

    系统资源紧张会造成Map或Reduce进展缓慢。用户能够从Scheduler中观察不同queue的资源使用情况。避开繁忙的窗体。假设作业有多个queue能够选择,选择资源空暇的queue。

    设置queue:

    mapreduce.queue.jobname=<queue_name>

    演示样例:通过ResourceMananger web URL 观察系统资源使用情况

    §  添加内存。降低磁盘溢出

    设置下面作业參数降低磁盘溢出:(适当大于默认值)

    mapreduce.map.sort.spill.percent=1

    mapreduce.task.io.sort.mb=1024

    mapreduce.map.java.opts=-Xmx4096M

    §  保留系统默认的最小分片大小

    有些人会设置split.minsize作业參数以控制Map数量。但这样的做法会削弱数据本地性。减少作业性能。建议保留系统默认设置。

    在默认配置下。split大小和block大小是同样的。防止一个split假设相应的多个block并且这些block大多不在本地。

    保留作业參数默认值:

    mapreduce.input.fileinputformat.split.minsize=0

    §  控制Map和Reduce数量

    合理的Map和Reduce数量。有利于提高作业性能。

    我们能够通过參数直接设置Reduce的数量。但无法直接指定Map的数量。參考computeSplitSize()方法。当输入文件指定时,Map的数量由SplitSize决定,我们能够通过改动dfs.blocksize和split.minsize来设定Split Size。上文我们建议使用保留系统默认的最小分片大小,所以我们仅仅能通过改动dfs.blocksize參数来控制Map数量。值得注意的是我们能够有若干办法控制输入文件。

    当Map平均输入非常大,或者用时太长。通过下面办法能够添加Map数量

    -事先採用Splittable的压缩格式,比方Lzo格式压缩输入文件。

    -设置较小的Block Size

    当Map平均输入过小,或者用时太短,通过下面办法能够降低Map数量

    -事先合并输入文件,降低小文件 (小文件太多,就算Block Size再大,每一个小文件都会占用一个Block)

    -设置较大的Block Size

    computeSplitSize()方法说明[i]



    *上图为引用Hadoop The Definitive Guide 3rd Edition[i], 所列属性为Hadoop 1。在Hadoop 2中,部分属性名称已更新,比方Hadoop 1中dfs.block.size在Hadoop2中更新为dfs.blocksize.

    eBay Eagle有关Map和Reduce数量的标杆:

    Map作业满足下面条件之中的一个。觉得Map数量太多:

    -输入 < 5 MB且用时 < 30秒

    -用时 < 10秒

    Map作业满足下面条件之中的一个,觉得Map数量太少:

    -输入 > 1GB

    -用时 > 10分钟

    Reduce作业满足下面条件之中的一个,觉得Reduce数量不合理:

    -输入 < 256MB 且总用时(包含Shuffle) < 5分钟 且 输出 < 256MB

    -输入 > 10GB 且总用时(包含Shuffle) > 30分钟

    -总用时(包含Shuffle) < 60秒

    -总用时(包含Shuffle) > 1小时 且 用时(不包含Shuffle) > 30分钟

    -输入 < 10MB 且用时(不包含Shuffle) < 5分钟 且 输出 < 2GB

    -输出 > 10GB 且用时(不包含Shuffle) > 30分钟

    Reduce数量推荐方案:

    Reduce number=Max(input / 3 G, output / 2 GB,reduceTime / 10 minute)

    指定Reduce数量的作业參数:

    mapreduce.job.reduces=<Reduce number>

          



     

    [i] eBay Eagle是eBay自主研发的系统,用于大型Hadoop集群管理,集监控、警示和智能修复功能于一体。eBayEagle即将开源,有望成为Apache的孵化项目。

    [ii] http://my.oschina.net/mkh/blog/335395

    [iii] Hadoop: TheDefinitive Guide, Third Edition. Hadoop: The Definitive Guide, Third Edition,ISBN: 9781449328917
  • 相关阅读:
    nginx
    同步和异步
    什么是ACID
    关系型数据库特点小结
    js 简单小知识
    join 和 left join 和 right join的区别?
    mysql中having和where区别?
    include和require区别
    什么是脏读,不可重复,幻读?
    Mysql常见面试题
  • 原文地址:https://www.cnblogs.com/llguanli/p/7100757.html
Copyright © 2011-2022 走看看