三、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);
}
}
}
}
本次教程就到次結束了,有什麼不懂的多問問博主。多多支持!!!