大資料開發之Mapper Reduce序列化案例實操
- 統計每一個手機號耗費的總上行流量、下行流量、總流量
(1)輸入資料
1 13736230513 192.196.100.1 www.atguigu.com 2481 24681 200
2 13846544121 192.196.100.2 264 0 200
3 13956435636 192.196.100.3 132 1512 200
4 13966251146 192.168.100.1 240 0 404
5 18271575951 192.168.100.2 www.atguigu.com 1527 2106 200
6 84188413 192.168.100.3 www.atguigu.com 4116 1432 200
7 13590439668 192.168.100.4 1116 954 200
8 15910133277 192.168.100.5 www.hao123.com 3156 2936 200
9 13729199489 192.168.100.6 240 0 200
10 13630577991 192.168.100.7 www.shouhu.com 6960 690 200
11 15043685818 192.168.100.8 www.baidu.com 3659 3538 200
12 15959002129 192.168.100.9 www.atguigu.com 1938 180 500
13 13560439638 192.168.100.10 918 4938 200
14 13470253144 192.168.100.11 180 180 200
15 13682846555 192.168.100.12 www.qq.com 1938 2910 200
16 13992314666 192.168.100.13 www.gaga.com 3008 3720 200
17 13509468723 192.168.100.14 www.qinghua.com 7335 110349 404
18 18390173782 192.168.100.15 www.sogou.com 9531 2412 200
19 13975057813 192.168.100.16 www.baidu.com 11058 48243 200
20 13768778790 192.168.100.17 120 120 200
21 13568436656 192.168.100.18 www.alibaba.com 2481 24681 200
22 13568436656 192.168.100.19 1116 954 200
編寫MapReduce程式
(1)編寫流量統計的Bean物件
package MRS.xuleihua;
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 downFlow;// 下行流量
private long sumFlow;// 總流量
// 空參構造, 為了後續反射用
public FlowBean() {
super();
}
public FlowBean(long upFlow, long downFlow) {
super();
this.upFlow = upFlow;
this.downFlow = downFlow;
sumFlow = upFlow + downFlow;
}
// 序列化方法
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
// 反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
// 必須要求和序列化方法順序一致
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}
@Override
public String toString() {
return upFlow + "\t" + downFlow + "\t" + sumFlow;
}
public long getUpFlow() {
return upFlow;
}
public void setUpFlow(long upFlow) {
this.upFlow = upFlow;
}
public long getDownFlow() {
return downFlow;
}
public void setDownFlow(long downFlow) {
this.downFlow = downFlow;
}
public long getSumFlow() {
return sumFlow;
}
public void setSumFlow(long sumFlow) {
this.sumFlow = sumFlow;
}
public void set(long upFlow2, long downFlow2) {
upFlow = upFlow2;
downFlow = downFlow2;
sumFlow = upFlow2 + downFlow2;
}
}
(2)編寫Mapper類
package MRS.xuleihua;
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class FlowCountMapper extends Mapper<LongWritable, Text, Text, FlowBean> {
Text k = new Text();
FlowBean v = new FlowBean();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 7 13560436666 120.196.100.99 1116 954 200
// 1 獲取一行
String line = value.toString();
// 2 切割 \t
String[] fields = line.split("\t");
// 3 封裝物件
k.set(fields[1]);// 封裝手機號
long upFlow = Long.parseLong(fields[fields.length - 3]);
long downFlow = Long.parseLong(fields[fields.length - 2]);
v.setUpFlow(upFlow);
v.setDownFlow(downFlow);
// v.set(upFlow,downFlow);
// 4 寫出
context.write(k, v);
}
}
(3)編寫Reducer類
package MRS.xuleihua;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class FlowCountReducer extends Reducer<Text, FlowBean, Text, FlowBean>{
FlowBean v = new FlowBean();
@Override
protected void reduce(Text key, Iterable<FlowBean> values, Context context)
throws IOException, InterruptedException {
// 13568436656 2481 24681 30000
// 13568436656 1116 954 20000
long sum_upFlow = 0;
long sum_downFlow = 0;
// 1 累加求和
for (FlowBean flowBean : values) {
sum_upFlow += flowBean.getUpFlow();
sum_downFlow += flowBean.getDownFlow();
}
v.set(sum_upFlow, sum_downFlow);
// 2 寫出
context.write(key, v);
}
}
(4)編寫Driver驅動類
package MRS.xuleihua;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class FlowsumDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
args = new String[]{"/home/master/Documents/app/demo/","/home/master/Documents/app/output013"};
Configuration conf = new Configuration();
//獲取job物件
Job job = Job.getInstance(conf);
//設定jar路徑
job.setJarByClass(FlowsumDriver.class);
//關聯mapper和reducer
job.setMapperClass(FlowCountMapper.class);
job.setReducerClass(FlowCountReducer.class);
//設定最終輸出key和value
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FlowBean.class);
//設定輸入輸出路徑
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//提交job
boolean result = job.waitForCompletion(true);
System.exit(result?0 :1);
}
}
相關文章
- Hive中的資料型別以及案例實操Hive資料型別
- ORM實操之資料庫遷移ORM資料庫
- 教育大資料之資料開發系統大資料
- ORM實操之資料的增刪改查ORM
- 直播預約丨《袋鼠雲大資料實操指南》No.3:資料資產管理實操,如何有效進行資料治理大資料
- 騰訊雲大資料實戰案例大資料
- 大資料開發-資料表監控-實現大資料
- map/reduce實現資料去重
- 【大資料】MapReduce開發小實戰大資料
- 實時採集MySQL資料之輕量工具Maxwell實操MySql
- 直播預約丨《袋鼠雲大資料實操指南》No.2:實時開發,如何成為資料智慧化的有效驅動力大資料
- 大資料開發之常見九種資料分析方法大資料
- 大資料開發之常用命令大全大資料
- 直播預約丨《袋鼠雲大資料實操指南》No.1:從理論到實踐,離線開發全流程解析大資料
- 大資料SQL優化之資料傾斜解決案例全集大資料SQL優化
- 乾貨:PHP與大資料開發實踐PHP大資料
- 網路營銷大資料實操七步走——資訊圖大資料
- Flask RESTful API開發之序列化與反序列化FlaskRESTAPI
- 大資料開發實戰:實時資料平臺和流計算大資料
- 【大資料】深入原始碼解析Map Reduce的架構大資料原始碼架構
- Kafka ACL實現架構以及實操案例剖析Kafka架構
- 大資料應用案例大資料
- 大資料基礎之開發第一個Java程式大資料Java
- 大資料開發筆記大資料筆記
- 案例|政務大資料平臺資料安全建設實踐大資料
- 大資料教程分享實用的大資料之陣列大資料陣列
- 【UNITY3D 遊戲開發之五】Google-protobuf與FlatBuffers資料的序列化和反序列化Unity3D遊戲開發Go
- 大資料Storm 之RCE實踐大資料ORM
- 大資料測試之揭秘大資料的背景與發展大資料
- 大資料的開放式創新:如何才能實現大資料的深發展?大資料
- 騰訊雲EMR大資料實時OLAP分析案例解析大資料
- 實操ES6之PromisePromise
- 3.0 阿里雲大資料專案實戰開發阿里大資料
- 什麼是大資料開發?大資料
- 大資料開發之路:hive篇大資料Hive
- 如何大資料開發入門大資料
- 《離線和實時大資料開發實戰》(二)大資料平臺架構 & 技術概覽大資料架構
- 【實操案例】Linux中切換目錄如何操作?Linux