【问题标题】:Does Flink cache Java classes when running in Cluster (i.e. not via an IDE)Flink 在集群中运行时是否缓存 Java 类(即不通过 IDE)
【发布时间】:2018-12-13 04:33:42
【问题描述】:

我正在使用

运行本地 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 重新启动作业时,作业的输出仍然具有旧字段。

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

谢谢!

【问题讨论】:

  • 如果使用maven,你试过“mvn clean package”吗?
  • 我正在使用 gradle。我首先做了 gradle clean 。还是不行。

标签: apache-flink flink-streaming


【解决方案1】:

这是因为 WebUI 仍在使用旧的 jar 文件。从 IDE 重新生成 jar 文件后有两种方法

选项#1:

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

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

./bin/flink run -p 3 lib/myApp.jar &lt;insert command line args here&gt;

选项#2:使用web UI提交jar文件

确保您在conf.yaml 文件中启用了此选项

jobmanager.web.submit.enable: true

然后使用 UI 中可用的选项提交您的 jar

如果您还有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    当您认为某些作业停止时(例如在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多