[Hadoop源码解读](四)MapReduce篇之Counter相关类
来源:互联网 发布:环球易购 php 编辑:程序博客网 时间:2024/05/16 00:53
当我们定义一个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());
这样就将我们想要输出的计数器输出来。
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()。
- [Hadoop源码解读](四)MapReduce篇之Counter相关类 (转)
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类<转>
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类<转>
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](五)MapReduce篇之Writable相关类
- [Hadoop源码解读](二)MapReduce篇之Mapper类
- h264编码前必须要转换为yuv420p格式
- Swing是一把很菜的刀
- android 手把手实现自定义列表
- TweenMax使用方法
- APIO2014题解
- [Hadoop源码解读](四)MapReduce篇之Counter相关类
- editplus 使用技巧
- Java之Stack详解
- 第八周项目1——实现复数类中的运算符重载
- PAT刷题第一天。。。
- Unix/Linux进阶(系统管理、网络配置、Shell编程、Linux内核、驱动开发经典书籍及学习顺序)
- 关于slab分配---学习网络skb相关
- 多线程的创建方式
- 进程的创建过程