一、实验题目
开发MapReduce程序
二、实验要求
WeatherData应用程序是为分析文本文件、获得明确结果而编写的计算程序。
在文本分析过程中,程序分别对(数)值和温度做了分类和比较。
本次实验练习,我们将编写MapReduce程序,目的是找出weather.txt文本文件中保存的最高温度的记录。
三、操作步骤
1.打开Eclipse,创建一个Java Project,导入上述实验中提到的jar包;
2.创建“com.letsdobigdata”包,在包下创建“MaxTemparatureMapper”类(可用附件文件);
3.将MaxTemparatureMapper项目导出为Jar文件;
4.启动Hadoop,复制weather.txt文件到“/home/wcbdd/data/weather.txt”;
5.访问localhost:50070,利用文件选择器选择选择weather.txt;
6.运行MapReduce程序,“bin/hadoop jar/home/wcbdd/data/weatherdata.jar com.letsdobigdata.MaxTemperatureDriver/weather.txt /home/wcbdd/weather1”;
7.打开浏览器查看输出结果;
8.复制结果到output.txt;
9.查看output.txt。
四、实验结果
该实验和实验1的大体过程是相似的。
其主要区别在于,实验1中将map,reduce,drive三个模块写到了一个类中。
而实验2中,这三个模块是分着写的。这一部分将给出其不同部分。相同的建立Java Project将不再截图。
首先是项目的组织结构:
可以看到,实验2将项目分成了三部分,map,reduce,drive。
其中map负责提取感兴趣的内容,在本程序中,就是气温。
其代码如下;
package com.letsdobigdata;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class MaxTemperatureMapper extends
Mapper {
private static final int MISSING = 9999;
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String year = line.substring(15, 19);
int airTemperature;
if (line.charAt(87) == '+') { // parseInt doesn't like leading plus
// signs
airTemperature = Integer.parseInt(line.substring(88, 92));
} else {
airTemperature = Integer.parseInt(line.substring(87, 92));
}
String quality = line.substring(92, 93);
if (airTemperature != MISSING && quality.matches("[01459]")) {
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}
然后是reduce部分,负责将map得到的数据整合,并且输出,在本程序中,就是比较气温大小,并输出最大值。
package com.letsdobigdata;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class MaxTemperatureReducer extends
Reducer {
@Override
public void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {
int maxValue = Integer.MIN_VALUE;
for (IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
}
context.write(key, new IntWritable(maxValue));
}
}
最后是drive部分,负责程序的运行,流程控制。
通过浏览器查看结果:
将文件从HDFS中导出:
查看结果:
可以看到,结果和浏览器中的结果是一致的。最热的一天是1901年,那一天温度达到了317,这里的317应该是指开氏度,换算成摄氏度就是43.85,确实很热。
总结:
这两次的实验是告诉我们MapReduce程序的结构是什么样的,应该怎样编写,编写后怎样运行。
我现在有的疑惑就是,这个程序没法测试啊,要运行,先要Export成jar,那要是写错了调试起来岂不是很麻烦?
但愿接下来的学习可以解决我的疑惑。