一、问题背景

  现在的移动刚一通话就可以在网站上看自己的通话记录,以前是本月只能看上一个月。不过流量仍然是只能看上一月的。

  目的就是找到用户在一段时间内的上网流量。

  本文并没有对时间分组。下一节进行分区,有兴趣的参看下一篇。

二、数据集分析

  可以看出实际数据集并不是每个字段都有值,但是还好,完整地以tab隔开了,数据格式还是不错的,我们需要的上行下行数据都有,没有缺失值。其实这个需要在程序中处理,如果不在的话 该怎么办。

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

三、实验分析

3.1Mapper

  首先看咱们的目的是统计每个人的上行总流量和下行总流量以及上下行总流,上下行=上行+下行,这个是有意义的,因为我们并不能实时得到自己的上网流量,这个说的有点大了,我们并没有六式计算,或者说是为了实现。

  输入的key是行号,一般是Object和LongWritable,一般输入的key没啥用,数据集市一行一行文本,输入value是text,输入以电话号码为key,那么是text,输出value包含三类信息,上行总、下行总和总,可以封装在数组中,但是这样很不利于修改,比如说项目经历要你增加一些属性要显示,或者减少一些,一般用bean。

package cn.app.hadoop.mr.datacount;

import java.io.IOException;
import java.text.FieldPosition; import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; //第一个处理文本的话一般是LongWritable 或者object
//一行一行的文本是text
//输出的key的手机号 定位Text
//结果是DataBean 一定要实现Writable接口
public class DataCountMapper extends Mapper<LongWritable, Text, Text, DataBean> { //实际处理中已经进行了数据清洗 在这就不catch
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] fields = line.split("\t");
String telNo = fields[1];
long upPayLoad = Long.parseLong(fields[8]);
long downPayLoad = Long.parseLong(fields[9]); //封装到bean,如果格式不对那么跳过 这里不考虑,假设已经清洗
DataBean dataBean = new DataBean(telNo,upPayLoad,downPayLoad); //但是这种方式 每行都new了一个databena下次并没有释放 很慢
//能不能在外边new DataBean,每次修改值,如果按以前的思维是不行的,因为指向了
//同一块内存,没法相加
//但是在hadoop里是可以的,因为每次写入以后就已经序列化了,下次不一样了
context.write(new Text(telNo), dataBean);
} }

  

3.2 DataBean

  bean要能在网络间传输,需要实现hadoop的writable接口,那么首先实现接口的方法,

//反序列化 deserializable  从字节流独处 赋值给内存
public void readFields(DataInput in) throws IOException {
// TODO Auto-generated method stub //注意顺序 类型 里面没参数
//this.telNo = in.readUTF(telNo);是错的 this.telNo = in.readUTF();
this.upPayLoad = in.readLong();
this.downPayLoad = in.readLong();
this.totalPayLoad = in.readLong(); } //序列化serializable,从内存写入到字节流 或者通过rmi在网上传输
public void write(DataOutput out) throws IOException {
// TODO Auto-generated method stub
//手机号是String,但是没有writeString,用writeUTF
out.writeUTF(telNo);
out.writeLong(upPayLoad);
out.writeLong(downPayLoad);
out.writeLong(totalPayLoad);
}

  write就是序列化,吧对象写入到字节流,注意String类型并没有对性的writeString算法,可以用通用的writeUTF方法,证书类型用long,又对影的writeLong。

  readFile就是反序列化,从硬盘或者网络读出,然后赋值给对象,注意读的时候不需要参数,比如

this.telNo = on.readUTF(telNo);

  这样是错误的,想想看对象都成字节流,怎么能看得出是什么,所以是按顺序来判断对应属性的,但是每个属性攒了多少个字节呢,这就要靠属性的类型来确定了,这就想分配内存一样,以上纯属个人理解。

  那么bean有什么属性呢?需要手机号码,上行、下行,以及赞自己见得总流量,然后产生getter和setter;mapper提交的时候就提交DataBean,这就需要有参数的够着方法,不能每次都setter,另外mapper写入的时候通过反射机制得到实例化的dataBean,那么我们就需要午餐的默认垢找方法。

  另外写入databean的时候默认输出类名+hashcode值,这不是我们需要的,所以重写toString方法,eclipse可以自动生成。

	@Override
public String toString() {
//电话号码不要了
return "DataBean [upPayLoad=" + upPayLoad
+ ", downPayLoad=" + downPayLoad + ", totalPayLoad="
+ totalPayLoad + "]";
}

  

3.3 Reducer

  reducer的输入类型就是mapper的输出类型,分别是text和databean,他的输出类型野是text和databean。

  这其实就是业务逻辑复杂一些的wordcount,mapper提交到reducer的已合并相同key格式是<telNo,{{up1,dw1},{up2,dw2}}>,我们需要便利value结合,廉价上行流量得到上行总流量,廉价下行流量得到下行总刘玲,那么最总得流量是上下行总得和。

