搭建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包的問題,需要重新下載或製作:

    這裏寫圖片描述

  • 運行hadoop,通過win7訪問http://(master_ip):50070查看能否訪問,以及節點是否都存活。

    • 插曲:如果沒有存活,如下圖顯示2的地方爲0,則可以採取如下措施(只是其中一種方法):

      這裏寫圖片描述

    • 解決方法:將master節點中hadoop/tmp/dfs/name/current/VERSION 中的clusterID改成slaves節點的clusterID(即將clusterID與node1、node2統一)

  • 添加jar包,打開Eclipse,點擊window–>preferences–>Hadoop Map/Reduce,選擇hadoop的位置(這個要與安裝的hadoop版本一樣):

    這裏寫圖片描述

  • 點擊window–>show view將Map/Reduce Locations顯示出來,點擊右上角的這裏寫圖片描述出現如下的視圖:

    這裏寫圖片描述

    • (1)代表的是hadoop的master節點的IP,(2)是指端口號,需要與hadoop配置文件中的core-site.xml中的配置相同,(3)是指端口號,需要與hadoop配置文件的mapred-site.xml中的配置相同。
  • 點擊finish,點擊DFS Locations,出現如下視圖表示連接正確(不同的環境不同的結果):

    這裏寫圖片描述


至此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<Object, Text, Text, IntWritable>{

    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<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 {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount <in> <out>");
      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);
  }
}

正確運行結果:

這裏寫圖片描述

打開output裏面的part-r-00000,出現如下結果:

這裏寫圖片描述


四.遇到的問題

  1. 導入jar包後不能顯示DFS Locations

  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文件夾刪除即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章