Hadoop Process从Java Code开始

时间:2014-07-05 18:38:05

标签: java hadoop

我目前正在尝试在Java代码中启动Apache Hadoop作业。在我提出问题之前,我想提供一些有关我的代码和工作环境的信息。

由于我正在开发环境(Ubuntu 14.04,Eclipse Kepler,OpenJDK v7),我已经在独立模式下设置了Hadoop。详细地说,我只在.bashrc文件中进行了以下更改:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

export HADOOP_INSTALL=/home/db2inst1/hadoop

export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin

因此,我得到的终端输出如下:

db2inst1@rethimno:~$ which hadoop
/home/db2inst1/hadoop/bin/hadoop
db2inst1@rethimno:~$ hadoop version
Hadoop 1.2.1
Subversion https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152
Compiled by mattf on Mon Jul 22 15:23:09 PDT 2013
From source with checksum 6923c86528809c4e7e6f493b6b413a9a
This command was run using /home/db2inst1/hadoop/hadoop-core-1.2.1.jar
db2inst1@rethimno:~$ 

转向我的Java代码(我在Eclipse IDE中调用)如下:

import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;


public class ProcessSpanwer {

    public static void main(String[] args) throws IOException, InterruptedException {
        String[] command = {"hadoop", "version"};
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true);
        processBuilder.redirectOutput(Redirect.INHERIT);
        Process p = processBuilder.start();
        p.waitFor();
    }

}

您可以理解,上面的代码只是一些示例代码,用于测试我是否可以通过Java启动Hadoop作业。我从执行中收到的输出如下:

Exception in thread "main" java.io.IOException: Cannot run program "hadoop": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
    at ProcessSpanwer.main(ProcessSpanwer.java:12)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
    ... 1 more

对我来说很明显,JVM无权访问环境变量$HADOOP_INSTALL和更新的$PATH变量。我已经通过Java代码打印出环境变量来验证。

因此,我的问题是我需要做什么才能:

  1. 通过JVM使Hadoop可见
  2. 将Hadoop Classpath(jar库)提供给我的Java代码
  3. 感谢您的时间。

1 个答案:

答案 0 :(得分:1)

.bashrc是终端配置,是特定于用户的。

似乎当你从eclipse运行java程序时,它使用系统范围的配置。因此,该程序没有看到Hadoop。但是,您的终端程序可以看到Hadoop,因为您的终端已配置为Hadoop

您可以使用Hadoop脚本的完整路径,例如/usr/local/hadoop/bin/hadoop,也可以对.bashrc/etc/profile文件进行相同的更新。这应该可以解决我的问题。

question详细说明了.bashrc/etc

之间的区别

PS:您可以使用System.getenv() checkout详细访问环境变量。