zoukankan      html  css  js  c++  java
  • 【转】[Hadoop源码解读](四)MapReduce篇之Counter相关类

    转自: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的名字的。举个例 子:srcmapredorgapachehadoopmapred下有一个 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()。

  • 相关阅读:
    维护没有源代码的遗留 Java 项目
    项目管理软件
    Web系统页面打印技术实现与分析
    包饺子
    深入理解浏览器兼容性模式
    无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像
    命令行下IIS的配置脚本Adsutil.vbs
    浏览器开发工具的秘密
    高速公路坐标高程计算软件3.6版本发布
    VB模拟键盘输入的N种方法
  • 原文地址:https://www.cnblogs.com/conie/p/3583596.html
Copyright © 2011-2022 走看看