我用的是Ubuntu14.06系统,hadoop2.6.0版本,电脑中已经安装eclipse,学习MapReduce最好是能在eclipse中导入相应的hadoop的eclipse插件包,根据自己的版本下载相应的插件,我这里的是hadoop-eclipse-plugin-2.6.0.jar。
1.复制hadoop-eclipse-plugin-2.6.0.jar插件到eclipse的plugins目录下,使用下列命令:
<span style="font-size:18px;">sudo cp hadoop-eclipse-plugin-2.6.0.jar /home/taoxuefei/java/eclipse/eclipse/plugins</span>
如图:<span style="font-size:18px;">sudo cp hadoop-eclipse-plugin-2.6.0.jar /home/taoxuefei/java/eclipse/eclipse/plugins</span>
2.重启eclipse,配置Hadoop installation directory 的内容。
如果插件安装成功,打开Window”s--》Preferences后,在窗口左侧会有Hadoop Map/Reduce选项,点击此选项,在窗口右侧设置Hadoop安装路径,只要到hadoop-2.6.0这一层目录,然后点"Apply"、"OK"就行了。
3.配置Map/Reduce Locations
打开Windows--》Open Perspective-->Other 选择Map/Reduce,点击OK
4.在右下方看到Map/Reduce Locations,点击Map/Reduce Location选项卡,点击右边红色小象图标,打开Hadoop Location配置窗口的相关信息如图所示:
输入相关的端口信息,以便在eclipse中可以看到hdfs文件系统中有哪些相应的文件等。
注意:这里MR Master和DFS Master配置必须和mapred-site.xml和core-site.xml等配置文件一致,我这里配置的是8021和8020端口,你可以查看自己如何配置的然后进行相应的设置。
5.显示MapReduce视图。
在eclipse的右上角可以切换MapReduce视图
这样,对hdfs文件系统中的文件上传下载等就可以通过eclipse直接操作,特别是方便初学者的测试数据上传,下载,删除等。
接下来就可以写代码
也是最近刚刚接触hadoop,前俩天学习了mapreduce的相关内容,于是结合书上的例子,自己写了下WordCount的例子,其实写了后你才会认识到,动手的重要性,一个简单的WordCount程序,折腾了一下午,简单总结下吧。
1.在eclipse中建立mapreduce项目,file--》new project--》other--》Map/Reduce Project
输入项目名WordCount,点击finish。
2.在项目的src目录中新建Java类命名为WordCount,名字可以随便起,主要方便识别程序是干什么的。
3.编写代码
<pre name="code" class="java"><span style="font-family:Times New Roman;font-size:18px;">package com.tao;
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 {
<span style="color:#FF0000;">//Mapper中一定是Object类,相当于文本一行的行号类型</span>
public static class MyMap extends Mapper<<span style="color:#FF0000;">Object</span>, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(<span style="color:#FF0000;">Object</span> 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 MyReduce 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 {
String src = "hdfs://localhost:8020/input";
String dst = "hdfs://localhost:8020/output";
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(MyMap.class);
job.setCombinerClass(MyReduce.class);
job.setReducerClass(MyReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//可以直接指定对hdfs文件系统的哪些文件进行单词计数,可以是多个文件
FileInputFormat.addInputPath(job, new Path(src));
//直接指出hdfs文件的输出位置
FileOutputFormat.setOutputPath(job, new Path(dst));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}</span>
</pre>
对于代码,想说两点:
1.一定注意map中的key类型是Object类型,相当于代表了输入一行文本的行号。
2.如果指定了文件的输入输出路径,这样就不用在Run Configurations中的Arguments中填写相应的参数了如下图:
3.代码中hdfs://localhost:8020/input的文件夹可以直接通过eclipse在DFS Locations中直接右键创建.
4.代码运行之前一定确保,hdfs文件系统中没有output这个文件夹,否则会出现错误信息,从而导致失败。这个文件夹是自动生成的,如果有这个文件夹的话,就删了,然后重新运行程序,就可以了。
这样一个完整的WordCount实例就完成了,希望对自己和刚刚接触hadoop的朋友有帮助吧。