Flink在群集中运行时是否缓存Java类(即不通过IDE)

时间:2017-11-08 15:08:12

标签: apache-flink flink-streaming

我正在使用

运行本地flink群集
./bin/start_local.sh

我通过运行

启动flink作业
./bin/flink run -p 3 lib/myApp.jar <insert command line args here>

这可以按预期工作。但是,如果我要更新我的JAR文件(即 lib / myApp.jar )并重新启动上述作业,我的新JAR似乎不会生效。在这种特殊情况下,我通过重命名字段来更新JAR的架构输出。使用更新的JAR重新启动作业时,作业的输出仍然具有旧字段。

是否有一些需要更新的缓存?这是更新应用程序的正确方法吗?请注意,出于此目的,我现在不关心Savepoints。

谢谢!

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为WebUI仍在使用旧的jar文件。从IDE

重新生成jar文件后,有两种方法

选项#1:

确保在生成工件时,您选择重建选项

enter image description here

然后,使用您使用的命令通过终端再次发送jar文件。

./bin/flink run -p 3 lib/myApp.jar <insert command line args here>

选项#2:使用web UI

提交jar文件

确保在conf.yaml文件

中启用此选项
jobmanager.web.submit.enable: true

然后使用UI中提供的选项

提交您的jar

enter image description here

如果您有任何其他问题,请与我们联系。

答案 1 :(得分:0)

某些作业在您认为已停止时(例如,在ctrl + c之后)不会停止,这又会在您执行新的 run 时产生陈旧的JAR幻觉。执行结果似乎不受您最近打包的代码更改的影响!

防止这种情况发生的最好方法是停止所有相关作业,然后重新运行新的jar。因此,请执行以下操作:

flink list              # lists all job IDs
flink stop <job_id>     # ideally this will work, and no in-flight data is lost
flink cancel <job_id>   # only execute this if previous fails

如果现在运行新的jar,则所有功能都应按预期工作。 请注意,如果您必须取消作业,则有飞行中数据丢失的风险。但在某些情况下,这可能是唯一的方法(如果您的事件源未实现 StoppableFunction