【发布时间】:2015-12-21 18:51:36
【问题描述】:
我正在通过以下方式从映射器中增加一个计数器
public static class TokenizerMapper
extends Mapper<Object, Text, Text, FloatWritable>{
public static enum MyCounters { TOTAL };
context.getCounter(MyCounters.TOTAL).increment(1);
。
我正在尝试通过以下方式在减速器类中获取此计数器的值。
@Override
public void setup(Context context) throws IOException ,InterruptedException{
Configuration conf = context.getConfiguration();
Cluster cluster = new Cluster(conf);
Job currentJob = cluster.getJob(context.getJobID());
Counters counters = currentJob.getCounters();
Counter counter = counters.findCounter(TokenizerMapper.MyCounters.TOTAL);
但是当我运行代码时,
它总是给出一个
java.lang.NullPointerException at the last line
cluster.getJob(context.getJobID())
它总是返回 null。
我尝试了其他方法来访问在 reducer 的映射器中递增的计数器,但没有成功。
有人可以向我解释到底是什么问题以及如何从 reducer 访问计数器。我需要总计数的值来计算单词的百分比。
这是我的驱动程序代码。
Configuration conf = new Configuration();
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(FloatWritable.class);
job.setNumReduceTasks(1);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
【问题讨论】:
-
你不应该创建一个新的集群来访问同一个计数器。你能告诉我你这样做的原因吗?您可以使用上下文直接获取作业实例。
-
获取作业实例。我不太确定如何从 context 获取作业实例。我会努力解决的
-
你能发布你的减速器和工作驱动代码吗?
-
我已经在最后添加了驱动代码。
标签: java hadoop nullpointerexception mapreduce