【问题标题】:hadoop jar command points to local filesystemhadoop jar 命令指向本地文件系统
【发布时间】:2013-08-15 12:10:39
【问题描述】:

我有一个有效的 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) 输入输出

对此有什么可能的解决方案?

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

【问题讨论】:

  • HelloWorld.jar 保留在本地系统而不是 HDFS - 为什么将它存储在 HDFS 中?
  • @JtheRocker 你能指出一些文件说hadoop jar 从本地系统中挑选罐子吗?我总是在 hdfs 上加载我的 jar 并运行,它工作正常。但是我的本地路径上的 jar 也有相同的路径。所以它可能会选择本地路径,而不是 hdfs 上的路径(如我所料)
  • @SuvP:如果有帮助,请检查我的回答。
  • 我什么都试过了......请帮忙,我现在卡了很长时间

标签: hadoop jar mapreduce


【解决方案1】:

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 版本都是如此。您的结果可能会有所不同。

【讨论】:

  • 是的,我看过这段代码。但是在另一个系统中完美运行的 hadoop-1.2.1 是从 hdfs 而不是从本地文件系统中获取的。 'hadoop jar HelloWorld.jar ...' 正在从 /user/username 中获取它,这是 hdfs 主目录,但在我的系统中,相同的命令正在搜索 /home/username 中的 jar,这是我当前的工作目录。跨度>
  • 有趣。我现在傻眼了。但是怎么做?我也很好奇。
  • @user2672952 这是什么其他系统?
  • 另一个系统也在伪分布式模式下运行hadoop-1.2.1,jar在/user/username,inputdir为/user/username/input,outputdir为/user/username/output在 hdfs 中
  • 您是如何在命令行中调用它的,您能否确认您没有在本地文件系统上意外创建/user/username/ 目录?
【解决方案2】:

我的 $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 发行版可以做到这一点。

【讨论】:

    【解决方案3】:

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

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

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

    'hadoop jar HelloWorld.jar classname(main method-如果你在jar文件创建时已经定义了Main-Class则不需要这个)输入输出'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多