整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

5.6.1 分析任务

hadoop 小红牛 13℃ 0评论


正如调试一样,对MapReduce这类分布式系统上运行的作业进行分析也有诸多挑战。Hadoop允许分析作业中的一部分任务,并且在每个任务完成时,把分析信息放到用户的机器上,以便日后使用标准分析工具进行分析。

当然,对本地作业运行器中运行的作业进行分析可能稍微简单些。如果你有足够的数据运行mapreduce任务,那么对于提高mapperreducer的性能有很大的帮助。但必须注意一些问题。本地作业运行器是一个与集群完全不同的环境,并且数据流模式也截然不同。如果MapReduce作业是I/O密集型的(很多作业都属于此类),那么优化代码的CPU性能是没有意义的。为了保证所有调整都是有效的,应该在实际集群上对比新老执行时间。这说起来容易做起来难,因为作业执行时间会随着与其他作业的资源争夺和调度器决定的任务顺序不同而发生改变。为了在这类情况下得到较短的作业执行时间,必须不断运行(改变代码或不改变代码),并检査是否有明显的改进。

有些问题(如内存溢出)只能在集群上重现,在这些情况下,必须能够在发生问题的地方进行分析。

 

1.HPROF分析工具

许多配置属性可以控制分析过程,这些属性也可以通过]obConf的简便方法获取。下面对MaxTemperatureDrive(版本6)的修改将启用远程HPROF分析。HPROFJDK自带的分析工具,虽然只有基本功能,但是同样能提供程序的CPU和堆使用情况等有用信息。®

Configuration conf=getConf();

conf.setBoolean("mapred.task.profile", true)j

conf.set("mapred.task.profile.params",
"-agentlib:hprof=cpu=samples," + "heap=sites, depth=6j forcesn,
thread=y, verbose=n, f ile=%s ••); conf .set ("mapred. task, profile,
maps", "
0-2•_); conf.set("mapred.task.profile.reduces", "); // no reduces ]ob job = new ]ob(conf, "Max temperature");

第一行启用了分析工具(默认是关闭状态)。在新的API中,可以使用]obContext.TASK_PROFIL常量,而不使用mapred.task.profile

接下来设置分析参数,即传到任务JVM的额外的命令行参数。一旦启用分析,即使启用JVM重用,也会给每个任务分配一个新的JVM。详见6.5.4节。默认参数定义了HPROF分析器,示例中设置一个额外的HPROF选项depth=6,以便能达到更深的栈跟踪深度(相比HPROF默认值)。使用DobContext.Task_PROFILE_PARAMS相当于设置mapred.task.profile.params0

最后,指定希望分析的任务。一般只需要少数几个任务的分析信息,所以mapred.task.profile.map mapred.task.profile.reduces M个属性来指定想要分析的mapreduce任务ID的范围。我们将map属性设置为〇-2(默认情况下),这意味着ID0、1、2的map任务将被分析。允许范围集合(a set of ranges)的表示方法,使用一个标注允许开放范(openrange)。例如0-1、4、6-将指定除了ID2、3、5之外的所有任 务。要分析的map任务,还可以使用HobContext.NUM_MAP_PROGILES量来控制,reduce任务则由]obContext.NUM_REDUCE_PROFILES常量来控制。

使用修改过的驱动程序来运行作业时,分析结果将输出到在启动作业的文

HPROF使用字节码插入来解析代码,所以在使用自己的应用程序之前,我们不需要带上特殊选项来重新编译它。有关HPROF的详情,请参见题为“HPROF: A Heap/CPU Profiling. Tool in J2SE 5.0”的文章,作者Kelly O’Hair,网址为http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

 

件夹中该作业的末尾。因为我们只分析少数几个任务,所以可以在数据集的子集上运行该作业。下面取自mapper的一个分析文件,它显示了CPU的抽样信息:

CPU

SAMPLES BEGIN

(total

=1002)

Sat Apr 11

11:17:52 2009

rank

self

accum

count

trace

method

1

3.49%

3.49%

35

307969

java.lang.Object.<init>

2

3.39%

6.89%

34

307954

java.lang.Object.<init>

3

3.19%

10.08%

32

307945

java.util.regex.Matcher.<init>

4

3.19%

13.27%

32

307963

java.lang.Object.<init>

5

3.19%

16.47%

32

307973

java.lang.Object.<init>

 

 

交叉引用跟踪号307973显示了同一文件的栈跟踪轨迹:

TRACE307973:(thread=200001)

java•lang.Object•<init>(Object.java:2汉)

ong.apache.hadoop.io.IntWritable.<init>(IntWritable.java:29) v5.MaxTemperatureMapper.map(MaxTemperatureMapper.java:30) v5.MaxTemperatureMapper.map(MaxTemperatureMapper.java:14) org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:356)

因此可以看出,mapper花了3%的时间来构建IntWritable对象。这表明重用Writable实例作为输出来观察在我们的集群和数据集上是否有任何的性能提升。在一个实验中,我修改mapperWritable对象存储为实例变量。当我在〗1个节点的集群上运行修改后的程序时,在作业整体执行时 间上没有看到有明显的变化。当然,你的实验结果可能有所不同。

2.其他分析工具

获取分析输出的机制是HPROF专有的,因此如果你使用其他的分析工具必须从tasktracker中手动检索分析输出。

如果在所有tasktracker的机器上都没有安装分析工具,可以考虑使用DistributedCache(分布式缓存,详见8.4.2节)在需要的机器上安装该分析 工具。

转载请注明:全栈大数据 » 5.6.1 分析任务

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址