您的位置:首页 > 运维架构

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

2016-05-28 15:38 567 查看
一.环境

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,出现如下结果:



四.遇到的问题

导入jar包后不能显示DFS Locations

可能原因是版本不同的原因,可以自己制作hadoop jar包

制作方法:参考http://my.oschina.net/muou/blog/408543?fromerr=ACzJzurH

运行程序出现:

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

运行程序出现:

[code]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.经过第三步运行程序还是出现:

[code]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文件夹删除即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: