给力星

Web Developer

使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS

本教程介绍的是如何在 Ubuntu/CentOS 中使用 Eclipse 来开发 MapReduce 程序,在 Hadoop 2.6.0 下验证通过。虽然我们可以使用命令行编译打包运行自己的MapReduce程序,但毕竟编写代码不方便。使用 Eclipse,我们可以直接对 HDFS 中的文件进行操作,可以直接运行代码,省去许多繁琐的命令。本教程由厦门大学数据库实验室出品,转载请注明。

环境

本教程在 Hadoop 2.6.0 下验证通过,适用于 Ubuntu/CentOS 系统,理论上可用于任何原生 Hadoop 2 版本,如 Hadoop 2.4.1,Hadoop 2.7.1。

本教程主要测试环境:

  • Ubuntu 14.04
  • Hadoop 2.6.0(伪分布式)
  • Eclipse 3.8

此外,本教材在 CentOS 6.4 系统中也验证通过,对 Ubuntu 与 CentOS 的不同配置之处有作出了注明。

安装 Eclipse

在 Ubuntu 和 CentOS 中安装 Eclipse 的方式有所不同,但之后的配置和使用是一样的。

在 Ubuntu 中安装 Eclipse,可从 Ubuntu 的软件中心直接搜索安装,在桌面左侧任务栏,点击“Ubuntu软件中心”。

Ubuntu软件中心Ubuntu软件中心

在右上角搜索栏中搜索 eclipse,在搜索结果中单击 eclipse,并点击安装。

安装Eclipse安装Eclipse

等待安装完成即可,Eclipse 的默认安装目录为:/usr/lib/eclipse。

在 CentOS 中安装 Eclipse,需要下载安装程序,我们选择 Eclipse IDE for Java Developers 版:

下载后执行如下命令,将 Eclipse 安装至 /usr/lib 目录中:

sudo tar -zxf ~/下载/eclipse-java-mars-1-linux-gtk*.tar.gz -C /usr/lib

解压后即可使用。在 CentOS 中可以为程序创建桌面快捷方式,如下图所示,点击桌面右键,选择创建启动器,填写名称和程序位置(/usr/lib/eclipse/eclipse):

安装Eclipse安装Eclipse

安装 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。

下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载    # 解压到 ~/下载 中
sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/    # 复制到 eclipse 安装目录的 plugins 目录下
/usr/lib/eclipse/eclipse -clean    # 添加插件后需要用这种方式使插件生效

配置 Hadoop-Eclipse-Plugin

在继续配置前请确保已经开启了 Hadoop。

启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。CentOS 需要切换 Perspective 后才能看到,即接下来配置步骤的第二步)。

安装好Hadoop-Eclipse-Plugin插件后的效果安装好Hadoop-Eclipse-Plugin插件后的效果

插件需要进一步的配置。

第一步:选择 Window 菜单下的 Preference。

打开Preference打开Preference

此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。

选择 Hadoop 的安装目录选择 Hadoop 的安装目录

第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other(CentOS 是 Window -> Perspective -> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

切换 Map/Reduce 开发视图切换 Map/Reduce 开发视图

第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。

建立与 Hadoop 集群的连接建立与 Hadoop 集群的连接

在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

最后的设置如下图所示:

Hadoop Location 的设置Hadoop Location 的设置

Advanced parameters 选项面板是对 Hadoop 参数进行配置,实际上就是填写 Hadoop 的配置项(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要进行相应的修改。但修改起来会比较繁琐,我们可以通过复制配置文件的方式解决(下面会说到)。

总之,我们只要配置 General 就行了,点击 finish,Map/Reduce Location 就创建好了。

在 Eclipse 中操作 HDFS 中的文件

配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下图是 WordCount 的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件,无需再通过繁琐的 hdfs dfs -ls 等命令进行操作了。

使用Eclipse查看HDFS中的文件内容使用Eclipse查看HDFS中的文件内容

如果无法查看,可右键点击 Location 尝试 Reconnect 或重启 Eclipse。

Tips

HDFS 中的内容变动后,Eclipse 不会同步刷新,需要右键点击 Project Explorer中的 MapReduce Location,选择 Refresh,才能看到变动后的文件。

在 Eclipse 中创建 MapReduce 项目

点击 File 菜单,选择 New -> Project…:

创建Project创建Project

选择 Map/Reduce Project,点击 Next。

创建MapReduce项目创建MapReduce项目

填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。

填写项目名填写项目名

此时在左侧的 Project Explorer 就能看到刚才建立的项目了。

项目创建完成项目创建完成

接着右键点击刚创建的 WordCount 项目,选择 New -> Class

新建Class新建Class

需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。

填写Class信息填写Class信息

创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。

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);
  }
}

