概述
博主最近在学hadoop,而且在本实验室一位大神的指导下,我已配置好hadoop2.4.1开发环境,还没有配置或者不会配置的,请看链接hadoop单机版配置。由于之前运行的都是hadoop自带的实例,但是对于个人学习而言,肯定是要自己编写实现类以及编译运行实现类,因此博主就撰写了这篇文章,希望对学习hadoop的同道中人有所帮助。
编写实现类
首先在hadoop的根目录下新建一个工作目录workspace,即在/usr/local/hadoop执行命令
接着在workspace目录下编写WordCount.java类
WordCount.java代码如下,各位可以自己复制粘帖,在hadoop官方网站上也可以找到。
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
编译运行
接着将该WordCount.java文件编译为class文件,在编译之前,还需添加以下环境变量
1. 首先添加JAVA_HOME,因为我用的是系统自带的jdk,所以路径如下图所示:
2. 将jdk目录下的bin文件夹添加到环境变量:
3.接着将hadoop_classpath添加到环境变量:
执行上述步骤后,即可开始编译WordCount.java文件,编译java文件的命令为javac,截图如下:
此时,在workspace文件夹下将会出现生成三个class文件,
编译成功后,即可将三个class文件打包成jar文件,
执行成功后,在workspace文件下生成了WordCount.jar文件,
接着,在/usr/local/hadoop文件夹下新建一个input文件夹,用于存放数据,
接着cd 到input文件下,执行以下命令,就是将'Hello World Bye World'写进file01文件,将'Hello Hadoop Goodbye Hadoop' 写进file02文件
最后运行程序,
期间可以到程序执行的过程,
最后,将output目录下的文件输出,即可到程序运行的结果,
到此,编写一个mapreduce实现类以及编译运行就成功实现了。
注:每次运行程序之前,要将之前运行的产生的output删除,不然程序会报错!