`
dajuezhao
  • 浏览: 60520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop中自定义计数器

阅读更多

一、环境

1、hadoop 0.20.2

2、操作系统Linux

二、背景

1、最近写MR的代码,总在想统计一些错误的数据出现的次数,发现如果都写在reduce的输出里太难看了,所以想找办法专门输出一些统计数字。

2、翻看《hadoop权威指南》第8章第1节的时候发现能够自定义计数器,但都是基于0.19版本写的,好多函数都不对,改动相对较大。

3、基于上面2个理由,写个文档,记录一下。

三、实现

1、前提:写入一个文件,规范的是3个字段,“\t”划分,有2条异常,一条是2个字段,一条是4个字段,内容如下:
jim 1 28
kate 0 26
tom 1
kaka 1 22
lily 0 29 22
2、统计处不规范的数据。我没有写reduce,因为不需要输出,代码如下,先看代码
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class MyCounter {

public static class MyCounterMap extends Mapper<LongWritable, Text, Text, Text> {

public static Counter ct = null;

protected void map(LongWritable key, Text value,
org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, Text>.Context context)
throws java.io.IOException, InterruptedException {
String arr_value[] = value.toString().split("\t");
if (arr_value.length > 3) {
ct = context.getCounter("ErrorCounter", "toolong");
ct.increment(1);
} else if (arr_value.length < 3) {
ct = context.getCounter("ErrorCounter", "tooshort");
ct.increment(1);
}
}
}

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: MyCounter <in> <out>");
System.exit(2);
}

Job job = new Job(conf, "MyCounter");
job.setJarByClass(MyCounter.class);

job.setMapperClass(MyCounterMap.class);

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

3、启动命令如下:
hadoop jar /jz/jar/Hadoop_Test.jar jz.MyCounter /jz/* /jz/06
对于小于3个字段的采用tooshort统计,大于3个字段的采用toolong统计

4、结果如下(红色部分):
10/08/04 17:29:15 INFO mapred.JobClient: Job complete: job_201008032120_0019
10/08/04 17:29:15 INFO mapred.JobClient: Counters: 18
10/08/04 17:29:15 INFO mapred.JobClient: Job Counters
10/08/04 17:29:15 INFO mapred.JobClient: Launched reduce tasks=1
10/08/04 17:29:15 INFO mapred.JobClient: Rack-local map tasks=1
10/08/04 17:29:15 INFO mapred.JobClient: Launched map tasks=6
10/08/04 17:29:15 INFO mapred.JobClient: ErrorCounter
10/08/04 17:29:15 INFO mapred.JobClient: tooshort=1
10/08/04 17:29:15 INFO mapred.JobClient: toolong=1
10/08/04 17:29:15 INFO mapred.JobClient: FileSystemCounters
10/08/04 17:29:15 INFO mapred.JobClient: FILE_BYTES_READ=6
10/08/04 17:29:15 INFO mapred.JobClient: HDFS_BYTES_READ=47
10/08/04 17:29:15 INFO mapred.JobClient: FILE_BYTES_WRITTEN=234
10/08/04 17:29:15 INFO mapred.JobClient: Map-Reduce Framework
10/08/04 17:29:15 INFO mapred.JobClient: Reduce input groups=0
10/08/04 17:29:15 INFO mapred.JobClient: Combine output records=0
10/08/04 17:29:15 INFO mapred.JobClient: Map input records=5
10/08/04 17:29:15 INFO mapred.JobClient: Reduce shuffle bytes=36
10/08/04 17:29:15 INFO mapred.JobClient: Reduce output records=0
10/08/04 17:29:15 INFO mapred.JobClient: Spilled Records=0
10/08/04 17:29:15 INFO mapred.JobClient: Map output bytes=0
10/08/04 17:29:15 INFO mapred.JobClient: Combine input records=0
10/08/04 17:29:15 INFO mapred.JobClient: Map output records=0
10/08/04 17:29:15 INFO mapred.JobClient: Reduce input records=0
四、总结
1、其实hadoop权威指南写的很清楚了,但是由于版本不一样,所以很多方法也不同,总一下,主要有以下不同:
不再需要枚举的类型、计数器名不在需要写properties文件,调用的方法在context中都封装了。
2、hadoop权威指南中写了统计百分比值,代码改改就能实现,就是一个总数除以错误数然后百分比的结果。
3、有疑问或是写的不对的地方,欢迎发邮件到dajuezhao@gmail.com

分享到:
评论

相关推荐

    hadoop实现计数器

    开发人员可以自定义计数器组,并在Mapper或Reducer中增加计数器实例来跟踪特定的事件或指标。例如,可以创建一个计数器来追踪处理的行数,或者另一个计数器来记录遇到的错误。这些计数器的值可以在JobTracker或YARN...

    javamap源码-HADOOP-COUNTER-SOURCE-CODE:在HadoopMapReduce编码中使用自定义计数器的Java程序

    这个项目可能包含一个或多个示例,展示了如何在Mapper和Reducer中创建和更新自定义计数器,以便监控任务的执行情况。 首先,我们需要了解Hadoop MapReduce的基本工作流程。MapReduce将大数据处理任务拆分为两个主要...

    18、MapReduce的计数器与通过MapReduce读取-写入数据库示例

    计数器分为两类:Hadoop内置的计数器和自定义计数器。 内置计数器主要由Hadoop框架提供,例如Map任务和Reduce任务的数量、输入和输出的数据量等。这些计数器在MapReduce作业的执行过程中自动更新,并在日志中打印...

    Hadoop MapReduce高级特性

    而自定义计数器则是由开发者在编写MapReduce程序时设定的,用以统计用户自定义事件的发生次数,比如无效记录的计数、记录某些特殊情况的发生等。计数器的存在使得开发者可以进行质量控制、应用级别的统计和问题定位...

    Hadoop大数据实训,求最高温度最低温度实验报告

    在这个实验中,可能会使用自定义计数器来记录不同年份的气温记录数量,或者处理的行数等,以便于监控和分析程序的运行情况。 3. **MapReduce参数传递**:在配置MapReduce作业时,我们可能需要设置一些特定的参数,...

    Hadoop集群管理

    - **用户定义Java计数器**:允许用户在MapReduce程序中自定义计数器,以便更好地监控和调试程序。 ##### 计数器的应用场景 - **质量控制**:通过监控计数器可以及时发现数据质量问题,比如无效记录的比例过高。 - ...

    计数器.rar

    例如,Hadoop MapReduce框架中,开发者可以定义自定义的计数器来记录处理过程中的关键指标,这有助于分析任务性能和调试。Apache Spark等流处理系统也有类似的概念,允许用户创建和使用计数器来跟踪实时处理的数据量...

    hadoop调查报告书

    - **计数器**:提供自动计数器和用户自定义计数器,用于统计任务执行情况。 - **任务分割**:自动将大任务拆分成小任务,以便并行处理。 #### 管理功能 - **任务监控**:提供了可视化界面来监控任务执行状态。 - **...

    Hadoop权威指南 第二版(中文版)

     从Hadoop URL中读取数据  通过FileSystem API读取数据  写入数据  目录  查询文件系统  删除数据  数据流  文件读取剖析  文件写入剖析  一致模型  通过 distcp并行拷贝  保持 HDFS 集群的均衡  ...

    Hadoop权威指南(中文版)2015上传.rar

    从Hadoop URL中读取数据 通过FileSystem API读取数据 写入数据 目录 查询文件系统 删除数据 数据流 文件读取剖析 文件写入剖析 一致模型 通过 distcp并行拷贝 保持 HDFS 集群的均衡 Hadoop的归档文件 使用Hadoop归档...

    Hadoop 培训课程(4)MapReduce_2

    Hadoop 培训课程(4)MapReduce_2 标准和自定义计数器* Combiner和Partitioner编程** 自定义排序和分组编程** 常见的MapReduce算法** ---------------------------加深拓展---------------------- 常见大数据处理方法*

    Hadoop实战

    高级MapReduce技术包括自定义输入/输出格式、优化数据分区、使用组合器减少网络传输、实现计数器监控程序性能、利用缓存提高效率等。通过这些高级技术,可以更灵活地控制数据流和计算过程,提高处理效率。 ### 管理...

    Hadoop_MapReduce教程

    - **Counters**:Counters 用于统计作业过程中的各种计数器信息,如处理的记录数量等。 - **DistributedCache**:DistributedCache 可以在作业运行时将一些辅助文件分发到各个 TaskTracker 上,便于 Mapper 或 ...

    通用大数据存储与分析处理平台_Hadoop.docx

    - **作业**:Hadoop中的任务单元。 - **集群规模**:根据需求调整集群的大小。 - **网络拓扑**:优化网络架构以提升性能。 - **环境设置**:配置Hadoop运行环境。 - **守护进程的关键属性**:如NameNode、DataNode和...

    介绍基于Hadoop的C++扩展和新的任务计划

    - **高级接口**:允许用户自定义更多的功能,如JobConf用于获取作业配置、Counter允许用户定义计数器等。 #### 七、HCE实例——Word Count 以Word Count为例,展示了如何使用HCE进行MapReduce任务的编写和执行。...

Global site tag (gtag.js) - Google Analytics