hadoop性能分析工具vaidya学习

总的来讲,内置的测试类比较少,真正的profiling还需要自己添加,而且要对hadoop源代码内置各个job counter的实现有叫深入的理解。
但为hadoop专门的profiling提供了一个可支持框架。

vaidya简介

vaidya基本上是基于hadoop map/reduce任务日志进行事后分析的工具。
(1)在PKGBUILD_hadoop中增加如下包信息,打包重装hadoop

mkdir -p $PKG_ROOT/opt/hadoop/contrib/vaidya && \
cp -r src/hadoop- 0.20 . 2 -cdh3u5/contrib/vaidya/* $PKG_ROOT/opt/hadoop/contrib/vaidya/

(2)在contrib/vaidya/bin/vaidya.sh中做如下修改

#$JAVA_HOME/bin/java -Xmx1024m -classpath $HADOOP_HOME/hadoop-${hadoopVersion}-core.jar:$HADOOP_HOME/contrib/vaidya/hadoop-${hadoopVersion}-vaidya.jar:$HADOOP_HOME/lib/
commons-logging- 1.0 . 4 .jar:${CLASSPATH} org.apache.hadoop.vaidya.postexdiagnosis.PostExPerformanceDiagnoser $@
$JAVA_HOME/bin/java -Xmx1024m -classpath $HADOOP_HOME/hadoop-core-${hadoopVersion}.jar:$HADOOP_HOME/contrib/vaidya/hadoop-vaidya-${hadoopVersion}.jar:$HADOOP_HOME/lib/c
ommons-logging- 1.0 . 4 .jar:$HADOOP_HOME/lib/log4j- 1.2 . 15 .jar:${CLASSPATH} org.apache.hadoop.vaidya.postexdiagnosis.PostExPerformanceDiagnoser $@

(3)运行一个map-reduce的job,并将output/logs/_histroy目录下的文件hadoop fs -get到本地,运行

sh vaidya.sh \
  -jobconf file: ///home/linan/p4p_data_center_live/opt/hadoop/contrib/vaidya/bin/inc-search-p4p-137-47.hst.bjc.kfc.alidc.net_1353897141487_job_201211261032_0002_conf.xml
  \
  -joblog file: ///home/linan/p4p_data_center_live/opt/hadoop/contrib/vaidya/bin/job_201211261032_0002_1353897192547_linan_streaming+word+count \
  -testconf /home/linan/p4p_data_center_live/opt/hadoop/contrib/vaidya/conf/postex_diagnosis_tests.xml \
  -report ./report.xml

(4)
生成一个分析结果的report.xml,示例

vaidya实现细节与内置的测试类

vaydya主要是解析jobHistory文件中的Job信息、task信息、各级couner信息,然后在这些信息上运行各个Test类的evaluate()接口,计算出一个影响0~1之间的影响因子,根据配置的系统success阈值判断该测试用例是否通过。

测试用例的配置文件

<DiagnosticTest>
   <Title><![CDATA[Balanaced Reduce Partitioning]]></Title>  直接复制到结果Title中
   <ClassName><![CDATA[org.apache.hadoop.vaidya.postexdiagnosis.tests.BalancedReducePartitioning]]></ClassName> 调用的Test类,调用这个类的run函数
   <Description><![CDATA[This rule tests as to how well the input to reduce tasks is balanced]]></Description> 直接复制到结果的Description中
   <Importance><![CDATA[High]]></Importance> 直接复制到结果的Importance中
   <SuccessThreshold><![CDATA[ 0.20 ]]></SuccessThreshold>,
   <Prescription><![CDATA[advice]]></Prescription>
   <InputElement>
     <PercentReduceRecords><![CDATA[ 0.85 ]]></PercentReduceRecords>
   </InputElement>
</DiagnosticTest

生成结果

- <TestReportElement>
   <TestTitle>Balanaced Reduce Partitioning</TestTitle>
   <TestDescription>This rule tests as to how well the input to reduce tasks is balanced</TestDescription>
   <TestImportance>HIGH</TestImportance>
   <TestResult>NEGATIVE(PASSED)</TestResult> if impact level > evaluate()接口产生的impact level
   <TestSeverity> 0.0 </TestSeverity>  evaluate()接口产生的impact level
   <ReferenceDetails>* TotalReduceTasks: 1 * BusyReduceTasks processing 0.85 % of total records: 1 * Impact: 0.0 </ReferenceDetails>
   利用数据生成的格式化细节
   <TestPrescription>* Use the appropriate partitioning function * For streaming job consider following partitioner and hadoop config parameters * org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner * -jobconf stream.map.output.field.separator, -jobconf stream.num.map.output.key.fields</TestPrescription> 
   利用数据生成的格式化建议
   </TestReportElement>

类图

流程图

内置测试类简介

  • BalancedReducePartitioning

    (1)将各个reduce task的统计信息,按照INPUT_RECORDS排序后,返回一个list
    (2) task1.input_record > task2.input_record > task3.input_record
    从前到后将input_record想加,直到累计的record大于 PercentReduceRecords(0.85) * job reduce input recored总数
    影响力impact level就等于 1- 相加的task的数目/总reduce task数目

    相加的task的数目,含义是用了多少个reduce来解决85%的数目,
    这个数目越大,相加的task的数目/总reduce task数目就越大,impact level就越小,相反解决85%数目的reduce task数目越小,impact level就越大。
    impact level的含义是解决15%以内的reduce数据的task数目,impact level小于20%为通过,就是用20%的reduce解决15%的数据。
    也就是说如果用少部分reduce task处理了大部分数据,则视为不平衡。

  • MapsReExecutionImpact

    impact = (LAUNCHED_MAPS - TOTAL_MAPS)/TOTAL_MAP
    重试的map task数目的比例不超过40%

  • ReadingHDFSFilesAsSideEffect

    impact = HDFS_BYTES_READ/MAP_INPUT_BYTES/NormalizationFactor

    HDFS_BYTES_READ/MAP_INPUT_BYTES/2< 0.05
    HDFS_BYTES_READ/MAP_INPUT_BYTES < 0.1
    HDFS_BYTES_READ < 0.1 * MAP_INPUT_BYTES

    也就是说从HDFS读入的数据,不超过map任务总数据的10%
    为什么会小呢?一说是HDFS是底层文件的读入,而map input bytes是job task的输入,例如输入的是压缩文件,那么这个hdfs读肯定小了。

  • MapSideDiskSpill

    impact = (所有map task的FILE_BYTES_WRITTEN的累计 - 总的MAP_OUTPUT_BYTES )/总的MAP_OUTPUT_BYTES/ 归一化数字3
    impact < 0.3
    所有map task的FILE_BYTES_WRITTEN的累计 - 总的MAP_OUTPUT_BYTES < 0.9 * 总的MAP_OUTPUT_BYTES

    在map输出时,由于多次spill,使得FILE_BYTES_WRITTEN 大于 AP_OUTPUT_BYTES,也是说由于spill造成的多写的数据,不超过输出总数据的90%。
    io相关配置参数的解释:http://lovebingkuai.diandian.com/post/2012-05-22/19764807 http://www.linuxso.com/architecture/31187.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值