现有文件关于流量文件内容如下

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():取出一行信息,切分,取出手机号,上下行流量(封装到一个bean中)。写出context.write(手机号,bean)。
reduce():拿到一个号码对应的value(迭代器),分别取出bean计算上下行以及总流量。最终封装到bean中,写出context.write(手机号,bean)。
程序实现
为了方便就写在了一个类里面

public class Flowcount {/*** KEYIN:默认情况下,是mr框架所读到的一行文本的起始偏移量,Long,但是在hadoop中有自己的* 更精简的序列化接口(Seria会将类结构都序列化,而实际我们只需要序列化数据),所以不直接用Long,而用LongWritable* VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String,同上,用Text* KEYOUT:是用户自定义逻辑处理完成之后输出数据中的key* VALUEOUT:是用户自定义逻辑处理完成之后输出数据中的value* @author 12706**/static class FlowcountMapper extends Mapper<LongWritable, Text, Text, FlowBean>{@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//输入为1234    23455   33333   33333(中间是制表符)//第二列为手机号,倒数第二列为下行流量,倒数第三列为上行流量String line = value.toString();String[] values = line.split("\t");//获取手机号String phoneNum = values[1];//获取上行流量下行流量long upFlow = new Long(values[values.length-3]);long downFlow = new Long(values[values.length-2]);//封装好后写出到输出收集器context.write(new Text(phoneNum), new FlowBean(upFlow,downFlow));}}/*** KEYIN VALUEIN对应mapper输出的KEYOUT KEYOUT类型对应* KEYOUT,VALUEOUT:是自定义reduce逻辑处理结果的输出数据类型* KEYOUT* VALUEOUT* @author 12706**/static class FlowcountReducer extends Reducer<Text, FlowBean, Text, FlowBean>{@Overrideprotected void reduce(Text key, Iterable<FlowBean> beans,Context context)throws IOException, InterruptedException {//传进来的实例<13345677654,beans>,即多个该电话的键值对//取出values获得上下行和总流量求和long upFlow = 0;long downFlow = 0;for (FlowBean flowBean : beans) {upFlow += flowBean.getUpFlow();downFlow += flowBean.getDownFlow();}context.write(key, new FlowBean(upFlow,downFlow));}}/*** 相当于一个yarn集群的客户端* 需要在此封装mr程序的相关运行参数,指定jar包* 最后提交给yarn* @author 12706* @param args* @throws Exception**/public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);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);//指定job输入原始文件所在位置FileInputFormat.setInputPaths(job, new Path(args[0]));//指定job输入原始文件所在位置FileOutputFormat.setOutputPath(job,new Path(args[1]));//将job中配置的相关参数以及job所用的java类所在的jar包,提交给yarn去运行boolean b = job.waitForCompletion(true);System.exit(b?0:1);}
}
public class FlowBean implements Writable{private long upFlow;//上行流量private long downFlow;//下行流量private long totalFlow;//总流量//序列化时需要无参构造方法public FlowBean() {}public FlowBean(long upFlow, long downFlow) {this.upFlow = upFlow;this.downFlow = downFlow;this.totalFlow = upFlow + downFlow;}//序列化方法 hadoop的序列化很简单,要传递的数据写出去即可public void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(downFlow);out.writeLong(totalFlow);}//反序列化方法 注意:反序列化的顺序跟序列化的顺序完全一致public void readFields(DataInput in) throws IOException {this.upFlow = in.readLong();this.downFlow = in.readLong();this.totalFlow = in.readLong();}//重写toString以便展示@Overridepublic String toString() {return upFlow + "\t" + downFlow + "\t" + totalFlow;}get,set方法
}

流量汇总测试:
将这个工程打成jar包flowcount.jar(右击工程选择export再选jar file选项)放在本地,将打好的jar包上传到linux,将上面需要汇总的文件也也传到linux(名字叫flow.data),创建输入文件目录将文件上传。

创建目录
[root@mini2 ~]# hadoop fs -mkdir -p /flowcount/input
需要汇总的文件上传
[root@mini2 ~]# hadoop fs -put -flow.data /flowcount/input
运行
[root@mini2 ~]# hadoop jar flowcount.jar com.scu.hadoop.mr.Flowcount /flowcount/input /flowcount/output

查看目录结构和输出文件汇总结果

[root@mini2 ~]# hadoop fs -ls /flowcount/output/
-rw-r--r--   2 root supergroup          0 2017-10-09 07:11 /flowcount/output/_SUCCESS
-rw-r--r--   2 root supergroup        551 2017-10-09 07:11 /flowcount/output/part-r-00000
[root@mini2 ~]# hadoop fs -cat /flowcount/output/part-r-00000
13480253104     180     180     360
13502468823     7335    110349  117684
13560436666     1116    954     2070
13560439658     2034    5892    7926
13602846565     1938    2910    4848
13660577991     6960    690     7650
13719199419     240     0       240
13726230503     2481    24681   27162
13726238888     2481    24681   27162
13760778710     120     120     240
13826544101     264     0       264
13922314466     3008    3720    6728
13925057413     11058   48243   59301
13926251106     240     0       240
13926435656     132     1512    1644
15013685858     3659    3538    7197
15920133257     3156    2936    6092
15989002119     1938    180     2118
18211575961     1527    2106    3633
18320173382     9531    2412    11943
84138413        4116    1432    5548

使用mapreduce进行流量汇总程序开发相关推荐

