mapreduce对日志数据上下行流量汇总

原创 2017年07月17日 18:39:45

Mapreduce中的排序初步
4.1.1 需求
对日志数据中的上下行流量信息汇总,并输出按照总流量倒序排序的结果
数据如下:
1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 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

4.1.2 分析
基本思路:实现自定义的bean来封装流量信息,并将bean作为map输出的key来传输

MR程序在处理数据的过程中会对数据排序(map输出的kv对传输到reduce之前,会排序),排序的依据是map输出的key
所以,我们如果要实现自己需要的排序规则,则可以考虑将排序因素放到key中,让key实现接口:WritableComparable然后重写key的compareTo方法

4.1.3 实现
1、 自定义的bean
public class FlowBean implements WritableComparable{

long upflow;
long downflow;
long sumflow;

//如果空参构造函数被覆盖,一定要显示定义一下,否则在反序列时会抛异常
public FlowBean(){}

public FlowBean(long upflow, long downflow) {
    super();
    this.upflow = upflow;
    this.downflow = downflow;
    this.sumflow = upflow + downflow;
}

public long getSumflow() {
    return sumflow;
}

public void setSumflow(long sumflow) {
    this.sumflow = sumflow;
}

public long getUpflow() {
    return upflow;
}
public void setUpflow(long upflow) {
    this.upflow = upflow;
}
public long getDownflow() {
    return downflow;
}
public void setDownflow(long downflow) {
    this.downflow = downflow;
}

//序列化,将对象的字段信息写入输出流
@Override
public void write(DataOutput out) throws IOException {

    out.writeLong(upflow);
    out.writeLong(downflow);
    out.writeLong(sumflow);

}

//反序列化,从输入流中读取各个字段信息
@Override
public void readFields(DataInput in) throws IOException {
    upflow = in.readLong();
    downflow = in.readLong();
    sumflow = in.readLong();

}


@Override
public String toString() {
    return upflow + "\t" + downflow + "\t" + sumflow;
}
@Override
public int compareTo(FlowBean o) {
    //自定义倒序比较规则
    return sumflow > o.getSumflow() ? -1:1;
}

}

2、 mapper 和 reducer
public class FlowCount {

static class FlowCountMapper extends Mapper<LongWritable, Text, FlowBean,Text > {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        String line = value.toString();
        String[] fields = line.split("\t");
        try {
            String phonenbr = fields[0];

            long upflow = Long.parseLong(fields[1]);
            long dflow = Long.parseLong(fields[2]);

            FlowBean flowBean = new FlowBean(upflow, dflow);

            context.write(flowBean,new Text(phonenbr));
        } catch (Exception e) {

            e.printStackTrace();
        }

    }

}

static class FlowCountReducer extends Reducer<FlowBean,Text,Text, FlowBean> {

    @Override
    protected void reduce(FlowBean bean, Iterable<Text> phonenbr, Context context) throws IOException, InterruptedException {

        Text phoneNbr = phonenbr.iterator().next();

        context.write(phoneNbr, bean);

    }

}

public static void main(String[] args) throws Exception {

    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf);

    job.setJarByClass(FlowCount.class);

    job.setMapperClass(FlowCountMapper.class);
    job.setReducerClass(FlowCountReducer.class);

     job.setMapOutputKeyClass(FlowBean.class);
     job.setMapOutputValueClass(Text.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(FlowBean.class);

    // job.setInputFormatClass(TextInputFormat.class);

    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.waitForCompletion(true);

}

}

对日志数据中的上下行流量信息汇总---分区统计

需求: 对日志数据中的上下行流量信息汇总---分区统计 根据归属地输出流量统计数据结果到不同文件,以便于在查询统计结果时可以定位到省级范围进行 分析: Mapreduce中会将map输出的...
  • tian_qing_lei
  • tian_qing_lei
  • 2017-07-11 00:11:57
  • 328

MapReduce实现手机上网流量统计

FlowCount.javapackage cn.itheima.bigdata.hadoop.mr.flowcount;import java.io.IOException;import org.a...
  • cds86333774
  • cds86333774
  • 2016-04-11 01:22:35
  • 495

mapreduce实现流量汇总排序程序

在流量汇总程序开发中已经写好了流量汇总程序(建议先看这篇),利用生成好的汇总过的文件接着来进行按照总流量由高到低排序。因为maptask的最终生成文件中的数据是已经排序过的,默认就是按照key 归并排...
  • qq_37334135
  • qq_37334135
  • 2017-10-12 21:11:43
  • 186

MapReduce编程--1.统计用户上网流量DataCount

数据原型: 行数据原型释义: 1363157993044(访问日期) 18211575961(手机号) 94-71-AC-CD-E6-18:CMCC-EASY (mac地址) 120.1...
  • u014726937
  • u014726937
  • 2016-04-05 16:41:30
  • 1325

Mapreduce实例---流量汇总并按流量大小倒序排序

一:问题介绍 给一个数据文件,文件包含手机用户的各种上网信息,求每个手机用户的总上行流量,总下行流量和总流量;并且结果按总流量倒序排序。 第一步:Mapreduce实例---流量汇总(flowco...
  • litianxiang_kaola
  • litianxiang_kaola
  • 2017-05-06 16:08:18
  • 387

Hadoop2.4.1 简单的用户手机流量统计的MapReduce程序(二)

接着Hadoop2.4.1 简单的用户手机流量统计的MapReduce程序(一),现在我们 又有了新的需求,我们需要根据用户的总流量升序排列。 1.环境:Centos 6.5  32位, 在linux...
  • pfnie
  • pfnie
  • 2016-07-03 09:29:49
  • 976

Android测量指定应用程序的上下行流量

参考:http://xlover.iteye.com/blog/1358301  Android2.3之后把数据流量监控封装到了Android.net.TrafficStats类中,原理是读取系...
  • u010037124
  • u010037124
  • 2014-08-10 11:48:24
  • 1241

使用MapReduce计算框架统计CDN日志IP数、流量等数据

写在前面前面两篇文章中,我们使用Spark RDD及Spark Streaming 从CDN日志中计算出了独立IP数、每个视频独立IP数、每时CDN流量,这里我们将使用MapReduce计算框架,从同...
  • whzhaochao
  • whzhaochao
  • 2017-05-26 15:31:05
  • 626

对日志数据中的上下行流量信息汇总

需求:对日志数据中的上下行流量信息汇总 例如数据如下: 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82   ...
  • tian_qing_lei
  • tian_qing_lei
  • 2017-07-10 23:51:17
  • 109

用MapReduce处理一组流量数据,并按总流量排序

用MapReduce处理一组流量数据、并排序
  • jiang0426
  • jiang0426
  • 2016-05-13 14:40:02
  • 957
收藏助手
不良信息举报
您举报文章:mapreduce对日志数据上下行流量汇总
举报原因:
原因补充:

(最多只允许输入30个字)