자바 프로그램을 통해 원사 MapReduce 컴퓨팅 작업을 제출 하는 방법

출처: 인터넷
작성자: 사용자
키워드: 자바 mapreduce

프로젝트의 요구에 따라, 그것은 자바 프로그램을 통해 원사 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;

}

}

관련 문서

연락처

이 페이지의 내용은 인터넷에서 가져온 것이므로 Alibaba Cloud의 공식 의견이 아닙니다.이 페이지에서 언급 된 제품 및 서비스는 Alibaba Cloud와는 관련이 없으므로이 페이지의 내용이 골칫거리 인 경우 저희에게 알려주십시오. 우리는 5 일 근무일 이내에 이메일을 처리 할 것입니다.

커뮤니티에서 표절 사례를 발견한 경우 info-contact@alibabacloud.com 으로 관련 증거를 첨부하여 이메일을 보내주시기 바랍니다. 당사 직원이 영업일 기준 5일 내에 연락 드리도록 하겠습니다.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.