com.bigdog.hadoop.mapreduce.partition.KpiApp.java Source code

Java tutorial

Introduction

Here is the source code for com.bigdog.hadoop.mapreduce.partition.KpiApp.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bigdog.hadoop.mapreduce.partition;

import com.bigdog.hadoop.Constants;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import 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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;

/**
 *
 * @author jw362j
 */
/**
 * ??jar?    1.?? 2.reduce???job?
 */
public class KpiApp {

    static final String INPUT_PATH = Constants.input;
    static final String OUT_PATH = Constants.output;

    static {
        Configuration.addDefaultResource("hdfs-site.xml");
        Configuration.addDefaultResource("core-site.xml");
        Configuration.addDefaultResource("mapred-site.xml");
    }

    public void kpi() throws Exception {
        final Job job = new Job(new Configuration(), KpiApp.class.getSimpleName());

        job.setJarByClass(KpiApp.class);

        //1.1 
        FileInputFormat.setInputPaths(job, INPUT_PATH);
        //??
        job.setInputFormatClass(TextInputFormat.class);

        //1.2Mapper
        job.setMapperClass(MyMapper.class);
        //<k2,v2>
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(KpiWritable.class);

        //1.3 
        job.setPartitionerClass(KpiPartitioner.class);
        job.setNumReduceTasks(2);

        //1.4 TODO ??
        //1.5  TODO ??
        //2.2 reduce
        job.setReducerClass(MyReducer.class);
        //<k3,v3>
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(KpiWritable.class);

        //2.3 
        FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
        //?
        job.setOutputFormatClass(TextOutputFormat.class);

        //???JobTracker
        job.waitForCompletion(true);
    }

    static class MyMapper extends Mapper<LongWritable, Text, Text, KpiWritable> {

        protected void map(LongWritable key, Text value,
                org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, KpiWritable>.Context context)
                throws IOException, InterruptedException {
            final String[] splited = value.toString().split("\t");
            final String msisdn = splited[1];
            final Text k2 = new Text(msisdn);
            final KpiWritable v2 = new KpiWritable(splited[6], splited[7], splited[8], splited[9]);
            context.write(k2, v2);
        };

    }

    static class MyReducer extends Reducer<Text, KpiWritable, Text, KpiWritable> {

        /**
         * @param   k2   ????
         * @param   v2s   ??????
         */
        protected void reduce(Text k2, java.lang.Iterable<KpiWritable> v2s,
                org.apache.hadoop.mapreduce.Reducer<Text, KpiWritable, Text, KpiWritable>.Context context)
                throws IOException, InterruptedException {
            long upPackNum = 0L;
            long downPackNum = 0L;
            long upPayLoad = 0L;
            long downPayLoad = 0L;

            for (KpiWritable kpiWritable : v2s) {
                upPackNum += kpiWritable.upPackNum;
                downPackNum += kpiWritable.downPackNum;
                upPayLoad += kpiWritable.upPayLoad;
                downPayLoad += kpiWritable.downPayLoad;
            }

            final KpiWritable v3 = new KpiWritable(upPackNum + "", downPackNum + "", upPayLoad + "",
                    downPayLoad + "");
            context.write(k2, v3);
        };

    }

    static class KpiPartitioner extends HashPartitioner<Text, KpiWritable> {

        @Override
        public int getPartition(Text key, KpiWritable value, int numReduceTasks) {
            return (key.toString().length() == 11) ? 0 : 1;
        }
    }
}

class KpiWritable implements Writable {

    long upPackNum;
    long downPackNum;
    long upPayLoad;
    long downPayLoad;

    public KpiWritable() {
    }

    public KpiWritable(String upPackNum, String downPackNum, String upPayLoad, String downPayLoad) {
        this.upPackNum = Long.parseLong(upPackNum);
        this.downPackNum = Long.parseLong(downPackNum);
        this.upPayLoad = Long.parseLong(upPayLoad);
        this.downPayLoad = Long.parseLong(downPayLoad);
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        this.upPackNum = in.readLong();
        this.downPackNum = in.readLong();
        this.upPayLoad = in.readLong();
        this.downPayLoad = in.readLong();
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeLong(upPackNum);
        out.writeLong(downPackNum);
        out.writeLong(upPayLoad);
        out.writeLong(downPayLoad);
    }

    @Override
    public String toString() {
        return upPackNum + "\t" + downPackNum + "\t" + upPayLoad + "\t" + downPayLoad;
    }

}