1. 程式人生 > >MapReduce序列化及分割槽的java程式碼示例

MapReduce序列化及分割槽的java程式碼示例

需求

統計每一個使用者(手機號)所耗費的總上行流量、下行流量,總流量,將統計結果按照總流量倒序排序
 

hadoop jar wordcount.jar cn.itcast.bigdata.mr.flowsum.FlowCount /wordcount/input /wordcount/output8


public class FlowCount {
    
    static class FlowCountMapper extends Mapper<LongWritable, Text, FlowBean, Text>{
        //FlowBean k = new FlowBean();
         
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
     
                
            //將一行內容轉成string
            String line = value.toString();
            //切分欄位
            String[] fields = line.split("\t");
            //取出手機號
            String phoneNbr = fields[1];
            //取出上行流量下行流量
            long upFlow = Long.parseLong(fields[fields.length-3]);
            long dFlow = Long.parseLong(fields[fields.length-2]);
             

            context.write(new FlowBean(upFlow,dFlow), new Text(phoneNbr));
            
        }
        
        
        
    }
    
    
    static class FlowCountReducer extends Reducer<FlowBean, Text, Text, FlowBean>{
        
        @Override
        protected void reduce(FlowBean key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
             
            
            Text phoNum = values.iterator().next();//iterator中只有一個值
            context.write(phoNum,key);
            
            
        }
        
    }
    
    
    
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        /*conf.set("mapreduce.framework.name", "yarn");
        conf.set("yarn.resoucemanager.hostname", "mini1");*/
        Job job = Job.getInstance(conf);
        
        /*job.setJar("/home/hadoop/wc.jar");*/
        //指定本程式的jar包所在的本地路徑
        job.setJarByClass(FlowCount.class);
        
        //指定本業務job要使用的mapper/Reducer業務類
        job.setMapperClass(FlowCountMapper.class);
        job.setReducerClass(FlowCountReducer.class);
        
        //指定mapper輸出資料的kv型別
        job.setMapOutputKeyClass(FlowBean.class);
        job.setMapOutputValueClass(Text.class);
        
        //指定最終輸出的資料的kv型別
        job.setOutputKeyClass(FlowBean.class);
        job.setOutputValueClass(Text.class);
        
        //指定job的輸入原始檔案所在目錄
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        //指定job的輸出結果所在目錄
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        
        //將job中配置的相關引數,以及job所用的java類所在的jar包,提交給yarn去執行
        /*job.submit();*/
        boolean res = job.waitForCompletion(true);
        System.exit(res?0:1);
        
    }
 }


public class FlowBean implements WritableComparable<FlowBean>{
    
    private long upFlow;
    private long dFlow;
    private long sumFlow;
    
    //反序列化時,需要反射呼叫空參建構函式,所以要顯示定義一個
    public FlowBean(){}
    
    public FlowBean(long upFlow, long dFlow) {
        this.upFlow = upFlow;
        this.dFlow = dFlow;
        this.sumFlow = upFlow + dFlow;
    }
    
    
    public long getUpFlow() {
        return upFlow;
    }
    public void setUpFlow(long upFlow) {
        this.upFlow = upFlow;
    }
    public long getdFlow() {
        return dFlow;
    }
    public void setdFlow(long dFlow) {
        this.dFlow = dFlow;
    }


    public long getSumFlow() {
        return sumFlow;
    }


    public void setSumFlow(long sumFlow) {
        this.sumFlow = sumFlow;
    }


    /**
     * 序列化方法
     */
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeLong(upFlow);
        out.writeLong(dFlow);
        out.writeLong(sumFlow);
        
    }


    /**
     * 反序列化方法
     * 注意:反序列化的順序跟序列化的順序完全一致
     */
    @Override
    public void readFields(DataInput in) throws IOException {
         upFlow = in.readLong();
         dFlow = in.readLong();
         sumFlow = in.readLong();
    }
    
    @Override
    public String toString() {
         
        return upFlow + "\t" + dFlow + "\t" + sumFlow;
    }

    @Override
    public int compareTo(FlowBean o) {
        return this.getSumFlow() > o.getSumFlow() ? -1 : 1 ;//按照指定的總流量的倒序排序
        
    }

}

測試內容

1363157985066     13726230503    00-FD-07-A4-72-B8:CMCC    120.196.100.82    i02.c.aliimg.com        24    27    2481    24681    200
1363157995052     13826544101    5C-0E-8B-C7-F1-E0:CMCC    120.197.40.4            4    0    264    0    200
1363157991076     13926435656    20-10-7A-28-CC-0A:CMCC    120.196.100.99            2    4    132    1512    200
1363154400022     13926251106    5C-0E-8B-8B-B1-50:CMCC    120.197.40.4            4    0    240    0    200
1363157993044     18211575961    94-71-AC-CD-E6-18:CMCC-EASY    120.196.100.99    iface.qiyi.com    視訊網站    15    12    1527    2106    200
1363157995074     84138413    5C-0E-8B-8C-E8-20:7DaysInn    120.197.40.4    122.72.52.12        20    16    4116    1432    200
1363157993055     13560439658    C4-17-FE-BA-DE-D9:CMCC    120.196.100.99            18    15    1116    954    200
1363157995033     15920133257    5C-0E-8B-C7-BA-20:CMCC    120.197.40.4    sug.so.360.cn    資訊保安    20    20    3156    2936    200
1363157983019     13719199419    68-A1-B7-03-07-B1:CMCC-EASY    120.196.100.82            4    0    240    0    200
1363157984041     13660577991    5C-0E-8B-92-5C-20:CMCC-EASY    120.197.40.4    s19.cnzz.com    站點統計    24    9    6960    690    200
1363157973098     15013685858    5C-0E-8B-C7-F7-90:CMCC    120.197.40.4    rank.ie.sogou.com    搜尋引擎    28    27    3659    3538    200
1363157986029     15989002119    E8-99-C4-4E-93-E0:CMCC-EASY    120.196.100.99    www.umeng.com    站點統計    3    3    1938    180    200
1363157992093     13560439658    C4-17-FE-BA-DE-D9:CMCC    120.196.100.99            15    9    918    4938    200
1363157986041     13480253104    5C-0E-8B-C7-FC-80:CMCC-EASY    120.197.40.4            3    3    180    180    200
1363157984040     13602846565    5C-0E-8B-8B-B6-00:CMCC    120.197.40.4    2052.flash2-http.qq.com    綜合門戶    15    12    1938    2910    200
1363157995093     13922314466    00-FD-07-A2-EC-BA:CMCC    120.196.100.82    img.qfc.cn        12    12    3008    3720    200
1363157982040     13502468823    5C-0A-5B-6A-0B-D4:CMCC-EASY    120.196.100.99    y0.ifengimg.com    綜合門戶    57    102    7335    110349    200
1363157986072     18320173382    84-25-DB-4F-10-1A:CMCC-EASY    120.196.100.99    input.shouji.sogou.com    搜尋引擎    21    18    9531    2412    200
1363157990043     13925057413    00-1F-64-E1-E6-9A:CMCC    120.196.100.55    t3.baidu.com    搜尋引擎    69    63    11058    48243    200