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); } }