Hadoop MapReduce是Google MapReduce的一个开源实现。它利用简单的原理,实现了快速批量处理大数据的能力。Map, Reduce是MapReduce开源框架的两个重要过程。在Map阶段,服务器结点接收数据,做拆分,Reduce阶段,服务器结点接收拆分数据做处理。整个流水线过程,实现了快速处理大数据的目的。
Hadoop作为MapReduce的一个开源实现,自然受到了热捧,一般而言我们将Hadoop安装在Linux环境下,实现学习、工作的任务。但是,Windows电脑下,安装虚拟机,安装Linux,配置Hadoop,再利用IDEA来编程,电脑速度很慢,IDEA的体验也很不好。所以,我们可以在Linux下配置Hadoop,Windows下利用IDEA调试MapReduce程序,再打包成Jar包,在linux环境下运行。在这套程序下,可能会获得更好的体验。
安装Hadoop和winutils
首先,我们需要去官网下载Hadoop二进制包。解压后放在你想用来存放Hadoop的位置。(二进制包解压速度慢,需要耐心些,解压完成即可,不用多做处理。)解压完成后,我们需要下载winutils文件,下载对应版本的winutils,解压后,复制其中的文件到hadoop安装目录的bin文件夹下。
配置环境变量
此电脑右键 ---> 属性 ---> 高级系统设置 ---> 环境变量
首先添加 HADOOP_HOME: 即你的hadoop安装目录
其次,在path变量下添加hadoop安装目录至bin文件夹。
使用IDEA运行
基于maven的教程很多,这里讲依据建立普通JAVA项目的过程来构建Hadoop项目。
首先,以添加JAVA项目的方式,添加一个项目进来,名字随意。之后,在src文件夹下新建一个JAVA Class,名字为WordCount。添加如下代码:
import java.io.IOException;
import java.util.Iterator;
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 WordCount() {
}
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(WordCount.TokenizerMapper.class);
job.setCombinerClass(WordCount.IntSumReducer.class);
job.setReducerClass(WordCount.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);
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public IntSumReducer() {
}
public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
IntWritable val;
for(Iterator var5 = values.iterator(); var5.hasNext(); sum += val.get()) {
val = (IntWritable)var5.next();
}
this.result.set(sum);
context.write(key, this.result);
}
}
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private static final IntWritable one = new IntWritable(1);
private Text word = new Text();
public TokenizerMapper() {
}
public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()) {
this.word.set(itr.nextToken());
context.write(this.word, one);
}
}
}
}
这个时候一定会有很多错,但是别慌,问题不大。点:
File —> Project Structure —> Modules —> Dependenices
点击右上的"+",选择hadoop安装目录下的share文件夹下的如下几个jar包,这个时候会发现错误全都没有了。
在src同级目录下新建一个文件夹 input,在里面可以添加几个文本文件,作为输入。
点File —> Project Structure —> Modules —>Sources,将input文件夹设置为Excluded.
点击Run —> Edit Configuration,选择application,设置main class 以及 program arguments.
这里,main class 指main函数,program arguments为输入输出的文件夹名称。
需要强调的是,input文件夹被设置为Excluded,output文件夹(也就是输出文件)实现不能存在,否则会报错。这样的设定是工业实践所得,所以每次运行hadoop程序都必须保证没有同名输出文件夹。在输出文件夹下,找到part-r-00000即为输出结果。
图片展示的也就是wordcount的结果。