我的代码执行期间似乎根本没有调用我的map()函数,我无法理解为什么。以下是我的工作班......
public class MyHadoopJob extends Configured implements Tool{
static class MyMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
public MyMapper(){
System.out.println("Mapper init!");
}
@Override
protected void map(LongWritable key, Text value,
org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, LongWritable, Text>.Context context)
throws java.io.IOException, InterruptedException {
System.out.println("MAP!");
context.getCounter("mygroup", "jeff").increment(1);
context.write(key, value);
};
}
@Override
public int run(String[] strings) throws Exception {
Configuration conf = MYOBJ.getHadoopConf();
this.setConf(conf);
Job job = new Job(conf, "MyJob");
job.setJarByClass(MyHadoopJob.class);
job.setMapperClass(MyMapper.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job, new Path(strings[0]));
FileOutputFormat.setOutputPath(job, new Path(strings[1]));
job.waitForCompletion(true);
for(int i = 0; i < 10; i++){
log.info("Progress -> " + job.mapProgress());
Thread.sleep(15000);
}
return 0;
}
}
我真的很感激帮助搞清楚为什么map()类或者类初始化永远不会被调用?
答案 0 :(得分:0)
您似乎正在使用System.out.println
语句来调试Hadoop作业。
此方法的问题是println
语句不会转到您的控制台。他们去了工作日志。这就是为什么你没有看到“Mapper init!”的原因。在你的控制台中。
您需要查看工作日志。
引用一个好人(以及answer):
访问日志的简便方法是 http://example.com:50030/jobtracker.jsp-&gt;点击已完成 job-&gt;点击地图或缩小任务 - >点击tasknumber-&gt;任务 logs-&gt; stdout logs。