kangfoo's blog

工作学习笔记,生活掠影。

Hadoop MapReduce 计数器

| 评论

计数器是一种收集系统信息有效手段,用于质量控制或应用级统计。可辅助诊断系统故障。计数器可以比日志更方便的统计事件发生次数。

内置计数器

Hadoop 为每个作业维护若干内置计数器,主要用来记录作业的执行情况。

内置计数器包括

  • MapReduce 框架计数器(Map-Reduce Framework)
  • 文件系统计数器(FielSystemCounters)
  • 作业计数器(Job Counters)
  • 文件输入格式计数器(File Output Format Counters)
  • 文件输出格式计数器(File Input Format Counters)

计数器由其关联的 task 进行维护,定期传递给 tasktracker,再由 tasktracker 传给 jobtracker。因此,计数器能够被全局地聚集。内置计数器实际由 jobtracker 维护,不必在整个网络发送。

一个任务的计数器值每次都是完整传输的,仅当一个作业执行成功之后,计数器的值才完整可靠的。

自定义Java计数器

MapReduce 允许用户自定义计数器,MapReduce 框架将跨所有 map 和 reduce 聚集这些计数器,并在作业结束的时候产生一个最终的结果。

计数器的值可以在 mapper 或者 reducer 中添加。多个计数器可以由一个 java 枚举类型来定义,以便对计数器分组。一个作业可以定义的枚举类型数量不限,个个枚举类型所包含的数量也不限。

枚举类型的名称即为组的名称,枚举类型的字段即为计数器名称。

在 TaskInputOutputContext 中的 counter

 public Counter getCounter(Enum<?> counterName) {
    return reporter.getCounter(counterName);
  }
  public Counter getCounter(String groupName, String counterName) {
    return reporter.getCounter(groupName, counterName);
  }

计数器递增

org.apache.hadoop.mapreduce.Counter类

  public synchronized void increment(long incr) {
    value += incr;
  }

计数器使用

  • WebUI 查看(50030);
  • 命令行方式:hadoop job [-counter ];
  • 使用Hadoop API。 通过job.getCounters()得到Counters,而后调用counters.findCounter()方法去得到计数器对象;可参见《Hadoop权威指南》第8章 示例 8-2 MissingTemperaureFields.java

命令行方式示例

$ ./bin/hadoop job -counter  job_201402211848_0004 FileSystemCounters HDFS_BYTES_READ
177

自定义计数器

统计词汇行中词汇数超过2个或少于2个的行数。 源代码: TestCounter.javaTestCounter.java

输入数据文件值 counter.txt:

hello world
hello
hello world 111
hello world 111 222

执行参数

hdfs://master11:9000/counter/input/a.txt hdfs://master11:9000/counter/output1

计数器统计(hadoop eclipse 插件执行)结果:

2014-02-21 00:03:38,676 INFO  mapred.JobClient (Counters.java:log(587)) -   ERROR_COUNTER
2014-02-21 00:03:38,677 INFO  mapred.JobClient (Counters.java:log(589)) -     Above_2=2
2014-02-21 00:03:38,677 INFO  mapred.JobClient (Counters.java:log(589)) -     BELOW_2=1

评论