未调用hadoop map()函数

pdtvr36n  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(276)

我的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()类或者类初始化从来没有被调用,我会非常感激?

30byixjq

30byixjq1#

看来你在用 System.out.println 调试hadoop作业的语句。
这种方法的问题是 println 声明不会进入你的控制台。他们去工作日志。这就是为什么你看不到“mapper init!”在你的控制台里。
你需要看看作业日志。
引用一位伟人的话(以及这个答案):
访问日志的简单方法是http://example.com:50030/jobtracker.jsp->单击已完成的作业->单击Map或减少任务->单击任务号->任务日志->标准日志。

相关问题