通过 Eclipse 运行 MapReduce

在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:

cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src

没有复制这些文件的话程序将无法正确运行,本教程最后再解释为什么需要复制这些文件。

复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:

WordCount项目文件结构WordCount项目文件结构

点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。

右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。

设置程序运行参数设置程序运行参数

或者也可以直接在代码中设置好输入参数。可将代码 main() 函数的 String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 改为:

// String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
String[] otherArgs=new String[]{"input","output"}; /* 直接设置输入参数 */

设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的 output 文件夹。

WordCount 运行结果WordCount 运行结果

至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。

在 Eclipse 中运行 MapReduce 程序会遇到的问题

在使用 Eclipse 运行 MapReduce 程序时,会读取 Hadoop-Eclipse-Plugin 的 Advanced parameters 作为 Hadoop 运行参数,如果我们未进行修改,则默认的参数其实就是单机(非分布式)参数,因此程序运行时是读取本地目录而不是 HDFS 目录,就会提示 Input 路径不存在。

Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/hadoop/workspace/WordCountProject/input

所以我们要么修改插件参数,要么将配置文件复制到项目中的 src 目录来覆盖参数,才能让程序能够正确运行。

此外,log4j 用于记录程序的输出日记,需要 log4j.properties 这个配置文件,如果没有复制该文件到项目中,运行程序后在 Console 面板中会出现警告提示:

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

虽然不影响程序的正确运行的,但程序运行时无法看到任何提示消息(只能看到出错信息)。

