2014-09-22 5 views
2

Je veux utiliser HPROF pour profiler mon travail Hadoop. Le problème est que je reçois TRACES mais il n'y a pas CPU SAMPLES dans le fichier profile.out. Le code que je me sers dans ma méthode run est:Hadoop HPROF profilage pas CPU SAMPLES écrit

/** 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; 

Comment puis-je obtenir le CPU SAMPLES à écrire dans la sortie?

J'ai aussi un message d'erreur trange sur le stderr mais je pense que ce n'est pas lié, car il est présent également lorsque le profilage est défini sur false ou le code pour activer le profilage est mis en commentaire. L'erreur est

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. 

Répondre

2

Le fil (ou MRv1) tue le conteneur juste après la fin de votre travail. Les exemples de CPU ne peuvent pas être écrits dans votre fichier de profilage. En fait, vos traces devraient être tronquées aussi.

Vous devez ajouter l'option folowwing (ou l'équivalent de la version 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 sec semble assez)

+0

travaillé comme un charme. –

0

Ceci est probablement causé par https://issues.apache.org/jira/browse/MAPREDUCE-5465, qui est fixé dans versions plus récentes de Hadoop.

donc les solutions semblent être:

  • paramètres d'utilisation mentionnés dans la réponse de ALSimon, OU
  • mise à niveau vers Hadoop> = 2.8.0
Questions connexes