上行下行流量统计

 package cn.itcast.bigdata.mr.flowsum;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.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.output.FileOutputFormat;public class FlowCount {//因为要传输上行下行流量两个,context只能传一个vlaue,所以把他封装在一个对象里面static class FlowCountMapper extends Mapper<LongWritable, Text, Text, FlowBean>{@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//将一行内容转成stringString 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 Text(phoneNbr), new FlowBean(upFlow, dFlow));}}static class FlowCountReducer extends Reducer<Text, FlowBean, Text, FlowBean>{//进入reduce数据的样子//<183323,bean1><183323,bean2><183323,bean3><183323,bean4>.......@Overrideprotected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {long sum_upFlow = 0;long sum_dFlow = 0;//遍历所有bean,将其中的上行流量,下行流量分别累加for(FlowBean bean: values){sum_upFlow += bean.getUpFlow();sum_dFlow += bean.getdFlow();}FlowBean resultBean = new FlowBean(sum_upFlow, sum_dFlow);//对象写到文本中会调toString方法,如果不写toString拿到就是一串字符,所以封装时候要写一个toString()context.write(key, resultBean);}}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(Text.class);job.setMapOutputValueClass(FlowBean.class);//指定最终输出的数据的kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);添加区域聚合Combiner**//可以指定combiner ,它是在datanode节点上用,来对map分区输出数据进行局部聚合,//例如:wordcount中map输出<hello,1><hello,1><car,1> <car,2> ,combiner输出后//为<hello,2><car,2>。然后在由reduce总聚合,reduce拿到的数据量相比直接从map拿少//了许多,减少了网络传输。  加入combiner一定不要改变之前业务逻辑,才可以用//job.setCombinerClass(FlowCountReducer.class) 一般与reduce逻辑一样**多个小文件合并策略
//设置setInputFormat为CombineTextInputFormat.class,
//如果不设置则默认的是TextInputFormat.class
//默认用的FileInputForamt中的getSplit进行切片
//而CombineTextInputFormat可以将多个小文件逻辑划分为一个切片,然后运行一个maptask
//这样就能多个小文件就能在一个maptask运行//job.setInputFormat(CombineTextInputFormat.class);
这里设置最大切片大小为4M
//CombineTextInputFormat.setMaxInputSplitSize(job,4194304)
最小为2M
//CombineTextInputFormatsetMinInputSplitSize(job,2097152)//指定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);}}

对象序列化

 package cn.itcast.bigdata.mr.flowsum;import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;import org.apache.hadoop.io.Writable;public class FlowBean implements Writable{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 set(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;}/*** 序列化方法*/@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(dFlow);out.writeLong(sumFlow);}/*** 反序列化方法* 注意:反序列化的顺序跟序列化的顺序完全一致*/@Overridepublic void readFields(DataInput in) throws IOException {this.upFlow = in.readLong();this.dFlow = in.readLong();this.sumFlow = in.readLong();}@Overridepublic String toString() {return upFlow + "\t" + dFlow + "\t" + sumFlow;}}

数据信息

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
1363157988072 13760778710 00-FD-07-A4-7B-08:CMCC 120.196.100.82 2 2 120 120 200
1363157985066 13726238888 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200
1363157993055 13560436666 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200

转自传智播客视频教学内容

对于map处理后,设置分区函数。自己设置不同手机号放入不同分区。

自己设置分区后需要在main里面添加配置信息
//指定我们自定义的数据分区器
job.setPartitionerClass(ProvincePartitioner.class);
//同时指定相应“分区”数量的reducetask
job.setNumReduceTasks(5);

package cn.itcast.bigdata.mr.provinceflowimport java.util.HashMap;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;/*** K2  V2  对应的是map输出kv的类型 * @author**/
public class ProvincePartitioner extends Partitioner<Text, FlowBean>{public static HashMap<String, Integer> proviceDict = new HashMap<String, Integer>();static{proviceDict.put("136", 0);proviceDict.put("137", 1);proviceDict.put("138", 2);proviceDict.put("139", 3);}@Overridepublic int getPartition(Text key, FlowBean value, int numPartitions) {String prefix = key.toString().substring(0, 3);Integer provinceId = proviceDict.get(prefix);return provinceId==null?4:provinceId;}}