参考资料

  1. 请问输出结果[97;97;98;99;13p[0m这是什么意思啊

  2. #log4j.properties修改
    hadoop.root.logger=WARN, stdout
    #log4j.rootLogger=WARN, stdout
    # hadoop.root.logger=INFO,console 下面三行以下的原文行做了封行#处理
    # 原文 HADOOP_HOME/etc/hadoop hadoop.root.logger=INFO,console

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] – %m%n

    # 以上三行为给原文增加;
    # 以下原文只有一行做了封行#处理

  3. 楼主,我的是16.04的伪分布环境,可以正常启动hadoop,但是运行MapReduce程序报错
    错误: 找不到或无法加载主类 org.apache.hadoop.examples.WordCount
    应该怎么解决呢?谢谢楼主!

      • 是不是我的电脑上没有org.apache.hadoop.examples这个文件包啊?我安装的是hadoop-2.6.4,找不到这个包,要在那里下载呢?

      • 那个问题已经解决,但是在运行WordConut的时候有出现两个警告:
        The constructor Job(Configuration, String) is deprecated
        The import org.apache.hadoop.util.GenericOptionsParser is never used
        是版本的问题吗?我刚学hadoop,问题有点多,还请见谅。

        • deprecated 的意思是说由于api的变动,该api已经弃用,建议使用新的api,不过一般情况下没关系,使用旧的api也可以正常执行。
          never used 的意思是说你引入了这个包,但程序中没有使用到,可以不引入

  4. 请问博主,我在通过你的方法下载eclipse后 把插件放进去以后 也启动了我的Hadoop 也进行了eclipse -clean 但是进去以后为什么没有看到左边的DFS Location,另外我还对eclipse文件夹的权限也进行了修改还是看不到DFS Location。

    • 同样遇到这个问题,反复尝试都没解决,而且下载解压的eclipse不能通过命令行启动

    • eclipse界面右上角有个倒三角,点下可能有用

  5. 您好,我这总是报这个问题windows上面Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

    • 本文教程不一定适合Windows,Windows上应该会有一些其他问题,你得自行搜索解决了。

  6. 楼主你好,我按照你的步骤配置完后(三个配置文件也已经复制到src文件夹下面),程序依然读取的是本地目录。但是我在参数里把input改为:hdfs://localhost:9000/user/hadoop/input之后,就没问题了。但是output也是输出在本地的。这是哪里配置错了么?

  7. 楼主你好,我按照你的教程做了一遍,但是运行没有结果,有3个问题想要问您:
    1、在eclipse上运行完后console窗口的前两行是
    May 19, 2016 4:36:21 PM org.apache.hadoop.mapreduce.lib.input.FileInputFormat listStatus
    INFO: Total input paths to process : 0
    我不清楚INFO: Total input paths to process : 0这是什么意思?还有这个值为0是不是有什么问题啊?
    2、 bin/hadoop fs -put input input 我用这个命令将 input 文件夹里的东西上传到 HDFS 的系统文件夹年,但是Eclipse的 DFS locations 里面的 in 文件下没有东西。
    3、运行完之后系统文件夹下有 out 文件夹,但是 Eclipse 的 DFS locations 里没有 output 文件夹,看不到运行结果。
    我使用的是伪分布式模式。

  8. 你好,博主,如果是完全分布式的方式,eclipse可以远程提交吗,按照这种方式hdfs,设置hdfs连接的时候将localhost设置成集群master的ip是可以的,但是提交job失败,是有什么要注意的地方吗?

  9. 你好,这个问题怎么解决org.apache.hadoop.security.AccessControlException: Permission denied: user=hadoop, access=WRITE, inode="/user/hadoop":root:supergroup:drwxr-xr-x

    • 可以考虑把 hdfs 的权限验证给去掉。在 hdfs-site.xml 中添加一个配置项:

      <property>
      <name>dfs.permissions</name>
      <value>false</value>
      </property>

  10. 楼主你好:
    我在”在 Eclipse 中操作 HDFS 中的文件“ 这步中遇到困难。
    我是hadoop2.7.1 安装插件时 按照github 编译生成 hadoop-eclipse-plugin-2.7.1.jar。
    在New hadoop Location 后 一直提示:
    An internal error occurred during: "Connecting to DFS MapReduceLocation".
    Could not initialize class org.apache.hadoop.hdfs.DFSConfigKeys

    这个是什么原因啊??
    我遇到的问题 和http://markmail.org/message/rwvvriiqwybxrcmz 中的一样。

    • 我没有试过编译这个插件,不过似乎Hadoop版本跟插件版本不对应也可以使用的。建议先试着使用一下已编译好的 hadoop-eclipse-plugin-2.6.0.jar

  11. 按顺序做的一步遇到这个问题了。。是一个集群 一台机子上3个虚拟机。1个Master 。求指导。。
    16/04/26 23:58:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
    16/04/26 23:58:09 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
    16/04/26 23:58:09 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
    Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://Master:9000/user/hadoop/output already exists
    at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
    at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:562)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:432)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
    at org.apache.hadoop.examples.WordCount.main(WordCount.java:67)

    • Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://Master:9000/user/hadoop/output already exists

      出错是 output 文件夹已存在。
      删除 output 出错是因为你路径弄错了,请注意区分相对路径与绝对路径。

      • 可以在eclipse里头直接删除output吗?用命令行那个我没找到output的位置。。

    • Shuffle Errors
      BAD_ID=0
      CONNECTION=0
      IO_ERROR=0
      WRONG_LENGTH=0
      WRONG_MAP=0
      WRONG_REDUCE=0
      File Input Format Counters
      Bytes Read=28401
      File Output Format Counters
      Bytes Written=10883
      这个算运行成功了么 我在eclipse里删掉了output

      • 我是output已经存在。。删掉就可以了 在eclipse哪个dfs目录里

  12. 你好,我的最后结果是:
    Shuffle Errors
    BAD_ID=0
    CONNECTION=0
    IO_ERROR=0
    WRONG_LENGTH=0
    WRONG_MAP=0
    WRONG_REDUCE=0
    File Output Format Counters
    Bytes Written=0
    没有File input Format Counters ,这个是为什么呢?

  13. advance paramters tab页面的一些属性重启eclipse也显示不出来

  14. Exception in thread “main” ExitCodeException exitCode=1: chmod: 无法访问”/usr/local/hadoop/tmp/mapred/staging/zhj0307276773657/.staging/job_local276773657_0001″: 没有那个文件或目录
    求解啊 大哥

    • 1.切换到root权限 输入 su
      2.在root权限下 输入chmod -R 777 /usr/local/hadoop (/usr/local/hadoop是hadoop的安装目录,根据你自己的安装目录修改)

  15. 我也是是hadoop用户下启动的所有服务,打开eclipse安装博主你的顺序来做的,可是为什么我的MapReduce下面是0呢?什么也没有啊

  16. 学长这个怎么解决啊?谢谢,初学。
    Exception in thread “main” org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/hadoop/input

    • 输入文件夹(hdfs://localhost:9000/user/hadoop/input)不存在,需要先上传 input 文件夹到 HDFS 中。

      • 怎么上传 input 文件夹到 HDFS 中啊?您能说的具体一点嘛?谢谢您

      • Exception in thread “main” ExitCodeException exitCode=1: chmod: 无法访问”/usr/local/hadoop/tmp/mapred/staging/bo806358276/.staging/job_local806358276_0001″: 没有那个文件或目录,这个问题怎么解决的,求教一下

        • 权限问题,eclipse没有对文件的write权限,所以需要更改文件权限,使所有用户都能更改文件,步骤如下
          1.切换到root权限 输入 su
          2.在root权限下 输入chmod -R 777 /usr/local/hadoop (/usr/local/hadoop是hadoop的安装目录,根据你自己的安装目录修改)

  17. hadoop@ubuntu:/usr/local/hadoop$ rm -r ./output
    rm: cannot remove ‘./output’: No such file or directory
    hadoop@ubuntu:/usr/local/hadoop$ ./bin/hdfs -rm -r output
    Unrecognized option: -rm
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
    hadoop@ubuntu:/usr/local/hadoop$
    星哥,运行完一次之后我想删除output文件夹,为啥删不掉呢?

  18. 求证博主:WordCount.java代码的第58行 Job job = new Job(conf, “word count”);,在hadoop2.6.0版本提示Job(conf, “word count”)方法已经被废弃,建议改为 Job job = Job.getInstance(conf, “WordCount”);

    • 谢谢指正,你说的是正确的。我看2.6.4版本 examples 代码里用的还是 new Job 的方式,但在2.7.2中已经改为 Job.getInstance 的方式了。方法虽已废弃,但还是可以使用的,当然使用新的方法会更好。

  19. 按教程配置完Hadoop-Eclipse-Plugin,打开eclipse并没有出现dfs location。。难道是因为eclipse是我手动安装的缘故?安装位置都是和教程一样的。

    • 如果你是Unbuntu自带软件下载的eclipse(3.7版本)的话,我建议是卸载掉,从网页上下载4.0版本以上的,安装完成后打开使用。打开时可能会出现错误,提示版本不支持的错误,你按照http://www.linuxidc.com/Linux/2014-08/105090.htm 这个网址的步骤,安装Java7,然后eclipse就可以成功使用了。我也是初学者,希望的办法能够给你帮助。

  20. 给力星,我在’在 Eclipse 中操作 HDFS 中的文件’这个步骤中,没有看到(1)下面的子文件夹,而是提示了这样一个错误Call to localhost/127.0.0.1:9000 failed on local exception: java.io.EOFException ,不知道如何解决,评论也不能上图,想截个图给你看

  21. 博主你好 请问这个问题该怎么解决?我已经按照你的步骤把三个配置文件都复制到 src 但是出现了这个问题
    Exception in thread “main” ExitCodeException exitCode=1: chmod: cannot access ‘/usr/local/hadoop/tmp/mapred/staging/spc728553590/.staging/job_local728553590_0001’: No such file or directory

  22. 给力星您好,我就是按照您所说的安装hadoop,配置环境变量,下载Eclipse的然后运行程序,但是在运行时出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable这个警告,然后结果也没生成,能帮我解决下吗

    • “WARN util.NativeCodeLoader…” 这个 WARN 可以忽略,不影响正常执行(可以通过编译 Hadoop 源代码解决)。结果没生成,是 Console 里没有其他的输出信息了么?那应该是没有复制 log4j.properties 这个文件的原因。

      • 给力星你好,我也是这个问题,util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable这个警告,在HDFS上没办法生成input和output,也就没办法把统计结果写到output上了,我也复制了log4j.properties 这个文件,求解决

        • 这个WARN可以不管,不影响程序执行。需要将 /usr/local/hadoop/etc/hadoop 的 core-site.xml 、 hdfs-site.xml、log4j.properties 复制到 WordCount 项目下的 src 文件夹,并且刷新项目,应该就没有问题了。

          • 给力星你好,我写了一个在HDFS上创建文件夹的文件,为什么在运行后在Eclipse的DFS Location上怎么刷新也刷不出来,但是我用命令行./bin/hdfs dfs -ls /user/hadoop 在命令终端却有我创建的文件夹呢?求解释

          • 已经弄好了,给力星,有时候刷新没用,上网查了下首先在停止hadoop的运行,然后格式化DFS文件系统 ,最后重新将hadoop跑起来 在eclipse中的DFS Location 上reconnect一下刚才创建的就都出现了,但是不知道为什么refresh没反应,怎么刷都不行。

          • 我遇到了同样的问题,不过我过了一小会,再刷新,就看到output文件夹了 (捂脸)

  23. 装完linux再重启 就告诉我the system is running in the low graphic card model我改怎么办。

    • 这是显卡驱动问题。linux对显卡驱动的支出不是很好,可以尝试一下更新显卡驱动。

  24. 楼主你好,我前面的配置都能正常运行,但是到./eclipse -clean时就报错 eclipse.buildId=debbuid org.eclipse.swt.SWTError;No more handles [gtk_init_check() failed]这个怎么解决

  25. 神,我的hadoop伪分布搭建好了,但是配置eclipse时,DFS locations下有个小象,但是再下面就什么都没了,为什么?也咩有报错啊

  26. 5:35:59,266 WARN org.apache.hadoop.util.NativeCodeLoader:62 – Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
    15:36:01,042 WARN org.apache.hadoop.mapreduce.JobResourceUploader:64 – Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
    15:36:01,054 WARN org.apache.hadoop.mapreduce.JobResourceUploader:171 – No job jar file set. User classes may not be found. See Job or Job#setJar(String).

    • 按照博主这篇文章运行了一遍,最后得到的结果是这样,最后控制台没有输出博文中的结果,只有以上警告,但是有了output文件夹,大概是log4j.properties没设置好吧。想知道以上警告需要解决么?最终运行结果是否正确呢?谢谢~

      • 另外log4j.properties文件在hadoop/etc里面有,楼下。。。。

  27. 我在配置eclipse的时候,想配置Advanced parameters发现是空白的,没法进行配置,但是好像不影响程序运行,这是为什么呢

  28. 在hadoop集群基础上在eclipse开发,按照楼主的配置,是要更改Map/Reduce Master的host为本机ip(不能写localhost),端口要为50090

  29. 你好,我在eclipse上执行了WordCount文件,但是在mapreduce执行完毕之后,提示:Application state is completed。FinalApplicationStatus=SUCCEEDED.Redirecting to job history server。之后就报出了拒绝连接的错误,网上说要启动jobHistoryServer,可是启动之后还是这个问题呀!想请问一下,这个该要怎么办呀!拜托啦!

    • 我也遇到了这个问题,你是怎么解决的呀?

  30. 你好,参照楼主的文章虚拟机搭建好了三台分布式集群,在配置eclipse时,出错,可否请教一下这是哪里出错了?error:call from master/192.168.22.135 to localhost:9000 failed on connection exception:java.net.ConnectException:Connection refused

    • First close your eclipse.Second you should start your hadoop ,the problem would be solved.

    • 你好,这个问题解决了吗?我也出现这个问题。

    • 你好,我也出现了这个问题,请问怎么解决的呢

  31. 楼主,你好,我想请教一下,我在eclipse中运行Mapreduce程序,不能在集群环境下运行,只能本地运行,在web端也不能看到运行过程,楼主指点一下吧

  32. 想問一下,我安裝完Eclipse plugins,並按造樓主的步驟一步一步的作,但卻在 Eclipse 中查看HDFS中的文件内容中,Error call from hadoop/127.0.0.1 ,難道是因為我用單機模式的關係嗎?

    • 配置 Hadoop Location 时,要特别注意,Advanced parameters 中的配置要与 Hadoop 当前配置一致,比如使用伪分布式,要修改这几个配置: hadoop.tmp.dir dfs.replication dfs.namenode.name.dir dfs.datanode.data.dir

      • 後來發現是因為hadoop尚未start!已經解決了,THX

  33. 您好,我复制了代码后 所有org.apache.hadoop….的import都找不到,这是为什么呢?the import org.apache.hadoop.mapreduce cannot be resolved

    • 在eclipse中把DFS/usr/hadoop中的output文件夹删除,再运行,我之前也遇到这个。

      • 应该不是这个原因,在运行之前已经确认输出目录不存在,我觉得是这里的原因,WARN mapreduce.JobResourceUploader: No job jar file set. User classes may not be found. See Job or Job#setJar(String).有一个函数叫做setJarByClass,但是在运行这段代码的时候并没有jar存在,在网上找解决方案也没有找到

        • 我按楼主的步骤做的时候,做了2次。第一次到mapreduce出错。可能前面没弄好,第二次我按照楼主之前的步骤一步一步来,就弄好了。你再重新试一下,之前做过一次,再做一次费不了多少时间。

        • conf.set("mapred.jar", "WordCount.jar");其中WordCount.jar项目右键导出即可

  34. 请问org.apache.hadoop.*下的类文件在hadoop2.6.0的哪个jar文件中?是不是还需要单独从官网下载?

    • 楼主的图片显示好像在/usr/local/hadoop/share/hadoop/yarn….内,可我在yarn和yarn/lib中所看到的jar文件跟楼主的jar名称不同。更正一下,我的是hadoop2.7.1

  35. 楼主我的console中的输出结果跟你的不一样, Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=26671 File Output Format Counters Bytes Written=10413其中 File Input Format Counters Bytes Read=26671 File Output Format Counters Bytes Written=10413跟你的结果不一样。我是按照你给的步骤一步一步的配置的。请问我这样是配对的还是配错了呢?

    • 这个没有关系,input文件夹里的东西可能不同。 能出现这个结果,就是配置正确,可以正常运行。

      • 哈哈,我还在担心着呢,听到配正确了真的好开心,谢谢楼主,楼主辛苦了。

        • 补充一下,我是用云计算来做毕业论文。现在是先在虚拟机上建Hadoop,然后在学校买的云计算服务器里搭建。我想用Hadoop来分析数据,并能得到结果。例:假如我想要分析现在网上热门的优衣库事件中,广大网民的观点看法。 假设网民评论数据(很散很杂的数据)已经获取得到,那我应该这么做,才能从数据分析总结出大部分的网民的观点 看法。

  36. 你好,我目前以windows上的eclipse進行開發,但手邊有提供已經安裝好的hadoop cluster,但與windows是在不同網域該如何連結,您上面所說的應該都是hadoop與eclipse都是在同一個網域下,而我現在也只有hadoop master node 的內網位置,這樣該如何處理

  37. 請問我在VMare上安裝hadoop,但我在windows下運行eclipse也是用一樣的方式嗎?

  38. 楼主,你好!我的hadoop是在hadoop用户组hadoop用户下,eclipse在wugang用户组wugang用户下,按照你的配置都没有问题,run as hadoop后出现如下错误,希望得到指导,谢谢(好像是权限的问题,不过我按照网上的一些方法修改权限并没有解决)5/05/20 17:09:17 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable15/05/20 17:09:18 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032Exception in thread “main” org.apache.hadoop.security.AccessControlException: Permission denied: user=wugang, access=EXECUTE, inode=”/tmp/hadoop-yarn”:hadoop:supergroup:drwx—— at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:208) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:171) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6512) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:4140) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:838) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:821) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)

    • 我自己回复下,通过hadoop fs -chown -R 777 /tmp/解决了权限的问题,不知道还有其他方式没有,或者说是不是可以通过修改core-site.xml、hdfs-site.xml等几个配置文件解决这个问题,新手盼望得到指导,谢谢

      • “Exception in thread “main” org.apache.hadoop.security.AccessControlException: Permission denied: user=wugang…”,这确实是权限问题。网上的解决方案是在mapred-site.xml中修改dfs.permissions配置,不过这只适用于旧版(1.x版本)。根据官方文档(http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/DeprecatedProperties.html),这个配置改成了dfs.permissions.enabled,并且应该在hdfs-site.xml中进行配置(http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml)。总之就是在hdfs-site.xml中增加 “dfs.permissions.enabled” 配置,值为 “false” ,你不妨试试~

        • 请问怎么改额 是 vim hdfs-site.xml么?
          我打开之后里面啥也没有啊,说我这是新建的文件夹

      • 我权限问题解决之后,一直在尝试连接,请问你有遇到这个问题吗?15/07/29 16:35:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable15/07/29 16:35:37 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:803215/07/29 16:35:40 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)15/07/29 16:35:42 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)15/07/29 16:35:44 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

    • 请问你那个WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable怎么解决的

  39. 你好,我最近也在学习hadoop,用eclipse编译程序,所以看到了你的文章~我在配置Hadoop-Eclipse-Plugin时,把github中的hadoop2.6.0的jar包放入了eclipse的plugins文件夹,重启eclipse后,Project Explorer中没有 DFS Locations,并且打开preference也没有mapreduce的选项,求助~

    • Github上最新的 hadoop2x-eclipse-plugin 有提供了 2.6.0 的插件包,不过我没测试过。建议你可以试一下 hadoop-eclipse-kepler-plugin-2.2.0.jar 这个包,这个我在 Hadoop 2.6.0 下有测试,是可以用的。

      • 非常感谢!我重新安装了eclipse,把2.2.0的包放到了plugins里边,成功了。就是DFS Location里边只有input文件夹,没有output文件夹,之前已经运行过wordcount程序。

    • 你要确定你放的位置是对的。eclipse有2个plugins目录

    • 把所有可能的插件版本都弄进去,肯定有一个可以,我这么做的