如何通过在 Apache Flink 中使用上传的 jar 来提交作业?

Posted

技术标签:

【中文标题】如何通过在 Apache Flink 中使用上传的 jar 来提交作业?【英文标题】:How to submit a job, by using an uploaded jar in Apache Flink? 【发布时间】:2018-01-17 14:15:03 【问题描述】:

我已经通过 curl 的 HTTP Post 请求将一个 jar(通过字数统计 java 程序生成)上传到 Apache Flink Web 控制台,get jars api 会显示上传的 jar。

当我尝试使用该 jar 提交作业时,它会抛出此错误:

引起:org.apache.flink.client.program.ProgramInvocationException: JAR 文件不存在 '/tmp/flink-web-8aa36f99-87fb-4fbc-b155-237fd833fc32/:949611ce-345a-4cd5-986b-8ff9b0700852_WordCount.jar'

这就是我的 POST 请求的样子:

http://localhost:8081/jars/:949611ce-345a-4cd5-986b-8ff9b0700852_WordCount.jar/run

我关注了他们的官方docs 供参考。我哪里错了?任何帮助都将不胜感激。

【问题讨论】:

【参考方案1】:

确保 jar 文件位于您的临时目录中。路径中有':',对吗?

我最近在学习 REST API,并通过 POST 请求成功提交了我的作业

http://host:port/jars/29525e98-3ece-49c1-85d1-5301a5a38900_myjob.jar/run?allowNonRestoredState=false&entry-class=&parallelism=&program-args=&savepointPath=

您还可以通过 Flink Dashboard 提交作业,并通过 Chrome DevToos 在网络选项卡(或类似的东西)检测正确的 url

【讨论】:

谢谢,我会试试这个并回复你。根据我上面在问题中提到的文档,说要在 jar id 之前添加一个: 我尝试了您的上述请求参数,但仍然向我抛出错误。我继续检查 tmp/flink-web-8aa36f99-87fb-4fbc-b155-237fd833fc32/ 目录,jar 确实存在。 您是否从路径中删除了 ':' 并且仍然出现错误?显然 /jars/:jarid/run 中的 ':jarid' 只是真实案例的模板。 是的,我这样做了,一旦我这样做了,它就会引发另一个错误:Could not run the jarNeither a 'Main-Class', nor a 'program-class' entry was found in the jar file。但是后来我在创建 jar 时指定了主类,当我通过 cli 运行它时它可以完美运行。 现在它找到了 jar 并且似乎是 jar 文件的问题。检查 jar 中的 META-INF/MANIFEST.MF 文件是否包含“Main-Class”(您可能应该在 maven-shade-plugin 中设置)。您的 jar 是否通过 Flink Dashboard 成功提交?如果是这样,只需查看通过浏览器 DevTools 发送的 http 请求

以上是关于如何通过在 Apache Flink 中使用上传的 jar 来提交作业?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Flink 任意 Jar 包上传致 RCE 漏洞复现

Apache Flink 任意jar包上传漏洞

复现CVE-2020-17518——Apache Flink upload 远程命令执行漏洞

Apache Flink:如何计算 DataStream 中的事件总数

如何提供 Apache Flink DataStream

Apache-Flink 1.11 无法在 Java Flink Streamming Job 中通过 SQL Function DDL 使用 Python UDF