3.4 Main

  可以直接在eclipse里,new reducer driver,就是main函数了,为什么main里总是要new conf,这是为了给本job个性化配置,通过conf.set也是kv对,否则就找全聚德conf。

  另外注意写路径的时候加上hdfs://hostname:8020,因为没有上下文的FileSystem,所以必须加,否则认为是本地的file,提示找不到。

四、实验分析

  可以从原始数据找到一个用户的两条或者多交记录,求和,然后对比,看看业务逻辑对不。

MapReduce实现手机上网流量分析(业务逻辑)的更多相关文章

  1. MapReduce实现手机上网日志分析(分区)

    一.问题背景 实际业务的需要,比如以移动为例,河南的用户去了北京上网,那么他的上网信息默认保存在了北京的基站,那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息,否则只能 ...

  2. MapReduce实现手机上网日志分析(排序)

    一.背景 1.1 流程 实现排序,分组拍上一篇通过Partitioner实现了. 实现接口,自动产生接口方法,写属性,产生getter和setter,序列化和反序列化属性,写比较方法,重写toStri ...

  3. 运营商手机视频流量包业务日志ETL及统计分析

    自己做过的项目在这里做一个记录,否则就感觉不是自己的了.一是因为过去时间已经很长了,二是因为当时做得有点粗糙,最后还不了了之了. 话不多说,先大致介绍一下项目背景.以前各大手机视频 App 一般都有运 ...

  4. 求相同号码一天内的上网流量——mapreduce

    上网数据 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 246 ...

  5. 使用Pig对手机上网日志进行分析

    在安装成功Pig的基础上.本文将使用Pig对手机上网日志进行分析,详细过程例如以下: 写在前面: 手机上网日志文件phone_log.txt.文件内容 及 字段说明部分截图例如以下 需求分析 显示每一 ...

  6. 网络流量分析——NPMD关注IT运维、识别宕机和运行不佳进行性能优化。智能化分析是关键-主动发现业务运行异常。科来做APT相关的安全分析

    科来 做流量分析,同时也做了一些安全分析(偏APT)——参考其官网:http://www.colasoft.com.cn/cases-and-application/network-security- ...

  7. Android 手机卫士--导航界面4的业务逻辑

    本文实现导航界面4的业务逻辑,导航界面4的界面如下: 本文地址:http://www.cnblogs.com/wuyudong/p/5952640.html,转载请注明出处. 相应的代码如下: pri ...

  8. MapReduce程序开发之流量求和(八)

    1.分析记录手机流量的日志. 2.拿到日志中的一行数据,切分各个字段,抽取出我们需要的字段:手机号,上行流量,下行流量,然后封装成kv发送出去 3.使用java中的map方法: public clas ...

  9. [转帖]从 2G 到 5G,手机上网话语权的三次改变

    从 2G 到 5G,手机上网话语权的三次改变 美国第一大电信运营商 Verizon 公司的 CEO Hans Vestberg 手持一部 iPad,屏幕上显示俯瞰地面的飞行地图.400 多公里外的洛杉 ...

随机推荐

  1. sublime text 乱码生成.dump问题的解决方法

    title: sublime text 乱码生成.dump问题的解决方法 tags: sublime text,sublime text 3,.dump,乱码 grammar_cjkRuby: tru ...

  2. kmeans算法c语言实现,能对不同维度的数据进行聚类

    最近在苦于思考kmeans算法的MPI并行化,花了两天的时间把该算法看懂和实现了串行版. 聚类问题就是给定一个元素集合V,其中每个元素具有d个可观察属性,使用某种算法将V划分成k个子集,要求每个子集内 ...

  3. Nagios监控平台搭建

    Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员, ...

  4. NAS硬盘损坏拷贝时的处理办法及 UBUNTU下遍历删除某目录的方法

    NAS突然挂了,说是硬盘坏了,我不信呀,换块上去先.原来的硬盘要经过一定的操作才能使用 官方给出的解决方案:我如何使用电脑来还原存储在 DiskStation 中的数据? 然后,你再拷贝到新的NAS中 ...

  5. [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError

    问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...

  6. 报表软件JS开发引用HTML DOM的location和document对象

    上一次提到,在报表软件FineReport的JavaScript开发中,可以访问并处理的HTML DOM对象有windows.location.document三种.这次就继续介绍后两种,locati ...

  7. [转]ASP.NET Core 中间件详解及项目实战

    本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...

  8. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...

  9. 理解ThreadLocal(之二)

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  10. AC日记——约瑟夫问题 codevs 1282

    1282 约瑟夫问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 有编号从1到N的N个小 ...