yarn stderr 没有 logger appender 也没有 stdout
yarn stderr no logger appender and no stdout
我正在 运行在 Apache Hadoop 2.6.0 上安装一个简单的 mapreduce 程序 wordcount。 hadoop 是 运行ning 分布式(多个节点)。但是,我无法从 yarn 作业历史记录中看到任何 stderr 和 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);
}
}
注意在Mapper的map函数中class,我加了两条语句:
LOG.info("LOG - map function invoked");
System.out.println("stdout - map function invoded");
这两个语句是为了测试我是否可以看到来自hadoop服务器的日志记录。我可以成功运行这个程序。但是,如果我转到 localhost:8088 查看应用程序历史记录,然后转到 "logs",我在 "stdout" 和 "stderr":
中什么也看不到
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.
我认为需要一些配置才能获得这些输出,但不确定缺少哪条信息。我在网上和 Whosebug 中都进行了搜索。有人提到 container-log4j.properties 但他们没有具体说明如何配置该文件以及放置在何处。
需要注意的一件事是,我还使用 Hortonworks Data Platform 2.2 和 Cloudera 5.4 尝试了这项工作。结果是一样的。我记得当我处理一些以前版本的 hadoop (hadoop 1.x) 时,我可以很容易地从同一个地方看到日志记录。所以我想这是 hadoop 中的新东西 2.x
=======
作为比较,如果我在本地模式下创建 apache hadoop 运行(即 LocalJobRunner),我可以在控制台中看到一些这样的日志记录:
[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
这些类型的日志记录 ("map function is invoked") 是我在 hadoop 服务器日志记录中所期望的。
所有用Map-Reduce程序写的sysout在console上是看不到的。是因为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 的控制台日志。
我正在 运行在 Apache Hadoop 2.6.0 上安装一个简单的 mapreduce 程序 wordcount。 hadoop 是 运行ning 分布式(多个节点)。但是,我无法从 yarn 作业历史记录中看到任何 stderr 和 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);
}
}
注意在Mapper的map函数中class,我加了两条语句:
LOG.info("LOG - map function invoked");
System.out.println("stdout - map function invoded");
这两个语句是为了测试我是否可以看到来自hadoop服务器的日志记录。我可以成功运行这个程序。但是,如果我转到 localhost:8088 查看应用程序历史记录,然后转到 "logs",我在 "stdout" 和 "stderr":
中什么也看不到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.
我认为需要一些配置才能获得这些输出,但不确定缺少哪条信息。我在网上和 Whosebug 中都进行了搜索。有人提到 container-log4j.properties 但他们没有具体说明如何配置该文件以及放置在何处。
需要注意的一件事是,我还使用 Hortonworks Data Platform 2.2 和 Cloudera 5.4 尝试了这项工作。结果是一样的。我记得当我处理一些以前版本的 hadoop (hadoop 1.x) 时,我可以很容易地从同一个地方看到日志记录。所以我想这是 hadoop 中的新东西 2.x
=======
作为比较,如果我在本地模式下创建 apache hadoop 运行(即 LocalJobRunner),我可以在控制台中看到一些这样的日志记录:
[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
这些类型的日志记录 ("map function is invoked") 是我在 hadoop 服务器日志记录中所期望的。
所有用Map-Reduce程序写的sysout在console上是看不到的。是因为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 的控制台日志。