desehawk 发表于 2014-6-19 19:44:59

windows 7 使用 eclipse 下hadoop应用开发环境搭建及问题总结

问题导读
1.如何远程连接eclipse?
2.遇到连接失败可能原因是什么?
3.如何解决连接权限问题?
4.windows下0700问题该如何解决?

static/image/hrline/4.gif



一、概述
最近开始着手高校云平台的搭建,前些天做了hadoop集群测试环境的安装与配置的经验分享,这篇文章主要介绍win7 64位下 eclipse4.2 连接远程Redhat Linux 5下hadoop-1.2.0集群开发环境搭建

二、环境
1、window 7 64位
2、eclipse 4.2
3、Redhat Linux 5
4、hadoop-1.2.0



三、在Eclipse下安装配置hadoop插件

1、安装
安装插件就很简单了,把上面编译的插件文件放到 Eclipse的安装目录下的plugins,重新启动Eclipse

2、配置
(1)将hadoop解压到windows文件系统的某个目录中

(2) 打开Eclipse,设置好workspace
打开Window-->Preferens,你会发现Hadoop Map/Reduce选项,在这个选项里你需要配置Hadoop installation directory。配置完成后退出。

(3)选择window -> open perspective -> Other... , 选择有大象图标的 Map/Reduce,此时,就打开了Map/Reduce的开发环境。可以看到,右下角多了一个Map/Reduce Locations的框。如下图




新建,在打开的窗口中输入:



Location Name : 此处为参数设置名称,可以任意填写
Map/Reduce Master (此处为Hadoop集群的Map/Reduce地址,应该和mapred-site.xml中的mapred.job.tracker设置相同)
DFS Master (此处为Hadoop的master服务器地址,应该和core-site.xml中的 fs.default.name 设置相同)

设置完成后,点击Finish就应用了该设置。
此时,在最左边的Project Explorer中就能看到DFS的目录,如下图所示。


配置完毕

四、测试
新建项目:File-->New-->Other-->Map/Reduce Project ,项目名可以随便取,如hadoop_test_01

它会自动添加依赖包,如下:



可以运行hadoop自带的wordcount实例

/**
*Licensed under the Apache License, Version 2.0 (the "License");
*you may not use this file except in compliance with the License.
*You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*Unless required by applicable law or agreed to in writing, software
*distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*See the License for the specific language governing permissions and
*limitations under the License.
*/


package com.jialin.hadoop;

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));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}


运行时参数设置:

右击wordcount,选择run as - run configurations



参数根据自己实际情况

input目录下有两个文件input1和input2,内容分别为:hello world,hello hadoop
output目录不用手动创建。

运行:
右击wordcount-run as -run on hadoop

运行成功,查看output中的文件内容
hello 2
hadoop 1
world 1

注:测试中遇到问题的解决方式

http://www.aboutyun.com/static/image/hrline/2.gif



解决权限问题
1、hadoop权限
如果当前登录windows的用户名和hadoop集群的用户名不一致,将没有权限访问,会报错

解决办法1:dfs.permissions修改为false。




解决方法2:
可以在服务器创建一个和hadoop集群用户名一致的用户,即可不用修改master的permissions策略。

2、windows下0700问题
这个问题真是纠结了我好几天,最后修还hadoop源码hadoop-core-1.2.0.jar中的FileUtil,重新编译 hadoop-core-1.2.0.jar ,替换掉原来的。才得以解决


eclipse连接远程hadoop集群开发时报错

错误信息:

Exception in thread "main" java.io.IOException:Failed to set permissions of path:\tmp\hadoop-ysc\mapred\staging\ysc-2036315919\.staging to 0700

解决方案(经笔者在hadoop1.2.0+jdk1.7下验证通过):


0.安装jdk,ant,并且配置好环境变量




安装配置jdk不再多说,ant可参考从零教你在Linux环境下(ubuntu)如何编译hadoop2.4





1.首先到官网上把该版本hadoop的tar包下载下来,并解压到$HADOOP_HOME目录下


