2015-09-08 38 views
3

我正在运行一个简单的mapreduce程序wordcount agian Apache Hadoop 2.6.0。 hadoop分布式运行(几个节点)。但是,我无法从纱线工作历史中看到任何stderr和stdout。 (但我可以看到系统日志)yarn stderr no logger appender and no stdout

wordcount程序非常简单,只是为了演示目的。在映射类的地图功能

import java.io.IOException; 
import java.util.StringTokenizer; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 


public class WordCount { 
    public static final Log LOG = LogFactory.getLog(WordCount.class); 

    public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable>{ 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     LOG.info("LOG - map function invoked"); 
     System.out.println("stdout - map function invoded"); 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()) { 
     word.set(itr.nextToken()); 
     context.write(word, one); 
     } 
    } 
    } 

    public static class IntSumReducer 
     extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
         Context context 
      ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
      sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Configuration conf = new Configuration(); 
     conf.set("mapreduce.job.jar","/space/tmp/jar/wordCount.jar"); 
     Job job = Job.getInstance(conf, "word count"); 
     job.setJarByClass(WordCount.class); 
     job.setMapperClass(TokenizerMapper.class); 
     job.setCombinerClass(IntSumReducer.class); 
     job.setReducerClass(IntSumReducer.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 
     FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/user/jsun/input"));    
     FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/user/jsun/output")); 

     System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
    } 

注意,我添加了两个声明:

LOG.info("LOG - map function invoked"); 
System.out.println("stdout - map function invoded"); 

这两句话是测试我是否可以看到Hadoop的服务器日志记录。我可以成功运行该程序。但是,如果我去为localhost:8088看到的应用历史,然后在“日志”,我看没有什么“标准输出”,并在“标准错误”:

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

我认为是让那些需要一些配置输出,但不确定缺少哪条信息。我在网上搜索以及在stackoverflow。有些人提到了container-log4j.properties,但他们没有具体说明如何配置该文件以及放置位置。

有一点需要注意的是,我也尝试过使用Hortonworks Data Platform 2.2和Cloudera 5.4的工作。结果是一样的。我记得当我处理一些以前的hadoop版本(hadoop 1.x)时,我可以很容易地看到来自同一地点的日志。所以我想这是在Hadoop中2.X

=======

新的东西作为对比,如果我在本地模式下(意味着LocalJobRunner)在Apache Hadoop的运行,我可以看到一些测井公司在控制台这样的:

[2015-09-08 15:57:25,992]org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:998) INFO:kvstart = 26214396; length = 6553600 
[2015-09-08 15:57:25,996]org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:402) INFO:Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer 
[2015-09-08 15:57:26,064]WordCount$TokenizerMapper.map(WordCount.java:28) INFO:LOG - map function invoked 
stdout - map function invoded 
[2015-09-08 15:57:26,075]org.apache.hadoop.mapred.LocalJobRunner$Job.statusUpdate(LocalJobRunner.java:591) INFO: 
[2015-09-08 15:57:26,077]org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1457) INFO:Starting flush of map output 
[2015-09-08 15:57:26,077]org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1475) INFO:Spilling map output 

这些类型的测井公司的(“映射函数被调用”)是我所期待的在Hadoop中服务器日志记录。

回答

1

所有在Map-Reduce程序中编写的sysout都不能在控制台上看到。这是因为map-reduce在整个集群中以多个并行副本运行,所以没有一个控制台具有输出的概念。

但是,可以在作业日志中看到map和reduce阶段的System.out.println()。访问日志的简单的方法是

open the jobtracker web console - http://localhost:50030/jobtracker.jsp 
click on the completed job 
click on map or reduce task 
click on tasknumber 
Go to task logs 
Check stdout logs. 

请注意,如果你不能够找到URL,就看到控制台日志JobTracker的URL。

+1

这个问题已经清楚地说明了纱线作业历史中'标准输出'中没有预期的东西。而我并没有试图从'控制台'中找到输出。而且,既然你在说'job tracker',我想你的意思是mapreduce v1。但问题在于讨论纱线。 – mattsun