本文以手机流量统计为例:
日志中包含下面字段
现在需要统计手机的上行数据包,下行数据包,上行总流量,下行总流量。
分析:可以以手机号为key 以上4个字段为value传传递数据。
这样则需要自己定义一个数据类型,用于封装要统计的4个字段,在map 与reduce之间传递和shuffle
注:作为key的自定义类型需要实现WritableComparable 里面的compareTo方法
作为value的自定义类 则只需实现Writable里面的方法
自定义代码如下:
package org.apache.hadoop.mapreduce.io; import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.Writable; /***
* customize mobile data writable
* @author nele
*
*/
public class MobileDataWritable implements
Writable { private long upPackNum; private long downPackNum; private long upPayLoad; private long downPayLoad; public long getUpPackNum() {
return upPackNum;
} public void setUpPackNum(long upPackNum) {
this.upPackNum = upPackNum;
} public long getDownPackNum() {
return downPackNum;
} public void setDownPackNum(long downPackNum) {
this.downPackNum = downPackNum;
} public long getUpPayLoad() {
return upPayLoad;
} public void setUpPayLoad(long upPayLoad) {
this.upPayLoad = upPayLoad;
} public long getDownPayLoad() {
return downPayLoad;
} public void setDownPayLoad(long downPayLoad) {
this.downPayLoad = downPayLoad;
} public MobileDataWritable() {
} public MobileDataWritable(long upPackNum, long downPackNum, long upPayLoad,
long downPayLoad) {
this.set(upPackNum, downPackNum, upPayLoad, downPayLoad);
} public void set(long upPackNum, long downPackNum, long upPayLoad,
long downPayLoad) {
this.upPackNum = upPackNum;
this.downPackNum = downPackNum;
this.upPayLoad = upPayLoad;
this.downPayLoad = downPayLoad;
} public void write(DataOutput out) throws IOException {
out.writeLong(upPackNum);
out.writeLong(downPackNum);
out.writeLong(upPayLoad);
out.writeLong(downPayLoad);
} public void readFields(DataInput in) throws IOException {
this.upPackNum = in.readLong();
this.downPackNum = in.readLong();
this.upPayLoad = in.readLong();
this.downPayLoad = in.readLong();
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (downPackNum ^ (downPackNum >>> 32));
result = prime * result + (int) (downPayLoad ^ (downPayLoad >>> 32));
result = prime * result + (int) (upPackNum ^ (upPackNum >>> 32));
result = prime * result + (int) (upPayLoad ^ (upPayLoad >>> 32));
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MobileDataWritable other = (MobileDataWritable) obj;
if (downPackNum != other.downPackNum)
return false;
if (downPayLoad != other.downPayLoad)
return false;
if (upPackNum != other.upPackNum)
return false;
if (upPayLoad != other.upPayLoad)
return false;
return true;
} @Override
public String toString() {
return upPackNum + "\t" +downPackNum+ "\t" + upPayLoad + "\t" + downPayLoad;
} }
现在就可以使用自定义的类型进行手机流量的统计 代码如下:
/***
* MapReduce Module
*
* @author nele
*
*/
public class MobileDataMapReduce extends Configured implements Tool { // map class
/**
*
* @author nele
*
*/
public static class MobileDataMapper extends
Mapper<LongWritable, Text, Text, MobileDataWritable> { public Text outPutKey = new Text();
public MobileDataWritable outPutValue = new MobileDataWritable(); @Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
System.out.println(key+":"+value);
String[] arr = value.toString().split("\t");
outPutKey.set(arr[1]);
outPutValue.set(Long.valueOf(arr[6]), Long.valueOf(arr[7]),
Long.valueOf(arr[8]), Long.valueOf(arr[9]));
context.write(outPutKey, outPutValue);
} } // reduce class
/***
*
* @author nele
*
*/
public static class MobileDataReducer extends
Reducer<Text, MobileDataWritable, Text, MobileDataWritable> { private Text outPutKey = new Text();
private MobileDataWritable outPutValue = new MobileDataWritable(); @Override
public void reduce(Text key, Iterable<MobileDataWritable> values,
Context context) throws IOException, InterruptedException {
long upPackNum = 0;
long downPackNum = 0;
long upPayLoad = 0;
long downPayLoad = 0;
for (MobileDataWritable val : values) {
upPackNum += val.getUpPackNum();
downPackNum += val.getDownPackNum();
upPayLoad += val.getUpPayLoad();
downPayLoad += val.getDownPayLoad();
}
outPutKey.set(key);
outPutValue.set(upPackNum, downPackNum, upPayLoad, downPayLoad);
context.write(outPutKey, outPutValue);
}
} // run method
public int run(String[] args) throws Exception {
Configuration conf = super.getConf(); // create job
Job job = Job.getInstance(conf, this.getClass().getSimpleName());
job.setJarByClass(this.getClass()); // set input path
Path inPath = new Path(args[0]);
FileInputFormat.addInputPath(job, inPath); // map
job.setMapperClass(MobileDataMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(MobileDataWritable.class); // conbile
job.setCombinerClass(MobileDataReducer.class); // reduce
job.setReducerClass(MobileDataReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(MobileDataWritable.class); // output
Path outPath = new Path(args[1]);
FileOutputFormat.setOutputPath(job, outPath); // submit
return job.waitForCompletion(true) ? 0 : 1;
} public static void main(String[] args) throws Exception {
args = new String[] {
"hdfs://bigdata5:8020/user/nele/data/input/HTTP_20130313143750.data",
"hdfs://bigdata5:8020/user/nele/data/output/output6" }; Configuration conf = new Configuration(); int status = ToolRunner.run(conf, new MobileDataMapReduce(), args); System.exit(status);
} }
这样就可以统计 给出的数据日志中的手机各种流量的数据
mapreduce 自定义数据类型的简单的应用的更多相关文章
-
Hadoop MapReduce自定义数据类型
一 自定义数据类型的实现 1.继承接口Writable,实现其方法write()和readFields(), 以便该数据能被序列化后完成网络传输或文件输入/输出: 2.如果该数据需要作为主键key使用 ...
-
自定义MapReduce中数据类型
数据类型(都实现了Writable接口) BooleanWritable 布尔类型 ByteWritable 单字节数值 DoubleWritable 双字节数值 FloatWritable 浮点数 ...
-
hadoop的自定义数据类型和与关系型数据库交互
最近有一个需求就是在建模的时候,有少部分数据是postgres的,只能读取postgres里面的数据到hadoop里面进行建模测试,而不能导出数据到hdfs上去. 读取postgres里面的数据库有两 ...
-
Hadoop mapreduce自定义分组RawComparator
本文发表于本人博客. 今天接着上次[Hadoop mapreduce自定义排序WritableComparable]文章写,按照顺序那么这次应该是讲解自定义分组如何实现,关于操作顺序在这里不多说了,需 ...
-
java基础(14):Eclipse、面向对象、自定义数据类型的使用
1. Eclipse的应用 1. 常用快捷操作 Ctrl+T:查看所选中类的继承树 例如,在下面代码中,选中Teacher类名,然后按Ctrl+T,就会显示出Teacher类的继承关系 //员工 ab ...
-
js数据类型很简单,却也不简单
最近脑子里有冒出"多看点书"的想法,但我个人不是很喜欢翻阅纸质书籍,另一方面也是因为我能抽出来看书的时间比较琐碎,所以就干脆用app看电子书了(如果有比较完整的阅读时间,还是建议看 ...
-
TVM自定义数据类型
TVM自定义数据类型 本文将介绍"自定义数据类型"框架,该框架可在TVM中使用自定义数据类型. 介绍 在设计加速器时,关键是如何近似地表示硬件中的实数.这个问题具有长期的行业标准解 ...
-
自主数据类型:在TVM中启用自定义数据类型探索
自主数据类型:在TVM中启用自定义数据类型探索 介绍 在设计加速器时,一个重要的决定是如何在硬件中近似地表示实数.这个问题有一个长期的行业标准解决方案:IEEE 754浮点标准.1.然而,当试图通过构 ...
-
【填坑往事】使用Rxjava2的distinct操作符处理自定义数据类型去重的问题
最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重.处理去重的办法很多,比如借助Set集合类,使用双重循环拿每一个元素和其他元素对比等.这里介绍一种简单而且比较优雅的方式:使用Rxjava ...
随机推荐
-
Java Generics and Collections-2.4-2.5
2.4 The Get and Put Principle Get and Put Principle: 用于取对象的泛型集合,声明为 <? extends T> 用于存对象的泛型集合,声 ...
-
记录 android 开发的一个 ";面试"; 问题
前序: 3天前,有幸得到师兄赏识,和他一起去帮一间珠海的本地的IT公司担任面试官,虽说如此,我自己本身就还没毕业,充其量是去见识下世面罢了.当天共面试了13人,这只是上午,下午我闪了.在笔试的部分,我 ...
-
kaptcha随机验证码的使用详解,超实用
效果图: 官方地址:https://code.google.com/p/kaptcha/w/list 1.把下载的kaptcha-2.3.2.jar添加到lib中 2.配置web.xml增加servl ...
-
[LeetCode]LRU Cache有个问题,求大神解答【已解决】
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
-
centos vwwareTools 拷贝文件设置
1. 在root 用户下面 在虚拟机菜单上面选择 Vwware Tools 虚拟机会将 安装文件 拷贝到桌面上面 拷贝这个文件 到 root 文件夹 /home/root 将XXX.tar.g ...
-
Docker镜像导致centos-root根分区容量爆满
当虚拟机服务器运行Docker久了后,发现Docker的文件越来越大,某天发现此台机上的数据库访问不了了,再重启数据库等日志,提示空间不足,查看磁盘空间: root分区满载啊,前段时间还有不少空间的, ...
-
CEPH RGW集群和bucket的zone group 不一致导致的404异常解决 及 使用radosgw-admin metadata 命令设置bucket metadata 的方法
问题现象: 最近在研究zonegroup的配置操作,发现在配置zonegroup后修改了default zone,导致访问对象报404错误. 问题原因: rgw 日志 报异常'request fo ...
-
DVWA 黑客攻防演练(一) 介绍及安装
原本是像写一篇 SELinux 的文章的.而我写总结文章的时候,总会去想原因是什么,为什么会有这种需求.而我发觉 SELinux 的需求是编程人员的神奇代码或者维护者的脑袋短路而造成系统容易被攻击.就 ...
-
win10 搭建virtualenvwrapper虚拟环境
1. 安装virtualenvwrapper pip install virtualenvwrapper-win 注: linux下运行pip install virtualenvwrapper 2. ...
-
在 Confluence 6 中的 Jira 权限
只读(Read Only) 从你 JIRA 应用服务器上取得的用户,用户组和用户组成员.这些用户的信息只能通过你的 JIRA 服务器进行修改. https://www.cwiki.us/display ...