맵리 듀스 직렬화

1. 수요

각 통계 총 업스트림 트래픽, 다운 스트림 트래픽 소모 전화 번호, 전체 흐름

(1) 입력 데이터

 

(2) 상기 입력 데이터 포맷 :

 

7 13,560,436,666 120.196.100.99 1,116 954 200

아이디 전화 번호 네트워크 의 IP 업스트림 트래픽 다운 스트림 트래픽의 네트워크 상태 코드

 

(3) 원하는 출력 데이터 포맷

 

1356 0436666 1116 954 2070

전화 번호는 상류 흐름 하류의 흐름 전체의 흐름을

  2 . 맵리 듀스에서 프로그램 

com.atguigu.mapreduce.flowsum 패키지, 

가져 java.io.DataInput의, 

가져 오기 java.io.DataOutput, 

가져 오기 때 java.io.IOException; 

가져 오기 org.apache.hadoop.io.Writable; 


// 쓰기가 인터페이스를 구현 한. 

공용 클래스 FlowBean {쓰기 가능 구현 


개인 롱 상향, 

개인 긴 하류, 

개인 긴 sumFlow는, 

빈 생성자 매개 변수를 호출 할 필요를 반영 직렬화 // 2, 중,이 있어야 

공공 FlowBean () { 

; 슈퍼 () 

} 


, 공공 FlowBean (상향식 긴 ) {롱 하향 

슈퍼 (); 

this.upFlow = 상향 단계; 

this.downFlow = 하향 단계; 

this.sumFlow 하향 류가 = 상향 +] 

} 

. // 기록 시퀀스 방법 3 

@Override 

의 DataOutput의 공공 무효 쓰기 (OUT)는 IOException가 {슬로우

out.writeLong (상향) 

out.writeLong (하향) 

out.writeLong (sumFlow) 

} 

. // 직렬화 방법 4 

// 5 직렬화 방법해야 할 순차 기록 순서와 동일한 방법이어야 읽고 쓰기 시퀀스 

! 오버라이드 

(프리미티브 용 DataInput의) 공용 readFields의 공간은 {IOException이 발생 

this.upFlow in.readLong = (); 

this.downFlow는 in.readLong = (); 

this.sumFlow는 in.readLong = () 

} 


. // 기록 toString 메소드 6 용이하도록 이후 인쇄 텍스트 

@Override 

공공 문자열 toString는 () { 

상향 + "\ T"+ 하류 + "\ T"+ sumFlow 반환; 

} 


공공 긴 getUpFlow을 () { 

; 상향를 반환 

} 


공공 무효 setUpFlow (긴 상향식) { 

은이를. = 상향식 상향식; 

} 


공공 긴 getDownFlow () {

하류를 반환; 

} 


공개 무효 setDownFlow (긴 하향) { 

this.downFlow = 하향; 

} 


공공 긴 getSumFlow () { 

sumFlow를 반환; 

} 


공개 무효 setSumFlow (긴 sumFlow) { 

this.sumFlow = sumFlow; 

} 

}

  (2) 매퍼 클래스를 작성

com.atguigu.mapreduce.flowsum 패키지, 

가져 오기 때 java.io.IOException; 

가져 오기 org.apache.hadoop.io.LongWritable, 

가져 오기 org.apache.hadoop.io.Text, 

가져 오기 org.apache.hadoop.mapreduce.Mapper; 


공개 (가) 클래스 <LongWritable, 텍스트, 텍스트, FlowBean>을 확장 FlowCountMapper 매퍼 { 

FlowBean 새로운 새로운 FlowBean V = (); 

텍스트 새로운 새로운 K는 텍스트를 () =; 

@Override는 

(LongWritable 키, 텍스트 값, 컨텍스트 컨텍스트) IOException이, 예외 : InterruptedException을 {void 오류지도를 보호 

// 라인 위젯 

) (문자열 = value.toString 라인 

// 2 다이 싱 영역 

( "\의 T") 문자열 [] = line.split 필드 

// 객체를 캡슐화 3. 

전화 번호 삭제 // 

[1 문자열 phoneNum = 필드 ]; 


// 업스트림 및 다운 스트림 트래픽 촬영

긴 상향 = Long.parseLong (필드 [fields.length - 3]); 

긴 하향 = Long.parseLong (필드 [fields.length - 2]); 


k.set (phoneNum); 

v.set (하향, 상향 류); 

// 4写出

context.write (K, V); 

} 

}

   (3) 감속기 클래스를 작성

