如何从HDFS文件系统中执行hadoop jar命令?

3

我总是按照以下方式从本地文件系统执行作业

hadoop jar /home/usr/jar/myjar.jar com.test.TestMain 

我应该如何执行同样的命令,但是myjar.jar文件存在于HDFS中?
类似以下命令:
hadoop jar hdfs:///home/usr/jar/myjar.jar com.test.TestMain 

当然,这并不起作用...
2个回答

7
hadoop fs -copyToLocal hdfs:///home/usr/jar/myjar.jar /tmp/myjar.jar && hadoop jar /tmp/myjar.jar com.test.TestMain 

很棒的技巧:-),谢谢。虽然它可能会有各种问题——每次执行都要下载,清理,使用不同参数运行多个聚合... - Julias
2
从技术上讲,本地文件不必称为myjar.jar。您可以使用/dev/urandom(使用不同参数的情况)生成临时目录/文件名,并立即删除它(清理)。Java不关心jar是否不存在。这是一个hack,但它可以避免手动挂载hdfs的所有麻烦(fstab挂载发生在启动时,而不是hdfs的情况-在更晚的时间和潜在的安全模式下)。 - Ion Cojocaru

2

查看执行Hadoop jar文件的bin/hadoop脚本时,它使用了以下条件--

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

这句话说它使用RunJar类来执行jar文件。 如果你看到了RunJar类,支持的参数为--。
RunJar jarFile [mainClass] args...

在RunJar类中,可以使用以下代码访问jarFile--

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

因此,fileName指向jarFile,因此在我看来,fileName不能像上面所见那样是HDFS路径,除非您能够以某种方式将HDFS挂载到文件系统中,以便Java File类可以访问它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接