三、MapReduce第三讲Counter(计数器)
在写代码之前我先讲一下:
MapReduce计数器是什么?
计数器是用来纪录job任务的执行进度和状态。它的作用可以理解为日志,我们可以再进程中插入计数器,来纪录数据的变化情况。
Demo:实现自己的一个计数器,统计输入的无效数据。
需求:编写代码统计文档大于3个字段和小于3个字段的字段个数
数据如下
代码如下:
package demo;
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;
// !注意 ! MapReduce计数器只需要Map,不需要写reduce。
public class Counters {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(Counters.class);
job.setMapperClass(MMapper.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
public static class MMapper extends Mapper<LongWritable, Text, Text, Text>{
// 定义一个对象
public static Counter ct =null;
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
//转换数据类型并切割
String[] line = value.toString().split("\t");
//进行if判断
if (line.length>3) {
//组名 ,组员
ct=context.getCounter("group","long");
//计数器加1
ct.increment(1);
} else if (line.length<3) {
ct=context.getCounter("group","short");
ct.increment(1);
}
}
}
}
本次教程就到次结束了,有什么不懂的多问问博主。多多支持!!!