使用mapreduce进行流量汇总程序开发
现有文件关于流量文件内容如下
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进行流量汇总程序开发相关推荐
- Mapreduce的序列化和流量统计程序开发
一.Hadoop数据序列化的数据类型 Java数据类型 => Hadoop数据类型 int IntWritable float FloatWritable long LongWritable d ...
- MapReduce之流量汇总案例
流量汇总案例 1.需求 现在我们采集到了一份用户访问流量的数据,我们需要从这份数据中统计出每个用户的流量数据. 部分测试数据如下:可以拷贝出去做测试 1363157985066 137262305 ...
- YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)...
MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...
- input ios问题 小程序_微信小程序开发常见问题汇总
原标题:微信小程序开发常见问题汇总 1.域名必须是https 非https的域名不被微信小程序允许. 2.input组件placeholder字体颜色 卸载placeholder-class里面的co ...
- AI绘画绘图流量主小程序开发
AI绘画绘图流量主小程序开发 响应式设计--响应式布局,手机.平板.PC自适应匹配. 自定义模型--自定义内容模型.自定义字段.自定义表单. 付费阅读--支持企业支付宝.企业微信支付.余额支付无缝整合 ...
- 坐禅修行木鱼诵经流量主小程序开发
坐禅修行木鱼诵经流量主小程序开发 适用主体// 个人主体和企业主体均可使用适用范围广泛;激励视频广告+插屏广告+视频广告+banner+原生广告 后台// 打卡祝福语管理.内容管理.经书管理.音乐管理 ...
- 万圣节日丧尸变异头像生成流量主小程序开发
万圣节日丧尸变异头像生成流量主小程序开发 每到节日庆典,各种头像小程序就火爆起来,每次都有新的小程序开始售卖,换汤不换药,比如今年国庆的渐变,去年圣诞的圣诞帽生成. 这些热点,你追累了吗? 看到群里靠 ...
- 地图附近名片流量主小程序开发
地图附近名片流量主小程序开发 会员后台数据导入功能已实现.会员资料表单自定义功能已实现.发帖功能已实现.积分功能实现,发帖需要积分,积分通过会员付费后台充值.回答问题.直接充值获得已实现.红包打赏功能 ...
- 趣味测评对话交互版流量主小程序开发
趣味测评对话交互版流量主小程序开发 逻辑: 图文视频简单易做:-张吸引人的图片,配上引人参与的文字,实现视频引流. 通过测试口令引流:视频提供小程序入口和编号,可吸引粉丝进入小程序缠产生收益. 前端: ...
最新文章
- FFmpeg中拉取rtsp视频流并缩放显示测试代码
- LinearAlgebra_4
- 密度聚类(Density peaks Clustering)Python实现
- 如何使用matlab中的胞元数组
- mysql防注入 php_PHP使用PDO实现mysql防注入功能详解
- C# WebAPI设置跨域
- [转]WF事件驱动(4) -持久化
- java实现的判断括号是否成对的代码,()[]{}都可以
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...
- python萌新笔记----基于requests库请求API下载网易云(VIP)音乐
- vs2010插件之VisualSVN
- 2015中国(深圳)互联网金融创新峰会暨第二届云海汇梦想年会圆满成功
- A股市股票行情实时数据最简封装API接口的python实现
- es python search 返回_Elasticsearch - python操作es,以及curl命令查询es的总结
- js 中如何筛选处理符合条件的数据
- 线性代数 --- 用条件数(condition number)来判断矩阵是否可逆
- 产品经理必懂的技术那点事儿(中)
- echarts地图省份按顺序依次高亮demo(源码)
- 前端入门——JavaScript
- 创业中的“投名状”—leo看赢在中国(2)
热门文章
- 【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation
- 每日文献:2018-01-10
- winsever 2008 r2 管理员账号没有权限_青少年禁毒知识竞赛2020 手机账号登录平台(官方入口)...
- 如何有效利用大数据预测能力
- 红米手机1 升级到android5,从小米MAX 1到红米 K20 pro的“升级”之路。
- 如何验证Java 布尔类型的true = 1 ,false = 0
- python最小二乘拟合圆_点云球面最小二乘拟合的python实现
- 在以太坊开发自己的ERC-20代币及如何ICO
- 网易163vip邮箱、163.net邮箱、新浪vip邮箱、QQ邮箱,哪款更符合商务邮件的需求
- JS - 实现word预览功能