流量汇总案例编程,

本文介绍了一种使用MapReduce框架进行网络流量统计的方法。通过自定义Mapper和Reducer类,从原始日志中提取手机号和上下行流量数据,然后在Reducer阶段汇总同一手机号的所有流量记录,最终输出每个手机号的总上行流量和下行流量。此过程涉及数据清洗、切片、对象封装和序列化等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class FlowCountMapper extends Mapper<LongWritable,Text,Text,FlowBean>{
    public void map(LongWritable key, Text value, Context context)
            throws IOException,InterruptedException{
        //1、获取数据
        String line = value.toString();

        //2、切片
        String[] fields = line.split("\t");

        //3、封装对象,拿到关键字,数据清洗
        String phoneN = fields[1];
        long upFlow = long.parseLong(fields[fields.length-3]);
        long dfFlow = long.parseLong(fields[fields.length-2]);

        //4、输出到reduce端
        context.write(new Text(phoneN), new FlowBean(upFlow,dfFlow));
        }
}

public class FlowCountReducer extends Reducer<Text, FlowBean, Text, FlowBean>{
    pubic void reducer<Text key, Iterable<FlowBean> value, Context context>
            throws Exception{
        //1、相同手机号的流量使用两次汇总
        long upFlow_sum = 0;
        long dfFlow_sum = 0;

        //2、累加
        for(FlowBean f : value){
            upFlow_sum = f.getUpFlow();
            dfFlow_sum = f.getDfFlow();

        }

        FlowBean rs = new FlowBean(upFlow_sum, dfFlow_sum);

        //3、输出
        context.write(key,rs);
    }
}

public class FlowCountDriver{
    public static void main(String[] args){
        //1)获取job信息
        Configuration conf = new Configuration();
        Job job = Job.getInstance();

        //2)获取jar包
        job.setJarByClass(FlowCountDriver.class);

        //3)获取自定义的mapper和reducer类
        job.setMapperClass(FlowCountMapper.class);
        job.setReducerClass(FlowCountReducer.class);

        //4)设置map输出的数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(FlowBean.class);

        //5)设置reduce输出的数据类型
        job.setOutputkeyClass(Text.class);
        job.setOutputValueClass(FlowBean.class);

        //6)设置输入存在的路径与处理后的结果路径
        FileInputFormat.setInputPaths(job,new Path("/wc/in"));
        FileOutputFormat.setOutputPaths(job,new Path("/wc/out"));

        //7)提交任务
        boolean rs = job.waitForCompletion(true);
        System.out.println(rs?0:1);
    }
}

public class FlowBean implements Writable{

    private long upFlow;
    private long dfFlow;
    private long flowsum;

    pulibc FlowBean(){

    }
    public FlowBean(long upFlow, long dfFlow){
        this.upFlow = upFlow;
        this.dfFlow = dfFlow;
        this.flowsum = upFlow+dfFlow;
    }

    setter
    getter

    @Override
    public void readFields(DataInput in) throws Exception{
        //反序列化
        upFlow = in.readLong();
        dfFlow = in.readLong();
        flowsum = in.readLong();
    }
    @Override
    public void write(DataOutput out) throws Exception{
        //序列化
        out.writeLong(upFlow);
        out.writeLong(dfFlow);
        out.writeLong(flowsum);
    }

    @Override
    public String toString(){
        return upFlow+"\t"+dfFlow+"\t"+flowsum;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值