MapReduce高级案例⑩

kamisamak 发布于 2020-06-17 1600 次阅读


流量汇总程序案例

[infobox title="标题内容"]

统计手机号耗费的总上行流量、下行流量、总流量(序列化)

Map阶段:
(1)读取一行数据,切分字段
(2)抽取手机号、上行流量、下行流量
(3)以手机号为key,bean对象为value输出,即context.write(手机号,bean);
Reduce阶段:
(1)累加上行流量和下行流量得到总流量。
(2)实现自定义的bean来封装流量信息,并将bean作为map输出的key来传输
(3)MR程序在处理数据的过程中会对数据排序(map输出的kv对传输到reduce之前,会排序),排序的依据是map输出的key
所以,我们如果要实现自己需要的排序规则,则可以考虑将排序因素放到key中,让key实现接口:WritableComparable。
然后重写key的compareTo方法。


[/infobox]
[infobox title="code"]
FlowBean 展开 / 收起

FlowCount 展开 / 收起

[/infobox]
[infobox title="自定义分区"]
将统计结果按照手机归属地不同省份输出到不同文件中(Partitioner)
ProvincePartitioner 展开 / 收起

在Driver中指定job.setPartitionerClass(ProvincePartitioner.class);
[/infobox]
[infobox title="自定义全排序"]
将统计结果按照总流量倒序排序(全排序)
(1)把程序分两步走,第一步正常统计总流量,第二步再把结果进行排序
(2)context.write(总流量,手机号)
(3)FlowBean实现WritableComparable接口重写compareTo方法
FlowCountSort 展开 / 收起

FlowBean 展开 / 收起

[/infobox]
[infobox title="自定义局部排序"]
不同省份输出文件内部排序(部分排序)
要求每个省份手机号输出的文件中按照总流量内部排序。
基于需求3,增加自定义分区类即可。
FlowSortPartitioner 展开 / 收起

在Driver中添加分区类
[kbd]job.setPartitionerClass(FlowSortPartitioner.class);
job.setNumReduceTasks(5);[/kbd]
[/infobox]
from:https://www.cnblogs.com/frankdeng/p/9256252.html