最近开始自己搞hadoop实战的一些东西,之前其实已经接触了很久的mapreduce的一些方法,也写了比较多的算法了
但是一直没有很理论的研究过,准备在这个月里面完整的记录一下这方面的理论知识
简述安装配置过程
首先我的电脑是
安装的hadoop版本是2.6下载地址网上很多我就不写了
eclipse的版本
安装配置的过程就不说了,主要是首先安装jdk,然后安装hadoop,之后对hadoop中的多个配置文件进行修改,主要是一些文件的端口号,还有需要的默认datanode的数量等
直接从eclipse中的配置开始说,因为前面的资料网上很多,但是因为自己的版本比较新,后面的程序部分,资料就不全了
eclipse中配置hadoop 2.6的版本
首先网上一直有资料说是在windows的preference下进行配置,但是我的eclipse中就没有preference这一项
1 将hadoop-eclipse-plugin-2.6.0.jar 拷贝到eclipse对应的目录下
2 在window->open perspective中
可以看到Map/Reduce的标志
对应着在面板中有了Map/Reduce Location的部分
点击打开配置项可以对端口号吗进行配置
如果配置成功,在左边的工程界面中会出现dfs的部分并且有相应的文件情况,应该就是对应的hdfs文件的分布情况了
3 创建一个map/reduce的工程
在第一次创建工程的时候可以对eclipse配置的hadoop的安装地址进行配置,设置为默认之后就不用再进行配置了
4 编写实例,进行验证
首先给出例子的代码,只要直接在工程上新建一个java文件就可以了
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
public class WordCount {
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
在工程目录中点击run as ->run configuration
因为这里的inputPath,outputPath都还没有配置,这样参数索引的时候会越界
这里我配置的是本地的文件,当然也可以配置在hdfs上,后面会提到
运行,可以在本地的文件中看到
输入文件内容
输出文件内容: