说实话,为了实验这第一个hadoop实例真的是看了很多的视频,实验了很多的博客,大部分的均使用了maven,但是我在看得视频没有用maven,并且是直接在本地系统,也就是hadoop三个模式之一的独立模式下进行的,那么确实有很多的例子均不太能使用,今天给自己记录一下这第一个实例,同时希望能给一些人帮助。

        我使用的是Ubuntu16.0.4的系统版本,eclipse作为开发工具,hadoop版本是hadoop2.7.4,在这里只是都说一下,不代表只能使用同样版本才能做到同样的事情。

        在项目伊始我了解到要hadoop在eclipse上运行可以使用一个插件,hadoop-eclipse-plugin-2.7.3. jar,这个jar包很多地方都是要积分,并且推荐使用与hadoop版本相同的版本,我没有使用同样的,依然可以使用,不过最好使用相同版本,不同版本的不方便之处我还没有看到,日后看到了会在文后补充。

链接:https://pan.baidu.com/s/1T-YSXtABNv3Hs9URZtwk1w      密码: bhus   

        而后先将此jar包放在eclipse—>plugins(plugins文件夹里面的jar包是支撑eclipse运行的,我们放进去的称为拓展包或插件)中后再启动eclipse,在window—>preferences中可以看到Hadoop Map/Reduce目录项,在右面输入Hadoop installation directory作为默认hadoop目录。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_hadoop

        有了这个插件后,在创建项目的时候我们可以选择创建一个Map/Reduce Project。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_hadoop权威指南气象数据集_02

        创建后输入Project name并使用默认hadoop包。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_hadoop权威指南气象数据集_03

        点击Finish便可以看到已经创建好的项目,并且可以看到不用自己导入包,插件通过路径已经将hadoop使用的必须包导入。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_apache_04

        之后的一些操作均属于eclipse使用基础,在src中创建class之类,我就直接贴代码了,不做过多解释。

        创建MaxTemperatureMapper类

package com.test.hadoop;

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;

/*
 * Mapper
 */

public class MaxTemperatureMapper extends
		Mapper<LongWritable, Text, Text, IntWritable> {

	private static final int MISSING = 9999;

	// Map
	@Override
	protected 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(89) == '+') {
			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));
		}
	}

}

        创建MaxTemperatureReducer类

package com.test.hadoop;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
 * Reducer
 */
public class MaxTemperatureReducer extends
		Reducer<Text, IntWritable, Text, IntWritable> {

	@Override
	protected void reduce(Text keyin,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(keyin, new IntWritable(maxValue));
	}

}

        创建MaxTemperature主类

package com.test.hadoop;

import java.io.IOException;

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;

public class MaxTemperature {

	public static void main(String args[]) throws Exception{
		Job job = new Job();
		job.setJarByClass(MaxTemperature.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);
		job.waitForCompletion(true);
	}
}

        有了这些代码之后便是将这个项目导出成jar包,在项目名上右键export成java—>jar file,而后将文件打包,选择项可以看到自创包中的.java结尾的文件都是在列的,在下面点击browse选择jar file的路径及对应名称。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_apache_05

        这个页面什么也不做,均为默认选项。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_Text_06

        在下面的这个页面选择的是主类,在项目中main函数的所在,然后便是按Finish等待打包完成。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_hadoop_07

        由于使用的是独立模式进行实例,不需要hadoop启动任何进程,在终端使用命令,先导入jar包的路径,注意改为自己的文件名。

export HADOOP_CLASSPATH=HadoopDemo01.jar
hadoop com.test.hadoop.MaxTemperature file:///home/ubuntu/workspace/029070-99999-1901.gz /home/ubuntu/workspace/Output

        可以看到hadoop命令后接的是包名和主类名,后面的内容为输入项和输出项,输入内容有一个file:///是因为是本地独立模式,使用的是本地文件。输出文件夹由于hadoop的原因不能自己创建,一定要通过使用项目进行创建,否则会报错。任务完成可以回看终端map和reduce的过程,最终有map100%,reduce100%和job completed successfully字样。

hadoop权威指南气象数据集 基于hadoop的天气分析方法_hadoop_08

        在对应的文件夹中可以看到两个生成文件,part-r-0000是任务结果,_SUCCESS是任务成功标志。

        至此hadoop项目的第一个实例完成。

        在这整个项目的过程中可以看很多大佬的代码详解,对于每一行代码的解析都很重要,对于初学者的我来说受益匪浅,在此也感谢各位能够将自己的成功项目经验放在博客中供大家学习。望大家能多提意见,我也会在测试后对原文进行更改或补充。