我有一个有效的jar,它在运行相同版本的hadoop的另一个系统上完美运行,即具有相同设置的hadoop-1.2.1。
我能够将jar文件放在hdfs文件系统中并创建输入,输出目录。
但是当我使用命令'hadoop jar HelloWorld.jar classname(main method)输出'时,它会抛出'Invalid jar'错误。在长时间搜索可能的解决方案之后,我发现该命令正在本地文件系统中搜索jar而不是在hdfs中搜索。
即使我尝试将方案添加到命令中: hadoop jar hdfs://HelloWorld.jar classname(main方法)输入输出
有什么可能的解决方案?
P.S:当我的PWD是/home/user/hadoop-1.2.1(我的本地文件系统中)时,我可以使用'hadoop jar'运行hadoop-examples-1.2.1.jar
答案 0 :(得分:3)
hadoop jar
只运行您可以在本地访问 1 的jar文件。只是为了好奇 - 这是在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版本都是如此。您的结果可能会有所不同。
答案 1 :(得分: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发布可以做到这一点。
答案 2 :(得分:0)
虽然我没有看到任何已接受的答案,所以想回复这个问题,但回复此讨论为时已晚。今天,我遇到了同样的问题,经过几个小时的努力,我能够解决它。我找到了“不是有效的罐子”问题的两个原因。
当我们从HDFS引用Jar时,会出现此错误。我在本地文件系统中更改了对jar文件的引用,并且它正常工作。我的理解是,不需要将Jar文件放入HDFS。 'hadoop jar HelloWorld.jar(请参阅本地文件系统)classname(main方法)输入输出'
在创建Jar文件并在创建Jar文件时定义Main-Class时,您无需在命令中定义classname。
'hadoop jar HelloWorld.jar classname(main方法 - 如果你已经在创建jar文件时定义了Main-Class,则不需要这样做)输入输出'
以下将是命令: 'hadoop jar HelloWorld.jar输入输出'