MapReduce數據分析(3)計數器

三、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);
			}
		}
	}
}

本次教程就到次結束了,有什麼不懂的多問問博主。多多支持!!!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章