MapReduce-计数器
生活随笔
收集整理的這篇文章主要介紹了
MapReduce-计数器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MapReduce 中的計數器
計數器是收集作業統計信息的有效手段之一,用于質量控制或應用級統計。計數器還可輔助診斷系統故障。如果需要將日志信息傳輸到 map 或 reduce 任務, 更好的方法通常是看能否用一個計數器值來記錄某一特定事件的發生。對于大型分布式作業而言,使用計數器更為方便。除了因為獲取計數器值比輸出日志更方便,還有根據計數器值統計特定事件的發生次數要比分析一堆日志文件容易得多。
hadoop內置計數器列表
| MapReduce任務 計數器 | org.apache.hadoop.mapreduce.TaskCounter |
| 文件系統計數器 | org.apache.hadoop.mapreduce.FileSystemCounter |
| FileInputFormat 計數器 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter |
| FileOutputFormat 計數器 | org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter |
| 作業計數器 | org.apache.hadoop.mapreduce.JobCounter |
所有的這些都是MapReduce的計數器的功能,既然MapReduce當中有計數器的功能,我們如何實現自己的計數器???
需求:以上面排序以及序列化為案例,統計map接收到的數據記錄條數
第一種方式
第一種方式定義計數器,通過context上下文對象可以獲取我們的計數器,進行記錄通過context上下文對象,在map端使用計數器進行統計
public class SortMapper extends Mapper<LongWritable,Text,PairWritable,IntWritable> {private PairWritable mapOutKey = new PairWritable();private IntWritable mapOutValue = new IntWritable();@Overridepublic void map(LongWritable key, Text value, Context context) throwsIOException, InterruptedException {//自定義我們的計數器,這里實現了統計map數據數據的條數Counter counter = context.getCounter("MR_COUNT","MapRecordCounter");counter.increment(1L);String lineValue = value.toString();String[] strs = lineValue.split("\t");//設置組合key和value ==> <(key,value),value>mapOutKey.set(strs[0], Integer.valueOf(strs[1]));mapOutValue.set(Integer.valueOf(strs[1]));context.write(mapOutKey, mapOutValue);}}運行程序之后就可以看到我們自定義的計數器在map階段讀取了七條數據
第二種方式
通過enum枚舉類型來定義計數器
統計reduce端數據的輸入的key有多少個,對應的value有多少個
public class SortReducer extendsReducer<PairWritable,IntWritable,Text,IntWritable> {private Text outPutKey = new Text();public static enum Counter{REDUCE_INPUT_RECORDS, REDUCE_INPUT_VAL_NUMS,}@Overridepublic void reduce(PairWritable key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException { context.getCounter(Counter.REDUCE_INPUT_RECORDS).increment(1L);//迭代輸出for(IntWritable value : values) {context.getCounter(Counter.REDUCE_INPUT_VAL_NUMS).increment(1L);outPutKey.set(key.getFirst());context.write(outPutKey, value); }}}?
總結
以上是生活随笔為你收集整理的MapReduce-计数器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce排序-实现比较器和序列
- 下一篇: MapReduce-Combiner规约