开发MapReduce程序 实验2

一、实验题目

开发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将不再截图。
首先是项目的组织结构:
开发MapReduce程序 实验2_第1张图片
可以看到,实验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部分,负责程序的运行,流程控制。
package com.letsdobigdata;

//This is the Driver module, i.e. MaxTemperatureDriver.java,created in the com.letsdobigdata package.
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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 org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/*This class is responsible for running map reduce job*/
public class MaxTemperatureDriver extends Configured implements Tool {
	public int run(String[] args) throws Exception {
		if (args.length != 2) {
			System.err
					.println("Usage: MaxTemperatureDriver  ");
			System.exit(-1);
		}
		Job job = new Job();
		job.setJarByClass(MaxTemperatureDriver.class);
		job.setJobName("Max Temperature");
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		job.setMapperClass(MaxTemperatureMapper.class);
		job.setReducerClass(MaxTemperatureReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		System.exit(job.waitForCompletion(true) ? 0 : 1);
		boolean success = job.waitForCompletion(true);
		return success ? 0 : 1;
	}

	public static void main(String[] args) throws Exception {
		MaxTemperatureDriver driver = new MaxTemperatureDriver();
		int exitCode = ToolRunner.run(driver, args);
		System.exit(exitCode);
	}
}
写好程序后,将程序Export成jar文件,并且运行。
通过浏览器查看结果:
开发MapReduce程序 实验2_第2张图片
将文件从HDFS中导出:

查看结果:
可以看到,结果和浏览器中的结果是一致的。最热的一天是1901年,那一天温度达到了317,这里的317应该是指开氏度,换算成摄氏度就是43.85,确实很热。

总结:
这两次的实验是告诉我们MapReduce程序的结构是什么样的,应该怎样编写,编写后怎样运行。
我现在有的疑惑就是,这个程序没法测试啊,要运行,先要Export成jar,那要是写错了调试起来岂不是很麻烦?
但愿接下来的学习可以解决我的疑惑。


你可能感兴趣的:(大数据处理,实验报告)