hadoop-jar命令指向本地文件系统



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

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

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

甚至我也尝试将scheme添加到命令中:hadoop jarhdfs://HelloWorld.jar类名(主方法)输入输出

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

p.S:当我的PWD是/home/user/hadoop-2.2.1时,我可以使用"hadoop-jar"运行hadoop-examples.2.1.jar,它在我的本地文件系统中

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_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发行版可以做到这一点

可能,现在回复这个讨论已经太晚了,尽管我没有看到任何公认的答案,所以我想回复这个。今天,我遇到了同样的问题,经过几个小时的努力,我终于解决了这个问题。我发现了"无效罐子"问题的两个原因。

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

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

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

命令如下:'hadoop-jarHelloWorld.jar输入输出'

相关内容

  • 没有找到相关文章

最新更新