開發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將不再截圖。
首先是項目的組織結構:
可以看到,實驗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<LongWritable, Text, Text, IntWritable> {
	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<Text, IntWritable, Text, IntWritable> {
	@Override
	public void reduce(Text key, Iterable<IntWritable> 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 <input path> <outputpath>");
			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文件,並且運行。
通過瀏覽器查看結果:

將文件從HDFS中導出:

查看結果:
可以看到,結果和瀏覽器中的結果是一致的。最熱的一天是1901年,那一天溫度達到了317,這裏的317應該是指開氏度,換算成攝氏度就是43.85,確實很熱。

總結:
這兩次的實驗是告訴我們MapReduce程序的結構是什麼樣的,應該怎樣編寫,編寫後怎樣運行。
我現在有的疑惑就是,這個程序沒法測試啊,要運行,先要Export成jar,那要是寫錯了調試起來豈不是很麻煩?
但願接下來的學習可以解決我的疑惑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章