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,因為不需要輸出,程式碼如下,先看程式碼
[java] view plaincopyprint?
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
public static Counter ct = null;
protected void map(LongWritable key, Text value,
org.apache.hadoop.mapreduce.Mapper
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
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、結果如下(紅色部分):
[java] view plaincopyprint?
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權威指南中寫了統計百分比值,程式碼改改就能實現,就是一個總數除以錯誤數然後百分比的結果。
原文:http://blog.csdn.net/dajuezhao/article/details/5788705
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1251479/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring自定義引數解析器設計Spring
- hadoop mapreducez自定義分割槽Hadoop
- hadoop自定義許可權Hadoop
- Hadoop自定義輸出排序方式Hadoop排序
- hadoop 自定義格式化輸出Hadoop
- Springboot中自定義監聽器Spring Boot
- mysql中自定義變數有哪些MySql變數
- 瀏覽器中捲軸自定義瀏覽器
- android自定義view(自定義數字鍵盤)AndroidView
- hadoop 自定義GroupComparator實現求最大值Hadoop
- django2中自定義過濾器Django過濾器
- 自定義計數器小技巧!CSS 實現長按點贊累加動畫CSS動畫
- qt設計器中使用自定義控制元件QT控制元件
- Nginx 如何自定義變數?Nginx變數
- JAVA中的Comparable介面和自定義比較器Java
- Kibana的Dev Tools中建立自定義分詞器dev分詞
- Vue中自定義指令Vue
- Javascript中自定義事件JavaScript事件
- 通過計算機語言自定義保留小數計算機
- 微信小程式之自定義倒數計時元件微信小程式元件
- 自定義ViewPager指示器Viewpager
- HandlerInterceptor - 自定義攔截器
- 自定義springboot啟動器Spring Boot
- 自定義值轉換器
- Kafka - 自定義分割槽器Kafka
- Netty中自定義事件處理程式和監聽器Netty事件
- [淺析] vue3.0中的自定義渲染器Vue
- Android自定義數字鍵盤Android
- CSS 自定義屬性(變數)CSS變數
- Hive中自定義函式Hive函式
- Swift中自定義運算子Swift
- OC:自定義日期選擇器
- 自定義視訊播放器播放器
- 改造 Kubernetes 自定義排程器
- Django自定義模型管理器Django模型
- 自定義時間選擇器
- 自定義一個事件聚合器事件
- Qt編寫自定義控制元件屬性設計器QT控制元件
- spark:自定義分割槽,自定義排序,spark與jdbc,廣播變數等Spark排序JDBC變數