com.atguigu.mapreduce.flowsum 패키지, 

가져 오기 때 java.io.IOException; 

가져 오기 org.apache.hadoop.io.Text, 

가져 오기 org.apache.hadoop.mapreduce.Reducer; 


공용 클래스 (가) 감속기 <텍스트를 확장 FlowCountReducer, FlowBean, 텍스트, FlowBean는> { 


@Override는 

무효 보호 감소 (텍스트 키는의 Iterable <FlowBean> 값, 컨텍스트 컨텍스트) IOException이, 예외 : InterruptedException {던졌습니다 


긴 sum_upFlow = 0; 

긴 sum_downFlow = 0; 


. // 빈을 통과하는 데 사용 하나, 이는 업스트림 트래픽, 다운 링크에서 유속이 축적되었다 

(flowBean flowBean : 값)에 대해 { 

sum_upFlow flowBean.getUpFlow + = (); 

sum_downFlow flowBean.getDownFlow + = () 

} 


// 객체 2 캡슐화 

flowBean resultBean = 새로운 새 flowBean (sum_upFlow, sum_downFlow) 

. // 쓰기 3 밖으로

context.write (키 resultBean); 

} 

}

   (4) 드라이버 클래스 드라이버를 쓰기

com.atguigu.mapreduce.flowsum 패키지, 

가져 오기 때 java.io.IOException; 

가져 오기 org.apache.hadoop.conf.Configuration, 

가져 오기 org.apache.hadoop.fs.Path, 

가져 오기 org.apache.hadoop.io.Text; 

가져 오기 org.apache.hadoop.mapreduce.Job, 

가져 오기 org.apache.hadoop.mapreduce.lib.input.FileInputFormat, 

가져 오기 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 


공용 클래스 FlowsumDriver { 


공공 정적 무효 메인 (문자열 []에 args)는 IllegalArgumentException가 IOException을, ClassNotFoundException가이 예외 : InterruptedException가 {발생 

// 컴퓨터의 입출력 경로는 실제의 입출력 경로를 설정하는 

"인수 = 새로운 String [] { / 입 / inputflow E", "E / 출력 1 "} 


// 1 구성 정보 또는 작업 오브젝트 인스턴스에 대한 

구성 설정 = 새 구성 ();

작업 작업 = Job.getInstance (구성), 


로컬 경로를 지정 항아리 // 6 곳 프로그램 패키지 

job.setJarByClass (FlowsumDriver.class) 


본 서비스 / 감속기 트래픽 클래스를 사용하도록 지정 // 2 매퍼 작업 

job.setMapperClass을 (FlowCountMapper.class) 

job.setReducerClass (FlowCountReducer.class는) 


kV로는 // 3 출력 데이터 매퍼의 유형을 지정 

; job.setMapOutputKeyClass (Text.class) 

job.setMapOutputValueClass (FlowBean.class) 


. // 지정된 최종 출력을 4 데이터의 유형 KV 

; job.setOutputKeyClass (Text.class) 

job.setOutputValueClass (FlowBean.class) 

. // 지정된 작업 일본어 입력 파일 디렉토리 5 

FileInputFormat.setInputPaths (일 경로 새로운 새 (인수 [0])); 

FileOutputFormat .setOutputPath (일 경로 새로운 새 (인수) [1.]) 


작업을 실행할 실에 제출 // 단지 7 일 패킷 관련 파라미터 설정, 및 사용 자바 클래스.

부울 결과 = job.waitForCompletion (TRUE); 

System.exit와은 (결과 0 : 1); 

} 

}

 

추천

출처www.cnblogs.com/837634902why/p/11455590.html