2.修改hadoop-1.2.0\src\core\org\apache\hadoop\fs下的FileUtil类

private static void checkReturnValue(boolean rv, File p,

FsPermission permission

) throws IOException {

if (!rv) {

throw new IOException("Failed to set permissions of path: " + p +

" to " +

String.format("%04o", permission.toShort()));

}

}


将这个抛异常操作注释掉或者把throw new IOException改为LOG.warn


3.进入到$HADOOP_HOME/src目录中,修改saveVersion.sh文件,因为原saveVersion.sh生成的package-info.java有问题。更正内容为:

user=`whoami` #此处修改成固定值,如user=jialin


3、修改$HADOOP_HOME\build.xml,搜索autoreconf,移除匹配的6个executable="autoreconf"的exec配置 ,如: <exec executable="autoreconf"

dir="${c++.task-controller.src}"

searchpath="yes" failonerror="yes">

<arg value="-i"/>

</exec>


共有6处,将该语言块删除

4、 修改hadoop安装目录下的\build.xml 指定java版本<property name="javac.version" value="1.6"/> 如是1.7就改为1.7


5、在命令行切换到$HADOOP_HOME,执行ant


6、用新生成的$HADOOP_HOME\build\hadoop-core-1.*.*-SNAPSHOT.jar替换nutch的hadoop-core-*.*.*.jar
参考http://blog.csdn.net/shan9liang/article/details/9734677

2278 发表于 2014-7-14 10:25:02

eclipse 4.2 jdk 1.7hadoop -eclipse -plug 2.0   新建map-redece项目时没有自动导入jar 包是为什么呀

2278 发表于 2014-7-14 10:32:32

忽略了 。
2、配置
(1)将hadoop解压到windows文件系统的某个目录中


大意了

ascentzhen 发表于 2014-7-18 22:26:47

配置中,有点麻烦啊?实际的项目中通常都怎么配置开发环境的啊?

nettman 发表于 2014-7-18 22:43:23

ascentzhen 发表于 2014-7-18 22:26
配置中,有点麻烦啊?实际的项目中通常都怎么配置开发环境的啊?
看情况,这是一种开发方式,官方都支持,公司肯定有采用这种方式的。
如果觉得麻烦,你可以使用Linux,这个遇到的问题少一些

ascentzhen 发表于 2014-7-19 15:59:56

log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.NullPointerException
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:442)
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:445)
        at org.apache.hadoop.util.Shell.run(Shell.java:418)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
        at org.apache.hadoop.util.Shell.execCommand(Shell.java:739)
        at org.apache.hadoop.util.Shell.execCommand(Shell.java:722)
        at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:631)
        at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:421)
        at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:277)
        at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:125)
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:348)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282)
        at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303)
        at com.ascent.hadoop.WordCount.main(WordCount.java:84)
这样的错误怎么解决啊?

desehawk 发表于 2014-7-19 17:09:06

本帖最后由 desehawk 于 2014-7-19 17:10 编辑

ascentzhen 发表于 2014-7-19 15:59
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please ...缺组件
http://www.aboutyun.com/data/attachment/forum/201407/04/190309lsyw7tf8txsc5wh5.png
到这里面去找:
hadoop家族、strom、spark、Linux、flume等jar包、安装包汇总下载(持续更新)


ascentzhen 发表于 2014-7-19 21:30:09

环境终于搭建好了,非常感谢楼主的分享

ascentzhen 发表于 2014-7-20 08:50:28

hadoop.dll、winutils.exe是放到本地主机的hadoop安装目录的bin下的,另外hadoop.dll还要放到c:\windows\system32下面的

enson16855 发表于 2014-7-29 22:22:50

本帖最后由 enson16855 于 2014-7-29 22:25 编辑

{:soso_e136:}出现这样的一个错误~
按照上面的方法解决了空指针异常的问题之后,又出现了如图的问题~

补充一下,程序在linux环境下运行木有任何问题,就是在windows下面出现这样那样的问题~
页: [1] 2 3
查看完整版本: windows 7 使用 eclipse 下hadoop应用开发环境搭建及问题总结