转自:http://www.cnblogs.com/lucius/p/3449922.html

当我们定义一个Counter时,我们首先要定义一枚举类型:

1 public static enum MY_COUNTER{
2   CORRUPTED_DATA_COUNTER,
3   NORMAL_DATA_COUNTER
4 };

然后,我们就可以在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执行完后,就可以通过

1 Counters counters = job.getCounters();
2 Counter counter = counters.findCounter(MYCOUNTER.CORRUPTED_DATA_COUNTER);
3 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文件,内容是这样的:

 1 # ResourceBundle properties file for job-level counters
 2
 3 CounterGroupName=                  Job Counters
 4
 5 NUM_FAILED_MAPS.name=              Failed map tasks
 6 NUM_FAILED_REDUCES.name=           Failed reduce tasks
 7 TOTAL_LAUNCHED_MAPS.name=          Launched map tasks
 8 TOTAL_LAUNCHED_REDUCES.name=       Launched reduce tasks
 9 OTHER_LOCAL_MAPS.name=             Other local map tasks
10 DATA_LOCAL_MAPS.name=              Data-local map tasks
11 RACK_LOCAL_MAPS.name=              Rack-local map tasks
12 FALLOW_SLOTS_MILLIS_MAPS.name=     Total time spent by all maps waiting after reserving slots (ms)
13 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()。

转载于:https://www.cnblogs.com/conie/p/3583596.html

【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类相关推荐

  1. Hadoop源码解读系列目录

    Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解 2.hadoop源码|core模块-序列化与压缩详解 3.hadoop源码|core模块-远程调用与N ...

  2. hdl_graph_slam源码解读(四):关键帧

    目录 1. 整体介绍 2. 详细介绍 2.1 KeyFrame类 2.2 KeyFrameSnapshot类 2.3 KeyFrameUpdater类 参考文献 1. 整体介绍 在图优化中,关键帧的作 ...

  3. BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多

    上拉加载 上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示. 此篇文章为BaseRecyclerViewAdapterHelper源码解读第四篇,开源库地址,如果没有看过之前3 ...

  4. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类. org.springframework.beans.ann ...

  5. 若依框架源码解读之数据源篇

    读源码过程中读到yml中有设置主次数据源,次数据源没有启用,在看到DruidConfig中的配置时,没有搞明白,怎么让mybatis找到主数据源的,请教大神在哪里实现的. 附上数据源配置 @Bean( ...

  6. JStorm/Storm源码解读(二)--启动篇

    为了在解读分析时有个统一的思路,本文将从启动一个集群开始分析. (说明:为了测试方便,采用的是本地模式). 1.参数设置 Config conf = new Config(); //设置Topolog ...

  7. Bootstrap源码解读之栅格化篇

    本文纯属自己研究所写笔记,如果有错误还请多多指教提出 版心(container) 版心:class名为.container的容器,其版心的宽度在各个屏幕设备下是不一样的值,版心两边就是留白.  各尺寸 ...

  8. 目标检测之DarkNet-DarkNet源码解读<一>测试篇

    目标检测-DarkNet源码解读 DarkNet源码解读 1.一些思考  1.1 DarkNet的本质  1.2 深度学习分为两条线  1.3 检测任务的步骤 2.代码走读  2.1 程序入口  2. ...

  9. 约2万字-Vue源码解读汇总篇(续更)

    约2万字-Vue源码解读汇总篇(续更) 一.前言 1.系列汇总 未完待续... Vue源码解读:06Vue3探索篇 Vue源码解读:05生命周期篇 Vue源码解读:04模板编译篇 Vue源码解读:03 ...

最新文章

  1. 北京智源人工智能研究院关于征集2019年度智源青年科学家的通知
  2. 如果重走职场,一定会送自己 8 个锦囊
  3. 【数字信号处理】线性时不变系统 LTI ( 判断某个系统是否是 “ 非时变 “ 系统 | 案例一 | 先变换后移位 | 先移位后变换 )
  4. Linux中搭建一个ftp服务器详解
  5. HDU - 7073 Integers Have Friends 2.0 随机化 + 质因子
  6. c语言666题目,c语言题目及答案
  7. 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么
  8. 计算机文档我的文档丢失,“我的文档”不见了如何找回?几种解决“我的文档不见了”的办法...
  9. 《晨间日记的奇迹》内容概要及读书心得
  10. 「Pytorch」CNN实现手写汉字识别(数据集制作,网络搭建,训练验证测试全部代码)
  11. Mysql 实现多种逻辑删除方案
  12. 收藏的一些有意思的网站
  13. jquery 封装幻灯插件_21个jQuery幻灯片插件
  14. Flutter 日期转换
  15. Pair project(刘昊岩11061156 黄明源11061186)
  16. photoshop教程:替换颜色
  17. 七大步教你征服丈母娘
  18. ASCII码中可打印字符和不可打印字符
  19. 支付宝人脸认证(安卓)
  20. 数学分析公式LaTex练习-洛必达法则

热门文章

  1. MyBatis之注解开发
  2. Halcon知识:如何画出灰度图像直方图
  3. ROS知识:关于如何命名的约定
  4. mysql包1166_mysql 错误:1166 解决办法
  5. vs当前文件的函数索引_VM实战(六) - 通过案例深入学习class文件结构原理
  6. Android适配器以及作用,Android RecyclerView 通用适配器的实现
  7. 递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分
  8. Python 一种接触就容易爱上的语言一
  9. 深度linux安装双,Deepin 20正式发布,新的外观和感觉,双内核安装
  10. Special Judge Ⅲ(这道题考的就是出栈序列判定_关键代码不差什么)