프로젝트의 요구에 따라, 그것은 자바 프로그램을 통해 원사 MapReduce 컴퓨팅 작업을 제출 하는 데 필요한입니다. MapReduce jar 패키지 통해 제출의 일반적인 작업, 달리 작은 변화 프로그램을 다음 코드에 설명으로 통해 mapreduce 작업 제출 필요 합니다.
다음은 MapReduce 주요 프로그램, 언급 하는 몇 가지 포인트:
1, 프로그램에서 나 파일을 것입니다 파일을 세분화를 하지 즉, Wholefileinputformat로 설정 하는 형식으로 읽기.
2. 감소의 처리를 제어 하기 위해 지도 출력 키 조합 키로 지정 됩니다. 키와 달리 기존의 <, 값 >,이 되는 < textpair, 값 >, < k e y 1, k e y 2 >에 대 한 textpair 형식.
3, 키, 조합에 적응 시키기 위하여 그룹화 기능, 즉 groupcomparator를 다시 설정 합니다. 그룹화 규칙은 Textpair에서 k e y 1은 같은 (아니 k e y 2가 필요) 데이터 감소 컨테이너에 할당입니다. 따라서, 같은 k e y 1 데이터 감소 컨테이너를 입력 하면, k e y 2 데이터 식별에 역할을 하고있다.
패키지 웹입니다. 둡;
가져오기 java.io.IOException;
가져오기 org.apache.hadoop.conf.Configuration;
가져오기 Org.apache.hadoop.fs.Path;
가져오기 org.apache.hadoop.io.BytesWritable;
가져오기 org.apache.hadoop.io.WritableComparable;
가져오기 Org.apache.hadoop.io.WritableComparator;
가져오기 org.apache.hadoop.mapred.JobClient;
가져오기 org.apache.hadoop.mapred.JobConf;
가져오기 Org.apache.hadoop.mapred.JobStatus;
가져오기 Org.apache.hadoop.mapreduce.Job;
가져오기 Org.apache.hadoop.mapreduce.Partitioner;
가져오기 Org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
가져오기 Org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
가져오기 Org.apache.hadoop.mapreduce.lib.output.NullOutputFormat;
가져오기 유틸리티 유틸리티;
공용 클래스 Gemimain 없음
공용 Gemimain () 없음
일 = null;
}
공공 직업 일;
Namepartitioner 확장 하는 공용 정적 클래스
파티션 프로그램 < textpair, byteswritable = "" > 없음;
@Override
공공 int getpartition (Textpair, byteswritable 값
int numpartitions) 없음
반환 Math.Abs (Key.getfirst (). 해시 코드 () * 127) %Numpartitions;
}
}
/**
* 그룹 설정 클래스, 두 Textpair의 첫 번째 열쇠는 같은 그들은 동일한 그룹에 속한다. 그들의 배치는 값 반복기
* 다음은 감속 기 입력 방법 감소.
*
* @author HDUser
*
*/
공용 정적 클래스 Groupcomparator Writablecomparator 없음 확장
공용 Groupcomparator () 없음
슈퍼 (Textpair.class, true);
}
@Override
공공 int (writablecomparable A, writablecomparable b) 비교 없음
Textpair T1 = (Textpair);
Textpair t2 = (Textpair) b;
비교는 1에 비해 0을 반환 합니다.
T1.getfirst () 반환. CompareTo (T2.getfirst ()); 첫 번째 필드는 동일한, 같은 그룹으로 나누어져
}
}
공공 부울 runjob (string args) IOException을 throw
ClassNotFoundException, Interruptedexception 없음
구성 conf = 새로운 구성 ();
Reduce 함수에 매개 변수 값을 얻으려면 conf에서 Outputath 변수를 설정
Conf.set ("OutputPath", args [args.length-1].tostring ());
HDFs, 각 작업 제품의 품질 파일 폴더를 생성 하는 위치를 설정 합니다. Args 배열의 음절 수는 품질 파일 있는 폴더
Conf.set ("Qualityfolder", args [args.length-2].tostring ());
서버에서 실행 하는 경우 웹 프로젝트의 루트 경로 가져오고 Java 응용 프로그램을 디버깅 하는 경우 the/opt/hadoop-2.5.0/etc/hadoop/directory에 구성 파일을 읽이 필요가
Mapreduceprogress mprogress = 새로운 mapreduceprogress ();
Rootpath를 문자열 = Mprogress.rootpath;
Rootpath를 문자열 = "/ opt/hadoop-2.5.0/etc/hadoop/";
Conf.addresource (새로운 경로 (rootpath + "원사-site.xml"));
Conf.addresource (새로운 경로 (rootpath + "핵심-site.xml"));
Conf.addresource (새로운 경로 (rootpath + "Hdfs site.xml"));
Conf.addresource (새로운 경로 (rootpath + "Mapred-site.xml"));
This.job = 새로운 작업 (conf);
Job.setjobname ("작업 이름:" + args[0]);
Job.setjarbyclass (Gemimain.class);
Job.setmapperclass (Gemimapper.class);
Job.setmapoutputkeyclass (Textpair.class);
Job.setmapoutputvalueclass (Byteswritable.class);
파티션 설정된
Job.setpartitionerclass (Namepartitioner.class);
분할 후 지정 된 조건을 기준으로 그룹화
Job.setgroupingcomparatorclass (Groupcomparator.class);
Job.setreducerclass (Gemireducer.class);
Job.setinputformatclass (Wholefileinputformat.class);
Job.setoutputformatclass (Nulloutputformat.class);
Job.setoutputkeyclass (Nullwritable.class);
Job.setoutputvalueclass (Text.class);
Job.setnumreducetasks (8);
입력된 데이터를 계산에 대 한 경로 설정
대 한 (int i = 1; 나 < args.length 2 i + +) 없음
Fileinputformat.addinputpath (작업, 새 경로 (args[i));
}
Args 배열의 마지막 요소는 출력 경로
Fileoutputformat.setoutputpath (작업, 새 경로 (args[args.length-1));
부울 플래그 = Job.waitforcompletion (true);
반환 깃발;
}
@SuppressWarnings ("정적 액세스")
공공 정적 무효 메인 (문자열 args) throw ClassNotFoundException,
IOException, Interruptedexception 없음
문자열 inputpaths = new string {"Normalizejob",
"Hdfs://192.168.168.101:9000/사용자/hduser/red1 /",
"hdfs://192.168.168.101:9000/사용자/hduser/nir1 /", "quality11111",
"Hdfs://192.168.168.101:9000/사용자/hduser/테스트"};
Gemimain 테스트 = 새로운 Gemimain ();
부울 결과 = Test.runjob (inputpaths);
}
}
다음은 Textpair 클래스
공용 클래스 Textpair 구현 Writablecomparable 없음
개인 텍스트 A;
사립 텍스트 두 번째;
공용 Textpair () 없음
설정 (새로운 텍스트 (), 새로운 텍스트 ());
}
공용 Textpair (문자열, 두 번째 문자열) 없음
설정 (새로운 텍스트, 새로운 텍스트 (2));
}
공용 Textpair (텍스트 A, 텍스트 2) 없음
(2) 설정;
}
공공 무효 세트 (텍스트 2) 없음
This.first = A;
This.second = 2;
}
공용 텍스트 GetFirst () 없음
반환
}
공용 텍스트 Getsecond () 없음
둘째; 반환
}
@Override
공용 void 쓰기 (밖으로 DataOutput) throw IOException 없음
First.write (밖으로);
Second.write (밖으로);
}
@Override
공공 무효 ReadFields (에 Datainput) throw IOException 없음
First.readfields (에);
Second.readfields (에);
}
@Override
공공 int 해시 코드 () 없음
First.hashcode () 반환 * 163 + second.hashcode ();
}
@Override
공공 부울 같음 (개체 o) 없음
경우 (o instanceof textpair) 없음
Textpair TP = (textpair) o;
First.equals (Tp.first) 반환 & & second.equals (Tp.second);
}
반환 허위;
}
@Override
공용 문자열 toString () 없음
반환 "\ T" + 초;
}
@Override
/**a.compareto (B)
* 비교 동일한 경우, 결과 0
* A B 보다 큰 경우, 비교는 1
* A가 B 보다 작은, 결과 1
*
*/
공공 int compareTo (Textpair tp) 없음
int cmp = First.compareto (Tp.first);
경우 (CMP! = 0) 없음
CMP; 반환
}
이 시간에 오름차순 배열 구현
반환 Second.compareto (Tp.second);
}
}
다음은 Wholefileinputformat, 제어 데이터 MapReduce 과정에서 분할 하지
패키지 web.hadoop;
가져오기 java.io.IOException;
가져오기 Org.apache.hadoop.fs.Path;
가져오기 org.apache.hadoop.io.BytesWritable;
가져오기 Org.apache.hadoop.io.Text;
가져오기 Org.apache.hadoop.mapreduce.InputSplit;
가져오기 Org.apache.hadoop.mapreduce.JobContext;
가져오기 Org.apache.hadoop.mapreduce.RecordReader;
가져오기 Org.apache.hadoop.mapreduce.TaskAttemptContext;
가져오기 Org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
공용 클래스 Wholefileinputformat 확장 Fileinputformat < 텍스트, byteswritable = "" > 없음;
@Override
공용 Recordreader < 텍스트, byteswritable = "" > Createrecordreader (
Inputsplit arg0, arg1 Taskattemptcontext) IOException을 throw
interruptedexception 없음
TODO 자동-메서드 스텁 생성
새로운 Wholefilerecordreader ();를 반환합니다
}
@Override
없음; 보호 부울 issplitable (Jobcontext 컨텍스트, 경로 이름)
TODO 자동-메서드 스텁 생성
반환 허위;
}
}
다음은 Wholefilerecordreader 클래스
패키지 web.hadoop;
가져오기 java.io.IOException;
가져오기 org.apache.hadoop.conf.Configuration;
가져오기 Org.apache.hadoop.fs.FSDataInputStream;
가져오기 Org.apache.hadoop.fs.FileSystem;
가져오기 Org.apache.hadoop.fs.Path;
가져오기 org.apache.hadoop.io.BytesWritable;
가져오기 Org.apache.hadoop.io.IOUtils;
가져오기 Org.apache.hadoop.io.Text;
가져오기 Org.apache.hadoop.mapreduce.InputSplit;
가져오기 Org.apache.hadoop.mapreduce.RecordReader;
가져오기 Org.apache.hadoop.mapreduce.TaskAttemptContext;
가져오기 Org.apache.hadoop.mapreduce.lib.input.FileSplit;
공용 클래스 Wholefilerecordreader 확장 Recordreader < 텍스트, byteswritable = "" > 없음;
개인 Filesplit Filesplit;
개인 Fsdatainputstream FIS;
개인 텍스트 키 = null;
개인 byteswritable 값 = null;
개인 부울 처리 = 거짓;
@Override
공용 void Close () throw IOException 없음
TODO 자동-메서드 스텁 생성
Fis.close ();
}
@Override
공용 텍스트 Getcurrentkey () throw IOException, Interruptedexception 없음
TODO 자동-메서드 스텁 생성
this.key; 반환
}
@Override
공용 byteswritable GetCurrentValue () IOException을 throw
interruptedexception 없음
TODO 자동-메서드 스텁 생성
this.value; 반환
}
@Override
공공 무효 초기화 (Inputsplit inputsplit, Taskattemptcontext tacontext)
던짐 IOException, Interruptedexception 없음
Filesplit = (filesplit) inputsplit;
구성 작업 = Tacontext.getconfiguration ();
경로 파일 = Filesplit.getpath ();
파일 시스템 fs = File.getfilesystem (일);
FIS = fs.open (파일);
}
@Override
공공 부울 nextkeyvalue () 없음
경우 (키 = = null) 없음
키 = 새로운 텍스트 ();
}
경우 (값 = = null) 없음
값 = 새로운 byteswritable ();
}
만약 (! 처리) 없음
바이트 콘텐츠 = 새로운 byte[(int) filesplit.getlength ()];
경로 파일 = Filesplit.getpath ();
System.out.println (File.getname ());
Key.set (File.getname ());
시도 없음
ioutils.readfully (FIS, 콘텐츠, 0, content.length);
Value.set (콘텐츠, 0, content.length);
Value.set (콘텐츠) (새로운 byteswritable);
catch (e IOException) 없음
TODO 자동 생성 된 Catch 블록
E.printstacktrace ();
마지막으로 없음
Ioutils.closestream (FIS);
}
처리 = true;
반환 사실;
}
반환 허위;
}
@Override
공공 float getprogress () throw IOException, Interruptedexception 없음
TODO 자동-메서드 스텁 생성
반환 처리? Filesplit.getlength (): 0;
}
}