【问题标题】:Apache Flink - org.apache.flink.client.program.ProgramInvocationExceptionApache Flink - org.apache.flink.client.program.ProgramInvocationException
【发布时间】:2016-09-24 00:14:04
【问题描述】:

我已经使用 Scala 2.11.7 创建了一个带有 Apache FLink 1.0.3 的应用程序,我想在本地测试它(单个 jvm)。所以我按照网站上的说明做了以下操作:

./bin/start-local.sh
tail log/flink-*-jobmanager-*.log

它启动得很好,我可以在 localhost:8081 看到 Web 界面。 然后,我尝试提交我的申请,但我收到异常或奇怪的消息。例如,当我键入以下任一命令时:

./bin/flink run ./myApp.jar
./bin/flink run ./myApp.jar -c MyMain
./bin/flink run ./myApp.jar -c myMain.class
./bin/flink run ./myApp.jar -c myMain.scala
./bin/flink run ./myApp.jar -c my.package.myMain
./bin/flink run ./myApp.jar -c my.package.myMain.class
./bin/flink run ./myApp.jar -c my.package.myMain.scala

我得到以下异常:

------------------------------------------------------------
 The program finished with the following exception:

org.apache.flink.client.program.ProgramInvocationException: Neither a 'Main-Class', nor a 'program-class' entry was found in the jar file.
    at org.apache.flink.client.program.PackagedProgram.getEntryPointClassNameFromJar(PackagedProgram.java:571)
    at org.apache.flink.client.program.PackagedProgram.<init>(PackagedProgram.java:188)
    at org.apache.flink.client.program.PackagedProgram.<init>(PackagedProgram.java:126)
    at org.apache.flink.client.CliFrontend.buildProgram(CliFrontend.java:922)
    at org.apache.flink.client.CliFrontend.run(CliFrontend.java:301)
    at org.apache.flink.client.CliFrontend.parseParameters(CliFrontend.java:1192)
    at org.apache.flink.client.CliFrontend.main(CliFrontend.java:1243)

当我键入以下任一命令时:

./bin/flink run ./ -c myMain myApp.jar
./bin/flink run ./ -c myMain.class myApp.jar
./bin/flink run ./ -c myMain.scala myApp.jar
./bin/flink run ./ -c my.package.myMain myApp.jar
./bin/flink run ./ -c my.package.myMain.class myApp.jar
./bin/flink run ./ -c my.package.myMain.scala myApp.jar

我收到以下错误:

JAR file is not a file: .

Use the help option (-h or --help) to get help on the command.

上述命令不适用于 -c 或 --class。我使用 IntelliJ,并使用 Build Module from Dependencies 选项编译了应用程序。我做错了什么?

【问题讨论】:

  • 会不会是myApp.jar 不包含MyMain 类?您能否运行jar -tf myApp.jar 并验证它是否包含上述类以及该类是否包含main 方法?
  • 我使用了你提到的命令,但由于一个奇怪的原因,我找不到我创建的任何类。为什么会这样?
  • 我使用 WinRar 打开 jar 并查看其内容,我可以找到我项目的每个类,我可以找到 MyMain.class 和 MyMain$.class
  • 可能是jar 命令无法正确列出内容的问题。这可能表明您的 jar 文件已损坏。
  • 对不起,我之前的评论不正确。我终于可以用你提供的命令找到我的主类了。我很确定 jar 文件没有损坏。

标签: scala apache-flink


【解决方案1】:

提交 JAR 的正确方法是:

bin/flink run -c my.package.myMain myApp.jar

您必须在 JAR 文件之前指定参数(如 -c)。您最初收到错误消息,因为 ./ 被解释为 JAR,而该行的其余部分被忽略了。

-p 参数是可选的。您的最后一个示例有效,因为参数顺序是正确的,而不是因为并行标志。

【讨论】:

    【解决方案2】:

    我知道出了什么问题。 Flink 需要将并行度作为参数传递,否则会出现程序调用异常。下面的命令对我有用:

    ./bin/flink run -p2 --class myMain myApp.jar
    

    【讨论】:

      【解决方案3】:

      你必须在你的 pom 文件中提到入口点类。 在 pom 文件 sn-py 中查看以下部分

      <transformers>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
      <mainClass>com.xyz.myMain</mainClass>
      </transformer>
      </transformers>

      请检查下面的sn-p。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多