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安装目录

linux安装hadoop和zookeeper hadoop部署linux还是windows_hadoop


其次,在path变量下添加hadoop安装目录至bin文件夹。

linux安装hadoop和zookeeper hadoop部署linux还是windows_Text_02

使用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包,这个时候会发现错误全都没有了。

linux安装hadoop和zookeeper hadoop部署linux还是windows_hadoop_03


在src同级目录下新建一个文件夹 input,在里面可以添加几个文本文件,作为输入。

linux安装hadoop和zookeeper hadoop部署linux还是windows_Hadoop_04


File —> Project Structure —> Modules —>Sources,将input文件夹设置为Excluded.

linux安装hadoop和zookeeper hadoop部署linux还是windows_Text_05


点击Run —> Edit Configuration,选择application,设置main class 以及 program arguments.

linux安装hadoop和zookeeper hadoop部署linux还是windows_Hadoop_06


这里,main class 指main函数,program arguments为输入输出的文件夹名称。

需要强调的是,input文件夹被设置为Excluded,output文件夹(也就是输出文件)实现不能存在,否则会报错。这样的设定是工业实践所得,所以每次运行hadoop程序都必须保证没有同名输出文件夹。在输出文件夹下,找到part-r-00000即为输出结果。

linux安装hadoop和zookeeper hadoop部署linux还是windows_Text_07


图片展示的也就是wordcount的结果。