1

我有一个有效的 jar,它在另一个运行相同版本的 hadoop 的系统上完美运行,即 hadoop-1.2.1 具有相同的设置。

我能够将 jar 文件放入 hdfs 文件系统并创建输入、输出目录。

但是当我使用命令'hadoop jar HelloWorld.jar classname(main method) input output'时,它会抛出'Invalid jar'错误。在搜索了很长时间可能的解决方案后,我发现该命令是在本地文件系统中搜索 jar,而不是在 hdfs 中搜索。

即使我尝试将方案添加到命令中:hadoop jar hdfs://HelloWorld.jar classname(main method) input output

对此有哪些可能的解决方案?

PS:当我的 PWD 是本地文件系统中的 /home/user/hadoop-1.2.1 时,我可以使用“hadoop jar”运行 hadoop-examples-1.2.1.jar

4

3 回答 3

3

hadoop jar 只运行可以在本地访问的 jar 文件1 . 只是出于好奇 - 这是在hadoop jar命令中查找 jar 的相关来源。

public static void main(String[] args) throws Throwable {
  String usage = "RunJar jarFile [mainClass] args...";

  if (args.length < 1) {
    System.err.println(usage);
    System.exit(-1);
  }

  int firstArg = 0;
  String fileName = args[firstArg++];
  File file = new File(fileName);
  if (!file.exists() || !file.isFile()) {
    System.err.println("Not a valid JAR: " + file.getCanonicalPath());
    System.exit(-1);
  }
  ...
}

1 这适用于我遇到的每个 Hadoop 版本。您的结果可能会有所不同。

于 2013-08-13T18:44:15.490 回答
1

我的 $HADOOP_HOME/bin/hadoop 脚本中的这段代码

'elif [ "$COMMAND" = "jar" ] ; then
CLASS=org.apache.hadoop.util.RunJar'

说,它指向RunJar类。

而且,在 RunJar 你有这个,

/** Run a Hadoop job jar.  If the main class is not in the jar's manifest,
   * then it must be provided on the command line. */
  public static void main(String[] args) throws Throwable {
    String usage = "RunJar jarFile [mainClass] args...";

    if (args.length < 1) {
      System.err.println(usage);
      System.exit(-1);
    }

    int firstArg = 0;
    String fileName = args[firstArg++];
    File file = new File(fileName);
    String mainClassName = null;

    JarFile jarFile;
    try {
      jarFile = new JarFile(fileName);
    } catch(IOException io) {
      throw new IOException("Error opening job jar: " + fileName)
        .initCause(io);
    }

    ------ Other code -------
}

所以,我不确定是否 File file = new File(fileName);真的可以指向 HDFS 路径?

可能是 Hadoop 的 MapR 发行版可以做到这一点。

于 2013-08-14T08:49:37.360 回答
0

可能,虽然我没有看到任何被接受的答案,但现在回复这个讨论为时已晚,所以想回复这个。今天,我遇到了同样的问题,终于经过几个小时的努力,我能够解决它。我发现了“Not a valid Jar”问题的两个原因。

  1. 当我们从 HDFS 引用 Jar 时,它会给出这个错误。我在本地文件系统中更改了对 jar 文件的引用,它工作正常。我的理解是不需要将Jar文件放在HDFS中。'hadoop jar HelloWorld.jar(参考本地文件系统)类名(主方法)输入输出'

  2. 当您创建 Jar 文件并在创建 Jar 文件时定义 Main-Class 时,您不需要在命令中定义类名。

'hadoop jar HelloWorld.jar 类名(main 方法-如果您在创建 jar 文件时已经定义了 Main-Class,则不需要)输入输出'

以下将是命令:'hadoop jar HelloWorld.jar 输入输出'

于 2014-01-25T15:50:34.980 回答