  1. Mapreduce的序列化和流量统计程序开发

    一.Hadoop数据序列化的数据类型 Java数据类型 => Hadoop数据类型 int IntWritable float FloatWritable long LongWritable d ...

  2. MapReduce之流量汇总案例

    流量汇总案例 1.需求   现在我们采集到了一份用户访问流量的数据,我们需要从这份数据中统计出每个用户的流量数据. 部分测试数据如下:可以拷贝出去做测试 1363157985066 137262305 ...

  3. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)...

    MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...

  4. input ios问题 小程序_微信小程序开发常见问题汇总

    原标题:微信小程序开发常见问题汇总 1.域名必须是https 非https的域名不被微信小程序允许. 2.input组件placeholder字体颜色 卸载placeholder-class里面的co ...

  5. AI绘画绘图流量主小程序开发

    AI绘画绘图流量主小程序开发 响应式设计--响应式布局,手机.平板.PC自适应匹配. 自定义模型--自定义内容模型.自定义字段.自定义表单. 付费阅读--支持企业支付宝.企业微信支付.余额支付无缝整合 ...

  6. 坐禅修行木鱼诵经流量主小程序开发

    坐禅修行木鱼诵经流量主小程序开发 适用主体// 个人主体和企业主体均可使用适用范围广泛;激励视频广告+插屏广告+视频广告+banner+原生广告 后台// 打卡祝福语管理.内容管理.经书管理.音乐管理 ...

  7. 万圣节日丧尸变异头像生成流量主小程序开发

    万圣节日丧尸变异头像生成流量主小程序开发 每到节日庆典,各种头像小程序就火爆起来,每次都有新的小程序开始售卖,换汤不换药,比如今年国庆的渐变,去年圣诞的圣诞帽生成. 这些热点,你追累了吗? 看到群里靠 ...

  8. 地图附近名片流量主小程序开发

    地图附近名片流量主小程序开发 会员后台数据导入功能已实现.会员资料表单自定义功能已实现.发帖功能已实现.积分功能实现,发帖需要积分,积分通过会员付费后台充值.回答问题.直接充值获得已实现.红包打赏功能 ...

  9. 趣味测评对话交互版流量主小程序开发

    趣味测评对话交互版流量主小程序开发 逻辑: 图文视频简单易做:-张吸引人的图片,配上引人参与的文字,实现视频引流. 通过测试口令引流:视频提供小程序入口和编号,可吸引粉丝进入小程序缠产生收益. 前端: ...

最新文章

  1. FFmpeg中拉取rtsp视频流并缩放显示测试代码
  2. LinearAlgebra_4
  3. 密度聚类(Density peaks Clustering)Python实现
  4. 如何使用matlab中的胞元数组
  5. mysql防注入 php_PHP使用PDO实现mysql防注入功能详解
  6. C# WebAPI设置跨域
  7. [转]WF事件驱动(4) -持久化
  8. java实现的判断括号是否成对的代码,()[]{}都可以
  9. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...
  10. python萌新笔记----基于requests库请求API下载网易云(VIP)音乐
  11. vs2010插件之VisualSVN
  12. 2015中国(深圳)互联网金融创新峰会暨第二届云海汇梦想年会圆满成功
  13. A股市股票行情实时数据最简封装API接口的python实现
  14. es python search 返回_Elasticsearch - python操作es,以及curl命令查询es的总结
  15. js 中如何筛选处理符合条件的数据
  16. 线性代数 --- 用条件数(condition number)来判断矩阵是否可逆
  17. 产品经理必懂的技术那点事儿(中)
  18. echarts地图省份按顺序依次高亮demo(源码)
  19. 前端入门——JavaScript
  20. 创业中的“投名状”—leo看赢在中国(2)

热门文章

  1. 【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation
  2. 每日文献:2018-01-10
  3. winsever 2008 r2 管理员账号没有权限_青少年禁毒知识竞赛2020 手机账号登录平台(官方入口)...
  4. 如何有效利用大数据预测能力
  5. 红米手机1 升级到android5,从小米MAX 1到红米 K20 pro的“升级”之路。
  6. 如何验证Java 布尔类型的true = 1 ,false = 0
  7. python最小二乘拟合圆_点云球面最小二乘拟合的python实现
  8. 在以太坊开发自己的ERC-20代币及如何ICO
  9. 网易163vip邮箱、163.net邮箱、新浪vip邮箱、QQ邮箱,哪款更符合商务邮件的需求
  10. JS - 实现word预览功能