Hadoop HPROF 分析没有写入 CPU 样本

Posted

技术标签:

【中文标题】Hadoop HPROF 分析没有写入 CPU 样本【英文标题】:Hadoop HPROF profiling no CPU SAMPLES written 【发布时间】:2014-09-22 22:23:34 【问题描述】:

我想使用 HPROF 来分析我的 Hadoop 作业。问题是我得到了TRACES,但profile.out 文件中没有CPU SAMPLES。我在 run 方法中使用的代码是:

    /** Get configuration */
    Configuration conf = getConf();
    conf.set("textinputformat.record.delimiter","\n\n");
    conf.setStrings("args", args);

    /** JVM PROFILING */
    conf.setBoolean("mapreduce.task.profile", true);
    conf.set("mapreduce.task.profile.params", "-agentlib:hprof=cpu=samples," +
       "heap=sites,depth=6,force=n,thread=y,verbose=n,file=%s");
    conf.set("mapreduce.task.profile.maps", "0-2");
    conf.set("mapreduce.task.profile.reduces", "");

    /** Job configuration */
    Job job = new Job(conf, "HadoopSearch");
    job.setJarByClass(Search.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(NullWritable.class);

    /** Set Mapper and Reducer, use identity reducer*/
    job.setMapperClass(Map.class);
    job.setReducerClass(Reducer.class);

    /** Set input and output formats */
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    /** Set input and output path */
    FileInputFormat.addInputPath(job, new Path("/user/niko/16M"));  
    FileOutputFormat.setOutputPath(job, new Path(cmd.getOptionValue("output")));

    job.waitForCompletion(true);

    return 0;

如何让CPU SAMPLES 写入输出?

我在stderr 上也有一个奇怪的错误消息,但我认为它不相关,因为当分析设置为 false 或启用分析的代码被注释掉时,它也会出现。错误是

 log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.impl.MetricsSystemImpl).
 log4j:WARN Please initialize the log4j system properly.
 log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

【问题讨论】:

【参考方案1】:

Yarn(或 MRv1)在您的工作完成后立即杀死容器。 CPU 样本无法写入您的分析文件。事实上,你的痕迹也应该被截断。

您必须添加以下选项(或您的 Hadoop 版本上的等效选项):

yarn.nodemanager.sleep-delay-before-sigkill.ms = 30000
# No. of ms to wait between sending a SIGTERM and SIGKILL to a container

yarn.nodemanager.process-kill-wait.ms = 30000
# Max time to wait for a process to come up when trying to cleanup a container

mapreduce.tasktracker.tasks.sleeptimebeforesigkill = 30000
# Same en MRv1 ?

(30 秒似乎足够了)

【讨论】:

工作就像一个魅力。【参考方案2】:

这可能是由https://issues.apache.org/jira/browse/MAPREDUCE-5465 引起的,在较新的 Hadoop 版本中已修复。

所以解决方案似乎是:

使用 ALSimon 的回答中提到的设置,或者 升级到 Hadoop >= 2.8.0

【讨论】:

以上是关于Hadoop HPROF 分析没有写入 CPU 样本的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop MapReduce中把分析数据写入mysql中

如何为 Java 1.4 应用程序收集分析信息?

开发者的自测利器-Hprof命令(寻找cpu热点)

如何分析 jar 中的类?

eclipse内存分析工具导入android内存文件hprof报错:Unknown HPROF Version

eclipse内存分析工具导入android内存文件hprof报错:Unknown HPROF Version