[Hadoop源码解读](四)MapReduce篇之Counter相关类

当我们定义一个Counter时,我们首先要定义一枚举类型:
 public static enum MY_COUNTER{
   CORRUPTED_DATA_COUNTER,
   NORMAL_DATA_COUNTER
 };
然后,我们就可以在mapper或reducer里面增加它的值:
context.getCounter(MY_COUNTER.CORRUPTED_DATA_COUNTER).increment(1);
我们在第(一)篇讲InputFormat时,我们有看到Mapper.class中的Context类是继承于MapContext类的,而MapContext又继承于TaskInputOutputContext,我们可以从TaskInputOutputContext的getCounter()方法看见,这个方法实际上是调用了StatusReporter的getCounter()方法,StatusReporter在后面谈到。
接着,我们在提交job,waitForCompletion()方法等待job执行完后,就可以通过
Counters counters = job.getCounters(); Counter counter = counters.findCounter(MYCOUNTER.CORRUPTED_DATA_COUNTER); System.out.println(counter.getValue());
这样就将我们想要输出的计数器输出来。如果在执行前企图输出,则会报:java.lang.IllegalStateException: Job in state DEFINE instead of RUNNING。
Counter对应我们写的enum类型中的一个枚举常量,比如MY_COUNTER.CORRUTED_DATA_COUNTER,它由name,displayName和value表示,value是Counter当前计数值。Counter、CounterGroup和Counters都实现了Writable接口,由于Counter是全局的,所以它们的读写方法都是synchronized方法,以保证线程安全。
CounterGroup对应我们写的enum类型,比如MY_COUNTER。CounterGroup有name,displayName,TreeMap类型的counters,以及一个ResourceBoundle bundle。counters存放的是enum里面的所有枚举常量对应的Counter。而bundle是用来本地化Counter的名字的。举个例子:src\mapred\org\apache\hadoop\mapred下有一个JobInProgress_Counter.properties文件,内容是这样的:
# ResourceBundle properties file for job-level counters CounterGroupName= Job Counters NUM_FAILED_MAPS.name= Failed map tasks NUM_FAILED_REDUCES.name= Failed reduce tasks TOTAL_LAUNCHED_MAPS.name= Launched map tasks TOTAL_LAUNCHED_REDUCES.name= Launched reduce tasks OTHER_LOCAL_MAPS.name= Other local map tasks DATA_LOCAL_MAPS.name= Data-local map tasks RACK_LOCAL_MAPS.name= Rack-local map tasks FALLOW_SLOTS_MILLIS_MAPS.name= Total time spent by all maps waiting after reserving slots (ms) FALLOW_SLOTS_MILLIS_REDUCES.name= Total time spent by all reduces waiting after reserving slots (ms)
它存放的是job级别的counters的本地化名字。形式是name = displayName。
这样,我们就可以每次利用name从改文件中读取displayName,使得当我们改变这个properties文件中的某个displayName的时候,不需要改动程序。
Counters是一个Job的Counter最后的汇聚地,在分析Job类得时候,我们看到Job.getCounters()方法是用RunningJob得到的,而RunningJob是获取作业情况的一组接口。因为Counters会最终被JobTracker收集,要不断从TaskTracker收集并更新,因此它包含一个缓冲最近读的Counter的cache来进行优化,它还有一个存储Job的所有Counter的TreeMap。当我们使用findCounter((Enum<?> key)方法查找Counter时,它会先在cache中查找,如果没有找到,则会从TreeMap中查找并放入cache中。Counters还实现了Iterable接口,以支持对Counters的遍历。另外还提供了increase所有Counter的方法incrAllCounters()。
from : http://blog.csdn.net/posa88/article/details/7904720
[Hadoop源码解读](四)MapReduce篇之Counter相关类的更多相关文章
- [Hadoop源码解读](六)MapReduce篇之MapTask类
		MapTask类继承于Task类,它最主要的方法就是run(),用来执行这个Map任务. run()首先设置一个TaskReporter并启动,然后调用JobConf的getUseNewAPI()判断 ... 
- Hadoop源码解读系列目录
		Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解2.hadoop源码|core模块-序列化与压缩详解3.hadoop源码|core模块-远程调用与NIO ... 
- Hadoop2源码分析-MapReduce篇
		1.概述 前面我们已经对Hadoop有了一个初步认识,接下来我们开始学习Hadoop的一些核心的功能,其中包含mapreduce,fs,hdfs,ipc,io,yarn,今天为大家分享的是mapred ... 
- Bert系列 源码解读 四 篇章
		Bert系列(一)——demo运行 Bert系列(二)——模型主体源码解读 Bert系列(三)——源码解读之Pre-trainBert系列(四)——源码解读之Fine-tune 转载自: https: ... 
- [Hadoop源码解读](一)MapReduce篇之InputFormat
		平时我们写MapReduce程序的时候,在设置输入格式的时候,总会调用形如job.setInputFormatClass(KeyValueTextInputFormat.class);来保证输入文件按 ... 
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
		前面讲了InputFormat,就顺便讲一下Writable的东西吧,本来应当是放在HDFS中的. 当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节 ... 
- [Hadoop源码解读](三)MapReduce篇之Job类
		下面,我们只涉及MapReduce 1,而不涉及YARN. 当我们在写MapReduce程序的时候,通常,在main函数里,我们会像下面这样做.建立一个Job对象,设置它的JobName,然后配置输入 ... 
- spring beans源码解读之--总结篇
		spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ... 
- Python Web Flask源码解读(四)——全局变量
		关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ... 
随机推荐
- WPF 关于XDocument(xml) 的部分操作记录
			(1)删除xml文件中的一个结点的方法,有如下两种方式(只有存在数据绑定的情况下才会有第二种情况,否则一般是第一种情况): private void DeletePacsNode() { //从xml ... 
- C++异常处理(Exception Handling)
			在C++中引入了三种操作符来处理程序的出错情况,分别是:try , throw , catch 1.基本的用法如下: try{ //code to be tried throw exceptio ... 
- 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
			我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3555111.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ... 
- (转)boost::bind介绍
			转自:http://www.cnblogs.com/sld666666/archive/2010/12/14/1905980.html 这篇文章介绍boost::bind()的用法, 文章的主要内容是 ... 
- 九度OJ 1214 寻找丑数【算法】
			题目地址:http://ac.jobdu.com/problem.php?pid=1214 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因 ... 
- jQuery 扩展 【ajax实例】
			先前写工具类都是自定义类,直接prototype,jQuery扩展这一块儿,一直也没写过,刚好今天有空,写个试试. 已经有很多人对jQuery,jQuery.fn,jQuery.fn.extend详细 ... 
- 解决ie8下h5元素兼容性的问题
			HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ... 
- discuz 重新定义jquery的$
			最近做个小插件 发现加了这个代码不执行: $.ajax({ url:'plugin.php?id=register:regeist_jiangsu', type:'post', data:{ 'mob ... 
- 在Intellij IDEA或者PhpStorm下用X-debug调试PHP
			用Intellij IDEA或者PhpStorm使用X-debug来调试PHP,主要需要配置的部分有三个地方,分别为php.ini的配置,IDEA的配置和浏览器的配置,主要如下,以备忘: php.in ... 
- 为WPF版的GridControl控件添加行序号功能
			废话不多数,先上效果图和代码: 包装GridControl控件 cs using DevExpress.Xpf.Data; using DevExpress.Xpf.Grid; using Syste ... 
