【问题标题】:how to run a class from java jar file on Hadoop?如何从 Hadoop 上的 java jar 文件运行一个类?
【发布时间】:2017-08-18 11:28:13
【问题描述】:

我有一个从 Eclipse 导出的 jar 文件(可运行的 JAR>>将所需的库复制到子文件夹中)。

在java中如果你在manifest.xml中设置主类你可以运行:

java -jar MyTest.jar arguments

如果你想在 jar 文件中运行另一个主类,或者如果你没有在 manifest.xml 中设置主类,你可以运行:

java -cp MyTest.jar MyOtherMainClass arguments

在 Hadoop 中,如果在 manifest.xml 中设置了主类,您可以运行:

hadoop jar MyTest.jar arguments

如果你输入:

hadoop jar MyTest.jar MyOtherMainClass arguments

它会将 MyOtherMainClass 视为 jar 原始主类的“args”数组中的参数(而不是要运行的类)。

现在如果你想在 jar 文件中运行另一个主类,你会输入什么?

我希望类似:

hadoop java -cp MyTest.jar MyOtherMainClass arguments

但这给出了:

Error: Could not find or load main class java

注意:如果我从“hadoop java -cp MyTest.jar MyOtherMainClass arguments”中删除“hadoop”,它将正常启动

【问题讨论】:

    标签: eclipse hadoop jar classpath mainclass


    【解决方案1】:

    问题来自 Eclipse 强制您在 jar 文件中设置主类,从而阻止您运行所需的类。您所要做的就是从 jar 文件的 manifest.xml 文件中删除主类并运行:

    hadoop jar MyTest.jar MyOtherMainClass arguments
    

    看这里: http://www.roman10.net/2012/07/26/specify-the-main-class-in-a-jar-file-for-hadoop/

    我输入了相同的文本以防 url 被删除:

    Hadoop 支持执行 jar 文件。对于普通java执行的可执行jar文件,可以在命令行中指定主类,如我上一篇文章所述:在jar文件中的主类之间切换。

    但是,使用 hadoop 运行的可执行 jar 文件的规则有些不同。基本上以下规则成立(我在 Hadoop 1.0.3 上测试过),

    如果 jar 文件包含在其清单文件中指定的主类,即使命令指定了另一个主类,hadoop 也会采用主类。这与普通的 java 执行不同,我们可以指定一个主类来覆盖清单文件中的那个。 如果 jar 文件在 manifest 文件中不包含主类,hadoop 允许我们指定主类。 在 Eclipse 中,当将项目导出为可运行的 jar 文件时,它总是在 Launch 配置时要求一个主类。

    选择的主类将被放入清单文件中。以下是我的 helloworld 项目中 META-INF/MANIFEST.MF 文件的内容,其中主类设置为 HelloWorld。

    清单版本:1.0 类路径:. 主类:hello.HelloWorld 可以使用文件提取器浏览 jar 文件,使用文件编辑器打开清单文件,只需删除最后一行即可删除主类配置,并在出现提示时将更改保存到 jar 文件中。这将创建一个没有主类的可运行 jar 文件。

    修改后的 jar 文件可以通过用户提供的主类配置在 Hadoop 中使用,如下面的示例命令所示,

    $ hadoop jar hello.jar hello.HelloWorld

    【讨论】:

    • 嗨,我有一个非常愚蠢的问题,我有存货。我在本地有一个简单的(只是打印 hello world).class 文件,我可以将它转换为 .jar 并在本地运行它,没有问题。但是,当我将它放在我的 hadoop 集群中时,我遇到了一个愚蠢的错误:JAR 不存在或不是普通文件:/usr/reihan/test.jar 我还应该提到我可以运行 hadoop-builtin-examples 之类wordcount 没有问题,但是当我想运行自己的 jar 时,我遇到了这个问题。有什么想法吗?
    • 首先,检查您是否正确生成了jar文件,建议使用eclipse为您生成它。其次,尝试使用你的jar文件的完整路径,并在之前尝试看看它是否已经放在HDFS中。第三,尝试在清单文件中设置主类(如果它不存在)。最后,如果它不起作用,请在评论中写下您正在使用的命令以及指向您的 jar 文件的链接,以便我查看。
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-02-17
    • 1970-01-01
    • 2015-05-30
    • 2011-04-30
    相关资源
    最近更新 更多