搭建windows(win7)平台hadoop开发环境

一.环境

  • hadoop搭建在Vmware中,分布如下:
192.168.16.131    master
192.168.16.132    node1
192.168.16.133    node2
  • hadoop版本:hadoop-2.6.0
  • Eclipse+hadoop-eclipse-plugin-2.6.0.jar(该包可以在github中下载)

二.搭建

  • 下载Eclipse,解压到某个文件夹(D:\heclipse),将hadoop-eclipse-plugin-2.6.0.jar放在Eclipse的plugins文件夹下(D:\heclipse\eclipse\plugins),打开Eclipse,出现DFS Locations,表示成功,否则可能是jar包的问题,需要重新下载或制作:

    搭建windows(win7)平台hadoop开发环境_第1张图片

  • 运行hadoop,通过win7访问http://(master_ip):50070查看能否访问,以及节点是否都存活。

    • 插曲:如果没有存活,如下图显示2的地方为0,则可以采取如下措施(只是其中一种方法):

      搭建windows(win7)平台hadoop开发环境_第2张图片

    • 解决方法:将master节点中hadoop/tmp/dfs/name/current/VERSION 中的clusterID改成slaves节点的clusterID(即将clusterID与node1、node2统一)

  • 添加jar包,打开Eclipse,点击window–>preferences–>Hadoop Map/Reduce,选择hadoop的位置(这个要与安装的hadoop版本一样):

    搭建windows(win7)平台hadoop开发环境_第3张图片

  • 点击window–>show view将Map/Reduce Locations显示出来,点击右上角的这里写图片描述出现如下的视图:

    搭建windows(win7)平台hadoop开发环境_第4张图片

    • (1)代表的是hadoop的master节点的IP,(2)是指端口号,需要与hadoop配置文件中的core-site.xml中的配置相同,(3)是指端口号,需要与hadoop配置文件的mapred-site.xml中的配置相同。
  • 点击finish,点击DFS Locations,出现如下视图表示连接正确(不同的环境不同的结果):

    搭建windows(win7)平台hadoop开发环境_第5张图片


至此hadoop的win7开发环境搭建完成


三.运行mapreduce程序

  • 新建Map/Reduce Project (WordCount)
  • 创建package与class( package:org.apache.hadoop.examples class:WordCount.java)
  • 运行如下代码:
package org.apache.hadoop.examples;

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;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {

  public static class TokenizerMapper 
       extends Mapper{

    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 {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable 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();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount  ");
      System.exit(2);
    }
    Job job = new Job(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(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

正确运行结果:

搭建windows(win7)平台hadoop开发环境_第6张图片

打开output里面的part-r-00000,出现如下结果:

这里写图片描述


四.遇到的问题

  1. 导入jar包后不能显示DFS Locations

    • 可能原因是版本不同的原因,可以自己制作hadoop jar包
    • 制作方法:参考http://my.oschina.net/muou/blog/408543?fromerr=ACzJzurH

  2. 运行程序出现:
    Exception in thread “main”java.lang.NullPointerException atjava.lang.ProcessBuilder.start(Unknown Source)

    • 原因:在Hadoop2的bin目录下没有winutils.exe
    • 解决方法:在github上下载hadoop-common-2.6.0-bin-master.zip,解压之后将bin目录全部复制到上面在Eclipse中指定的hadoop目录的bin文件夹下,并配置环境变量(重新运行即可):
      HADOOP_HOME=D:\heclipse\hadoop PATH=;$HADOOP_HOME\bin

  3. 运行程序出现:
    Exception in thread “main”java.lang.UnsatisfiedLinkError:
    org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

    • 原因:C:\Windows\System32下缺少hadoop.dll
    • 解决方法:将上一步中bin文件下的hadoop.dll放到系统的C:\Windows\System32下,重启电脑即可。

    4.经过第三步运行程序还是出现:
    Exception in thread “main”java.lang.UnsatisfiedLinkError:
    org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

    • 原因:Windows的唯一方法用于检查当前进程的请求,在给定的路径的访问权限,所以我们先给以能进行访问,我们自己先修改源代码,return true 时允许访问。
    • 解决方法:下载hadoop源码(版本要一致),将hadoop-2.6.0-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 复制到对应的Eclipse的project,然后修改557行为return true如图所示(包名最好与hadoop源码一致):
      这里写图片描述

    5.运行程序出现如下warning:

    这里写图片描述

    • 解决:将hadoop/etc/hadoop/下的log4j.properties复制到WordCount下即可。

    6.运行程序提示没有找到input或者是output已经存在

    • 解决方法:在WordCount下新建一个input文件夹,将运行的文件放进去即可;将原来运行产生的ouput文件夹删除即可。

你可能感兴趣的:(hadoop)