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

hadoop jar命令指向本地文件系统,hadoop,jar,mapreduce,Hadoop,Jar,Mapreduce,我有一个有效的jar,它在另一个运行相同版本hadoop的系统上完美运行,即hadoop-1.2.1,具有相同的设置 我能够将jar文件放在hdfs文件系统中,并创建输入、输出目录 但是当我使用命令“hadoop jar HelloWorld.jar classnamemain method input output”时,它抛出“Invalid jar”错误。在搜索了很长一段时间可能的解决方案之后,我发现该命令是在本地文件系统中搜索jar,而不是在hdfs中搜索 甚至我也尝试将scheme添加到

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

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

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

甚至我也尝试将scheme添加到命令中,如下所示: hadoop jarhdfs://HelloWorld.jar classnamemain方法输入输出

有什么可能的解决办法

注意:当我的PWD为/home/user/hadoop-1.2.1时,我可以使用“hadoop-jar”运行hadoop-examples-1.2.jar,它位于我的本地文件系统中

hadoop-jar只运行您可以本地访问的jar文件1。出于好奇,以下是在hadoop jar命令中查找jar的相关源代码

1对于我遇到的每一个Hadoop版本来说都是如此。您的结果可能会有所不同。

hadoop jar只运行您可以在本地访问的jar文件1。出于好奇,以下是在hadoop jar命令中查找jar的相关源代码


1对于我遇到的每一个Hadoop版本来说都是如此。您的结果可能会有所不同。

这段代码在我的$HADOOP\u 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=newfilefilename;实际上可以指向HDFS路径吗


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

这段代码在我的$Hadoop\u 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=newfilefilename;实际上可以指向HDFS路径吗


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

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

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

当您在创建Jar文件时创建Jar文件并定义Main类时,您不需要在命令中定义classname

'hadoop jar HelloWorld.jar classnamemain方法如果在jar文件创建输入输出时已经定义了主类,则不需要此方法'

以下是命令:
“hadoop jar HelloWorld.jar input output”

也许现在回复这个讨论已经太晚了,尽管我没有看到任何被接受的答案,所以我想回复这个。今天,我遇到了同样的问题,经过几个小时的努力,终于解决了。我发现了两个问题的原因不是一个有效的Jar

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

当您在创建Jar文件时创建Jar文件并定义Main类时,您不需要在命令中定义classname

'hadoop jar HelloWorld.jar classnamemain方法如果在jar文件创建输入输出时已经定义了主类,则不需要此方法'

以下是命令:
“hadoop jar HelloWorld.jar输入输出”

HelloWorld.jar保留在本地系统而不是HDFS中-为什么要将其存储在HDFS中?@JtheRocker您能指出一些说明hadoop jar从本地系统中拾取jar的文档吗?我总是在hdfs上加载我的jar并运行,它工作得很好。但是我的本地路径上的jar也有相同的路径,所以它可能会选择本地路径,而不是像我一样选择hdfs上的路径assumed@SuvP当前位置请检查我的答案,如果有帮助的话。我尝试了所有方法,伙计们…请帮忙,我被困了很长一段时间了。nowHelloWorld.jar在本地系统中,而不是在HDFS中-为什么要将它存储在HDFS中?@JtheRocker你能指出一些文档,其中说hadoop jar从本地系统中选择jar吗?我总是在hdfs上加载我的jar并运行,它工作得很好。但是我的本地路径上的jar也有相同的路径,所以它可能会选择本地路径,而不是像我一样选择hdfs上的路径assumed@SuvP当前位置如果有帮助,请检查我的答案。我尝试了所有方法,伙计们…请帮助,我被困了很长时间。是的,我看到了这个代码。但是hadoop-1.2。
1可以在另一个系统中完美运行,它是从hdfs而不是本地文件系统获取的。”hadoop jar HelloWorld.jar…'正在从/user/username(hdfs主目录)获取它,但在我的系统中,相同的命令正在/home/username(我当前的工作目录)中搜索jar。有趣。我现在目瞪口呆。但是怎么做呢?我也很好奇。@user2672952这是什么其他系统?另一个系统也在伪分布式模式下运行hadoop-1.2.1,jar位于/user/username中,在HDFSINPUTDIR as/user/username/input和outputdir as/user/username/output您是如何在命令行上调用它的,您能否验证您没有意外地在本地文件系统上创建/user/username/目录的?是的,我看到了这段代码。但hadoop-1.2.1可以在另一个系统中完美运行,它是从hdfs而不是本地文件系统中获取的hadoop jar HelloWorld.jar…'正在从/user/username(hdfs主目录)获取它,但在我的系统中,相同的命令正在/home/username(我当前的工作目录)中搜索jar。有趣。我现在目瞪口呆。但是怎么做呢?我也很好奇。@user2672952这是什么其他系统?另一个系统也在伪分布式模式下运行hadoop-1.2.1,jar位于/user/username中,在hdfs中,inputdir作为/user/username/input和outputdir作为/user/username/output您是如何在命令行上调用它的,您能否验证您没有意外地在本地文件系统上创建/user/username/目录?