对上面reduce输出的流量进行排序输出逻辑代码

package cn.itcast.bigdata.mr.flowsum;import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
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.output.FileOutputFormat;import cn.itcast.bigdata.mr.flowsum.FlowCount.FlowCountMapper;
import cn.itcast.bigdata.mr.flowsum.FlowCount.FlowCountReducer;/** 拿到的信息 输入map中,key还是偏移量value是字符串* 13480253104 180 180 360 13502468823 7335 110349 117684 13560436666 1116 954* 2070* * */
public class FlowCountSort {static class FlowCountSortMapper extends Mapper<LongWritable, Text, FlowBean, Text> {FlowBean bean = new FlowBean();Text v = new Text();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 拿到的是上一个统计程序的输出结果,已经是各手机号的总流量信息String line = value.toString();String[] fields = line.split("\t");String phoneNbr = fields[0];long upFlow = Long.parseLong(fields[1]);long dFlow = Long.parseLong(fields[2]);bean.set(upFlow, dFlow);v.set(phoneNbr);//把一个个对象序列化到文件中去。context.write(bean, v);}}/*** 根据key来掉, 传过来的是对象, 每个对象都是不一样的, 所以每个对象都调用一次reduce方法*/
static class FlowCountSortReducer extends Reducer<FlowBean, Text, Text, FlowBean> {// reduce拿到的数据样式,<bean(),phonenbr>@Overrideprotected void reduce(FlowBean bean, Iterable<Text> values, Context context) throws IOException, InterruptedException {//第一次调用Iterator的next()方法时,它返回序列的第一个元素context.write(values.iterator().next(), bean);}}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(FlowCountSort.class);//指定本业务job要使用的mapper/Reducer业务类job.setMapperClass(FlowCountSortMapper.class);job.setReducerClass(FlowCountSortReducer.class);//指定mapper输出数据的kv类型job.setMapOutputKeyClass(FlowBean.class);job.setMapOutputValueClass(Text.class);//指定最终输出的数据的kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//指定job的输入原始文件所在目录FileInputFormat.setInputPaths(job, new Path(args[0]));//指定job的输出结果所在目录Path outPath = new Path(args[1]);/*FileSystem fs = FileSystem.get(conf);if(fs.exists(outPath)){fs.delete(outPath, true);}*/FileOutputFormat.setOutputPath(job, outPath);//将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行/*job.submit();*/boolean res = job.waitForCompletion(true);System.exit(res?0:1);}}

因为要比大小,所以bean要继承WritableComparale.

要把对象作为key必须实现Comparale。因为mapreduce作为框架只要是key都会进行排序,而对象排序的方法没写顾会报错。

package cn.itcast.bigdata.mr.flowsum;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;import org.apache.hadoop.io.WritableComparable;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 void set(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) {
//比bean大小的时候是比的总流量return this.sumFlow>o.getSumFlow()?-1:1;   //从大到小, 当前对象和要比较的对象比, 如果当前对象大, 返回-1, 交换他们的位置(自己的理解)
}}

利用MapReduce计算运营商上行下行流量相关推荐

  1. android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!

    "手机充电3小时,耗流量23GB","武汉一女子,一夜间用掉流量53.3GB"-- 不少网友称,最近他们的流量消耗快得惊人 是手机的问题?是软件的问题?还是运营 ...

  2. 运营商如何创新流量经营模式?

    流量是互联网+时代的重要载体,社会各个环节都离不开流量.流量业务大规模增长,用户需求的多样化,要求运营商的管道更加智能化和开放化.运营商顺应移动互联网发展规律,改变移动互联网时代"管道工&q ...

  3. 运营商悄悄展开流量价格战,中国电信祭出29元含100GB流量卡

    10月份中国移动悄悄推出了29元含30GB的流量卡套餐,近日中国电信也推出了一款29元含100GB流量的吉星卡,100GB流量分为30GB定向流量和70GB通用流量,这显示出两家运营商已悄悄展开了流量 ...

