一、实验目的及要求
1、掌握MapReduce并行编程方法
2、掌握自定义数据类型
3、掌握自定义分区类和自定义排序类的使用
4、掌握最值求解并行化方法
二、实验原理与内容
假设有一个服务器每天都记录同一个网站的访问量数据,主要是该网站下所有页面中的最大访问量和最小访问量,数据存储在下面三个文件中。
数据格式如下(记录时不具体到天):
说明:第一列为某年某月的时间信息,第二列为该月内某天观测到的最大访问量,第三列为该月内同一天观测到的最小访问量。
程序设计要求如下:
最后输出网站每个月内的最大值、最小值,一个月一行数据。
如图中2017-07最大值为900,最小值为100;2017-08最大值为560,最小值为200
输出格式如下
2017-08 560 200
2017-07 900 100
必须自定义一个数据类型,包含某天观测到的最大最小访问量。
要求自定义分区函数,2017年的数据全部规约到一个reducer处理,2018年的数据全部规约到另一个reducer处理。
要求同一年的数据按月份降序排序。如
2017-08 560 200
2017-07 900 100
完成本次实验需要有一定的设计代码思维,因为有两个年份,先按照年月份进行降序排序,然后引用Partitioner函数把年份分成两份文件输出。最后排序出每个月份的最大销量和最小销量进行输出。
三、代码实现:
1、 创建一个类MyWritable,定义一个最大值和最小值
public class MyWritable implements Writable{
private int maxAccess;
private int minAccess;
@Override
public void readFields(DataInput in) throws IOException {
// TODO Auto-generated method stub
maxAccess=in.readInt();
minAccess=in.readInt();
}
@Override
public void write(DataOutput out) throws IOException {
// TODO Auto-generated method stub
out.writeInt(maxAccess);
out.writeInt(minAccess);
}
@Override
public String toString() {
return maxAccess + " " + minAccess;
}
public int getMaxAccess() {
return maxAccess;
}
public int getMinAccess() {
return minAccess;
}
public void setMaxAccess(int maxAccess) {