Hadoop 구현 사용자 지정 http://www.aliyun.com/zixun/aggregation/18278.html "> 데이터 입력 블로그 카테고리: Hadoop hadoopmrunit 사용자 지정 데이터 형식
사용자 지정 데이터 형식에 대 한 명확한 설명과 설명은 http://book.douban.com/annotation/17067489/에서 제공 됩니다.
예를 들어 WordCount를 받아
자신의 데이터 형식을 HTTP 클래스 정의
Java.io.datainput;import Java.io.dataoutput;import Java.io.ioexception;import 가져오기 Org.apache.hadoop.io.writablecomparable;public 클래스는 HTTP 구현 writablecomparable < http > {공용 http () {} 개인 문자열 값; 공용 Http (문자열 값) {SetValue (값);} 공용 문자열 GetValue () {반환 값;} 공공 무효 SetValue (문자열 가치 E) {this.value = 값;} 공공 무효 ReadFields (에 Datainput) IOException을 throw {값 = In.readutf ();} 공공 무효 W 라이트 (밖으로 DataOutput) throw IOException {Out.writeutf (값);} 공공 int CompareTo (http http) {반환 (Value.compareto (Http.value)); @Override 공공 int 해시 코드 () {최종 int 총리 = 결과 = 1, 결과 총리 = * 결과 + ((value == null)? 0: Value.hashcode ()); 반환 결과; @Override 공공 부울 같음 (obj 개체가) {경우 (! obj instanceof Http) return false; HTTP 다른 = (http) obj; 반환 This.value.equals (Other.value); @Override public String toString () {반환 값}}
글 WordCount 프로그램
Java.io.ioexception;import Java.util.stringtokenizer;import Org.apache.hadoop.conf.configuration;import 가져오기 Org.apache.hadoop.fs.path;import Org.apache.hadoop.io.intwritable;import org.apache.hadoop.io.LongWritable; 가져오기 Org.apache.hadoop.mapreduce.job;import Org.apache.hadoop.mapreduce.mapper;import Org.apache.hadoop.mapreduce.reducer;import Org.apache.hadoop.mapreduce.lib.input.fileinputformat;import Org.apache.hadoop.mapreduce.lib.output.fileoutputformat;import Org.apache.hadoop.util.GenericOptionsParser; 공용 클래스 wordcountentry {매퍼를 확장 하는 공용 정적 클래스 Tokenizermapper < longwritable, HTTP, http, intwritable & Gt; {한 전용 마지막 정적 intwritable 새로운 intwritable (1); = 개인 Http 단어 = 새로운 http (); public void 지도 (longwritable 키, Http 값, 컨텍스트 컨텍스트) throw IOException, interruptedexception {stringtokenizer ITR = 새로운 StringTokenizer (발 Ue.tostring ()); 동안 (Itr.hasmoretokens ()) {Word.setvalue (Itr.nexttoken ()); Context.write (단어, 1);} } 나IC 정적 클래스 Intsumreducer 확장 감속 < http, intwritable, Http, intwritable > {개인 intwritable 결과 = N 으 intwritable (); 공공 무효 감소 (Http 키, iterable < intwritable > 값, 컨텍스트 컨텍스트) IOException을 throw interruptedexception {int sum = 0; (intwritable 발: 값)에 대 한 {sum = Val.get ();} result.set (합); Context.write (ke Y, 결과); } 공공 정적 무효 메인 (문자열 args) throw IOException, Interruptedexception, classnotfoundexception {configuratio N 회의 = 새로운 구성 (); Otherargs 문자열 = 새로운 Genericoptionsparser (conf, args). Getremainingargs (); 경우 (otherargs.length!= 2) {System.err.println ("<에 >< 사용법: wordcount 아웃 >"); System.exit (2); 경로 입력 = 새로운 경로 (args[0]); 경로 출력 = 새로운 경로 (args[1]); 작업 작업 = 새로운 작업 (conf, 단어 수); Job.setjarbyclass (Wordcountentry.class); Job.setmapperclass (Tokenizermapper.class); Job.setcombinerclass (Intsumreducer.class); Job.setreducerclass (Intsumreducer.class); Job.setoutPutkeyclass (Http.class); Job.setoutputvalueclass (Intwritable.class); Fileinputformat.addinputpath (작업 입력); Fileoutputformat.setoutputpath (작업, 출력); System.exit (Job.waitforcompletion (true)? 0:1); }}
MapReduce 프로그램 테스트에 대 한 테스트 사례를 작성 Mrunit
Java.util.arraylist;import Java.util.list;import Org.apache.hadoop.io.intwritable;import 가져오기 Org.apache.hadoop.io.longwritable;import Org.apache.hadoop.mrunit.mapreduce.mapdriver;import Org.apache.hadoop.mrunit.mapreduce.reducedriver;import Org.junit.before;import Org.junit.Test;import Com.geo.dmp.wordcountentry.intsumreducer;import Com.geo.dmp.wordcountentry.tokenizermapper;public 클래스 wordcountentrytest {개인 mapdriver < longwritable, HTTP, http, intwritable > mapdriver; 개인 reducedriver < HTTP, intwritable, HTTP, intwritable > Reducedriver; @Before 공용 void Setupbeforeclass () 예외 {Tokenizermapper TM = 새로운 Tokenizermapper (); mapdriver = Mapdrive R.newmapdriver (tm); Intsumreducer ISR = 새로운 Intsumreducer (); Reducedriver = Reducedriver.newreducedriver (ISR); @Test 공용 void Tokenizermappertest () {mapdriver.withinput (새로운 longwritable () 새로운 Http ("01A55\TABLSD")); mapdriver . Withoutput (새로운 Http ("01a55"), 새로운 Intwritable (1)); Mapdriver.withoutput (새로운 HttP ("ABLSD"), 새로운 Intwritable (1)); Mapdriver.runtest (); @Test 공용 void Intsumreducertest () {< intwritable > 값 목록 새 arraylist < intwritable > = (); Values.add (새로운 Intwritable (1)); Values.add (새로운 intwritable (1)); Reducedriver.withinput (새로운 Http ("01a55"), 값); Reducedriver.withoutput (새로운 Http ("01a55"), 새로운 Intwritable (2)); Reducedriver.runtest (); }}