  4. 利用计算机漏洞运营商系统,浙江警方破获全国首起利用运营商系统漏洞实施帮信案...

    &nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp&nbsp警方抓获湖北荆州微信号贩卖团伙.奚悦摄 &nb ...

  5. 运营商不限流量套餐存陷阱,其实流量是有限的

    不限流量是人们的美好愿望,随着三大运营商的激烈竞争它们也开始不断降低不限流量套餐的门槛,最近更是推出了10元不限流量套餐,不过如果仔细观察这些所谓的不限流量套餐就会发现其实它们的流量都是存在流量限制的 ...

  6. hadoop MapReduce案例运营商关于用户基站停留数据统计

    1.功能描述 用户的手机,连接到不同的基站会产生一条记录. 数据格式为:用户标识 设备标识 基站位置 通讯的日期 通讯时间 example: 0000009999 0054785806 0000008 ...

  7. 边缘计算 — MEC 与运营商

    目录 文章目录 目录 MEC 之于运营商的商业潜力 过去十年电信运营商增量不增收 边缘计算有望帮助电信运营商摆脱管道化趋势 云网融合.云边协同成为电信运营商最大优势 5G + 边缘计算是行业数字化转型 ...

  8. 运营商何时推出无限流量?

    电信运营商推"无限流量"的移动手机套餐本不是新鲜事.海外运营商多年之前就曾推行过类似的举措,但在中国却迟迟没有运营商敢吃螃蟹,而中国的主流通信业专家也一直对此嗤之以鼻:无限流量,绝 ...

  9. 流量消费透明化成为运营商新课题

    前几天,"天价微博"和巨额QQ聊天国际漫游费的消息引起了广泛的关注.本来,笔者认为这事一不能太苛求于运营商,毕竟到了国外的地盘就得听国外运营商的,二来这事似乎离笔者很远,也没太关注 ...

最新文章

  1. Eclipse常见问题集锦
  2. 百分点宣布完成C轮融资2500万美元 将进一步开放云平台应用
  3. Windows7 + Nginx + Memcached + Tomcat 集群 session 共享
  4. 判断 JS 中对象的类型
  5. 【SQL数据库】查询语句练习题
  6. 蓝桥杯2015年第六届C/C++B组国赛第一题-积分之迷
  7. 转发技术风雨三十年,你经历过……
  8. ORACLE ORA-01000: 超出打开游标的最大数(解决及原因)
  9. tk芯片智能机刷机方法_MTK通用刷机教程 MTK芯片智能机刷机方法
  10. 案例3-使用python实现基于opencv的银行卡号识别
  11. windows10强制删除文件_360都删除不了顽固文件?别慌,不足1M的工具帮你强制清理...
  12. 太原市山大附中2021年高考成绩查询,太原40所高中高考喜报汇总!
  13. Java如何生成彩色二维码(利用zxing包)
  14. JAVA 实现《布谷鸟闯关-简单版》游戏
  15. linux计算多个文件大小的和,linux统计多个文件大小总和
  16. PCIe数据卡设计资料第611篇:基于VU9P的双路5Gsps AD 双路6Gsps DA PCIe数据卡
  17. C语言和C++语言中的泛型指针
  18. “超人”为什么最后1秒拯救地球?
  19. zabbix 监控-华为路由器(ASG2100)
  20. lateral view 和 lateral view outer的区别

热门文章

  1. php 策略模式 理解
  2. C++ Qt 高分屏处理心得
  3. JAVA 中的 反射
  4. 软件测试工程师面试如何做好自我介绍?
  5. 数字藏品指南系列第五篇:验证智能合约
  6. 靠一碗面一年三轮融资受资本热捧,张拉拉真的高枕无忧?
  7. maven 如何查询依赖 jar 包版本号
  8. 关于调用百度AI接口进行图片识别的实现(C#)
  9. 【09-JVM面试专题-实例化过程详细讲讲?对象的基本结构你知道吗?TLAB堆上内存分配是怎么样的?你了解这个TLAB吗?】
  10. C语言基础之输出m到n之间的素数