案例一 WordCount
需求说明
在给定的文本文件中统计输出每一个单词出现的总次数
- 输入数据
- 期望输出数据
代码
代码目录
- com.luoteng.mr.wordcount
- WordcountMapper
- WordcountReducer
- WordcountDriver
编写 Mapper 类
1 | package com.luoteng.mr.wordcount; |
编写 Reducer 类
1 | package com.luoteng.mr.wordcount; |
编写 Driver 类
1 | package com.luoteng.mr.wordcount; |
案例二 序列化
需求说明
统计每一个手机号耗费的总上行流量、下行流量、总流量
输入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
221 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期望输出数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2113470253144 180 180 360
13509468723 7335 110349 117684
13560439638 918 4938 5856
13568436656 3597 25635 29232
13590439668 1116 954 2070
13630577991 6960 690 7650
13682846555 1938 2910 4848
13729199489 240 0 240
13736230513 2481 24681 27162
13768778790 120 120 240
13846544121 264 0 264
13956435636 132 1512 1644
13966251146 240 0 240
13975057813 11058 48243 59301
13992314666 3008 3720 6728
15043685818 3659 3538 7197
15910133277 3156 2936 6092
15959002129 1938 180 2118
18271575951 1527 2106 3633
18390173782 9531 2412 11943
84188413 4116 1432 5548
代码
代码目录
- com.luoteng.mr.flowsum
- FlowBean
- FlowCountMapper
- FlowCountReducer
- FlowsumDriver
编写流量统计的 Bean 对象
1 | package com.luoteng.mr.flowsum; |
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 2001
2. 期望输出数据
13470253144 180 180 360
13509468723 7335 110349 117684
13560439638 918 4938 5856### 需求说明
统计每一个手机号耗费的总上行流量、下行流量、总流量
输入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
221 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期望输出数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2113470253144 180 180 360
13509468723 7335 110349 117684
13560439638 918 4938 5856
13568436656 3597 25635 29232
13590439668 1116 954 2070
13630577991 6960 690 7650
13682846555 1938 2910 4848
13729199489 240 0 240
13736230513 2481 24681 27162
13768778790 120 120 240
13846544121 264 0 264
13956435636 132 1512 1644
13966251146 240 0 240
13975057813 11058 48243 59301
13992314666 3008 3720 6728
15043685818 3659 3538 7197
15910133277 3156 2936 6092
15959002129 1938 180 2118
18271575951 1527 2106 3633
18390173782 9531 2412 11943
84188413 4116 1432 5548
代码
代码目录
- com.luoteng.mr.flowsum
- FlowBean
- FlowCountMapper
- FlowCountReducer
- FlowsumDriver
13568436656 3597 25635 29232
13590439668 1116 954 2070
13630577991 6960 690 7650
13682846555 1938 2910 4848
13729199489 240 0 240
13736230513 2481 24681 27162
13768778790 120 120 240
13846544121 264 0 264
13956435636 132 1512 1644
13966251146 240 0 240
13975057813 11058 48243 59301
13992314666 3008 3720 6728
15043685818 3659 3538 7197
15910133277 3156 2936 6092
15959002129 1938 180 2118
18271575951 1527 2106 3633
18390173782 9531 2412 11943
84188413 4116 1432 55481
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
### 代码
代码目录
- com.luoteng.mr.flowsum
- FlowBean
- FlowCountMapper
- FlowCountReducer
- FlowsumDriver
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 upFlow, long downFlow) {
this.upFlow = upFlow;
this.downFlow = downFlow;
sumFlow = upFlow + downFlow;
}
}
编写 Mapper 类
1 | package com.luoteng.mr.flowsum; |
编写 Reducer 类
1 | package com.luoteng.mr.flowsum; |
编写 Driver 类
1 | package com.luoteng.mr.flowsum; |
案例三 CombineTextInputFormat 切片机制
需求说明
将输入的大量小文件合并成一个切片统一处理。
- 输入数据:同案例一
- 期望输出数据:同案例一
代码
不做任何处理,修改案例一 WordCount 的案例程序,观察修改前后代码运行信息中的切片个数
修改 Driver 类
在代码中增加一行1
2// * 关联
job.setCombinerClass(WordcountReducer.class);
运行结果说明
待补充
案例四 KeyValueTextInputFormat 的使用
需求说明
统计输入文件中每一行的第一个单词相同的行数。
输入数据
1
2期望输出数据
1
2
代码
代码目录
- KVTextMapper
- KVTextMapper
- KVTextReducer
- KVTextDriver
编写 Mapper 类
1 | package KVTextMapper; |
编写 Reducer 类
1 | package KVTextMapper; |
编写 Driver 类
1 | package KVTextMapper; |
案例五 自定义InputFormat
需求说明
将多个小文件合并成一个 SequenceFile 文件(SequenceFile 文件是 Hadoop 用来存储二进制形式的 key-value 对的文件格式),SequenceFile 里面存储着多个文件,存储的形式为文件路径+名称为 key,文件内容为 value。
输入数据
1
2期望输出数据
1
2
代码
代码目录
- com.luoteng.mr.inputformat
- WholeFileInputFormat
- WholeRecordReader
- SequenceFileMapper
- SequenceFileReducer
- SequenceFileDriver
自定义 InputFromat
1 | package com.luoteng.mr.inputformat; |
自定义 RecordReader 类
1 | package com.luoteng.mr.inputformat; |
编写 Mapper 类
1 | package com.luoteng.mr.inputformat; |
编写 Reducer 类
1 | package com.luoteng.mr.inputformat; |
编写 Driver 类
1 | package com.luoteng.mr.inputformat; |
案例六
需求说明
将统计结果按照手机归属地不同省份输出到不同文件中(分区)
输入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
221 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期望输出数据
手机号136、137、138、139开头都分别放到一个独立的4个文件中,其他开头的放到一个文件中。
代码
在案例三的代码基础上进行修改
代码目录
- com.luoteng.mr.flowsum
- FlowBean
- FlowCountMapper
- FlowCountReducer
- FlowsumDriver
- ProvincePartitioner
增加分区类 ProvincePartitioner 对象
1 | package com.luoteng.mr.flowsum; |
修改 Driver 类
在驱动函数中增加自定义数据分区设置和ReduceTask设置,增加如下代码1
2
3// * 设置自定义的 Partitioner 类
job.setPartitionerClass(ProvincePartitioner.class);
job.setNumReduceTasks(5);
案例七
需求说明
根据案例六产生的结果再次对总流量进行排序。
- 输入数据:案例六的输出结果
- 期望输出数据
手机号136、137、138、139开头都分别放到一个独立的4个文件中,其他开头的放到一个文件中。并且文件内容有序
代码
- com.luoteng.mr.sort
- FlowBean
- FlowCountSortMapper
- FlowCountSortReducer
- FlowCountSortDriver
- ProvincePartitioner
编写流量统计的 Bean 对象
lowBean对象在案例六的基础上增加了比较功能1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86package com.luoteng.mr.sort;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
public class FlowBean implements WritableComparable<FlowBean>{
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;
this.sumFlow = upFlow + downFlow;
}
// 序列化
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
// 反序列化
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}
// 比较
public int compareTo(FlowBean bean) {
int result;
// 核心比较条件判断
if (sumFlow > bean.getSumFlow()) {
result = -1;
}else if (sumFlow < bean.getSumFlow()) {
result = 1;
}else {
result = 0;
}
return result;
}
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 String toString() {
return upFlow + "\t" + downFlow + "\t" + sumFlow;
}
}
编写 Mapper 类
1 | package com.luoteng.mr.sort; |
编写 Reducer 类
1 | package com.luoteng.mr.sort; |
编写 Driver 类
1 | package com.luoteng.mr.sort; |
编写分区类 ProvincePartitioner
1 | package com.luoteng.mr.sort; |
案例八 GroupingComparator 分组
需求说明
订单数据,现在需要求出每一个订单中最贵的商品。
输入数据
1
2
3
4
5
6
7000001 Pdt_01 222.8
000002 Pdt_05 722.4
000001 Pdt_02 33.8
000003 Pdt_06 232.8
000003 Pdt_02 33.8
000002 Pdt_03 522.8
000002 Pdt_04 122.4期望输出数据
1
2
31 222.8
2 722.4
3 232.8
代码
- com.luoteng.mr.order
- OrderBean
- OrderMapper
- OrderGroupingComparator
- OrderReducer
- OrderDriver
定义订单信息 OrderBean 类
1 | package com.luoteng.mr.order; |
编写 Mapper 类
1 | ackage com.luoteng.mr.order; |
编写 GroupingComparator 类
1 | package com.luoteng.mr.order; |
编写 Reducer 类
1 | package com.luoteng.mr.order; |
编写 Driver 类
1 | package com.luoteng.mr.order; |
案例九 自定义OutputFormat
需求说明
过滤输入的log日志,包含atguigu的网站输出到 /root/data/luoteng.log,不包含atguigu的网站输出到 /root/data//other.log。
输入数据
1
2
3
4
5http://www.baidu.com
http://luoteng.com
http:/www.sohu.com
http://www.sin2a.com
http://atguigu.com期望输出数据
1
2
代码
- com.luoteng.mr.outputformat
- FilterMapper
- FilterReducer
- FilterOutputFormat
- FRecordWriter
- FilterDriver
编写 Mapper 类
1 | package com.luoteng.mr.outputformat; |
编写 Reducer 类
1 | package com.luoteng.mr.outputformat; |
自定义一个 OutputFormat 类
1 | package com.luoteng.mr.outputformat; |
编写 RecordWriter 类
1 | package com.luoteng.mr.outputformat; |
编写 Driver 类
1 | package com.luoteng.mr.outputformat; |
案例十
需求说明
将商品信息表中数据根据商品pid合并到订单数据表中。
订单数据:
| id | pid | amount |
|—-|—–|——–|
| 1001 | 01 | 1 |
| 1002 | 02 | 2 |
| 1003 | 03 | 3 |
| 1004 | 01 | 4 |
| 1005 | 02 | 5 |
| 1006 | 03 | 6 |
商品信息:
|pid | pname |
|—-|——-|
| 01 | 小米 |
| 02 | 华为 |
| 03 | 格力 |
输入数据
1
2
3
4
5
6
7
8
9
101001 01 1
1002 02 2
1003 03 3
1001 01 1
1002 02 2
1003 03 3
01 小米
02 华为
03 格力期望输出数据
1
2
代码
- com.luoteng.mr.table
- TableBean
- TableMapper
- TableReducer
- TableDriver
创建商品和订合并后的 Bean 类
1 | package com.luoteng.mr.table; |
编写 Mapper 类
1 | package com.luoteng.mr.table; |
编写 Reducer 类
1 | package com.luoteng.mr.table; |
编写 Driver 类
1 | package com.luoteng.mr.table; |
案例十一 Map Join
需求说明
同案例十
代码
- com.luoteng.mr.cache
- DistributedCacheMapper
- DistributedCacheDriver
编写 Mapper 类
1 | package com.luoteng.mr.cache; |
编写 Driver 类
1 | package com.luoteng.mr.cache; |
案例十二 数据清洗案例实操
需求说明
去除日志中字段长度小于等于11的日志。
输入数据
1
2期望输出数据:每行字段长度都大于11。
1
2
代码
- com.luoteng.mr.log
- LogMapper
- LogDriver
编写 Mapper 类
1 | package com.luoteng.mr.log; |
编写 Driver 类
1 | package com.luoteng.mr.log; |
模板
案例三
需求说明
统计每一个手机号耗费的总上行流量、下行流量、总流量
输入数据
1
2期望输出数据
1
2
代码
编写流量统计的 Bean 对象
1 |
编写 Mapper 类
1 |
编写 Reducer 类
1 |
编写 Driver 类
1 |