java – 使用Hadoop计数器 – 多个作业
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Hadoop计数器 – 多个作业,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2502字,纯文字阅读大概需要4分钟。
内容图文
![java – 使用Hadoop计数器 – 多个作业](/upload/InfoBanner/zyjiaocheng/734/c798ed27d7da429e9a2114ad59e93c6c.jpg)
我正在使用Hadoop开发mapreduce项目.我目前有3个连续的工作.
我想使用Hadoop计数器,但问题是我想在第一个作业中进行实际计数,但是在第三个作业的reducer中访问计数器值.
我怎样才能做到这一点?我应该在哪里定义枚举?我是否需要通过它才能完成第二份工作?它还有助于查看一些代码示例,因为我还没有找到任何东西.
注意:我使用的是Hadoop 2.7.2
编辑:我已经尝试过解释here的方法,但没有成功.我的情况不同,因为我想从不同的工作访问计数器. (不是从mapper到reducer).
我试图做的:
第一份工作:
public static void startFirstJob(String inputPath, String outputPath) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "wordCount");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
job.setInputFormatClass(SequenceFileInputFormat.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(inputPath));
FileOutputFormat.setOutputPath(job, new Path(outputPath));
job.waitForCompletion(true);
}
在另一个类中定义了计数器枚举:
public class CountersClass {
public static enum N_COUNTERS {
SOMECOUNT
}
}
试着读一下柜台:
Cluster cluster = new Cluster(context.getConfiguration());
Job job = cluster.getJob(JobID.forName("wordCount"));
Counters counters = job.getCounters();
CountersClass.N_COUNTERS mycounter = CountersClass.N_COUNTERS.valueOf("SOMECOUNT");
Counter c1 = counters.findCounter(mycounter);
long N_Count = c1.getValue();
解决方法:
经典的解决方案是将作业的计数器值放入您需要访问它的后续作业的配置中:
因此,请确保在计数作业映射器/缩减器中正确递增:
context.getCounter(CountersClass.N_COUNTERS.SOMECOUNT).increment(1);
然后在完成工作完成后:
job.waitForCompletion(true);
Counter someCount = job.getCounters().findCounter(CountersClass.N_COUNTERS.SOMECOUNT);
//put counter value into conf object of the job where you need to access it
//you can choose any name for the conf key really (i just used counter enum name here)
job2.getConfiguration().setLong(CountersClass.N_COUNTERS.SOMECOUNT.name(), someCount.getValue());
下一篇文章是在另一个作业的mapper / reducer中访问它.只需覆盖设置()
例如:
private long someCount;
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
super.setup(context);
this.someCount = context.getConfiguration().getLong(CountersClass.N_COUNTERS.SOMECOUNT.name(), 0));
}
内容总结
以上是互联网集市为您收集整理的java – 使用Hadoop计数器 – 多个作业全部内容,希望文章能够帮你解决java – 使用Hadoop计数器 – 多个作业所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。