【问题标题】:Flink Job submission throws java.nio.file.NoSuchFileException while the file actually exists当文件实际存在时,Flink Job 提交抛出 java.nio.file.NoSuchFileException
【发布时间】:2021-12-10 09:59:58
【问题描述】:

我尝试提交一个已经打包在 JAR 中的 flink 作业。基本上它使用一个受 SASL 身份验证保护的 kafka 主题,因此它需要一个 .jks 文件,我已经将它们包含在 JAR 中并在代码中读取为:

try(InputStream resourceStream = loader.getResourceAsStream(configFile)){
        properties.load(resourceStream);
        properties.setProperty("ssl.truststore.location",
            loader.getResource(properties.getProperty("ssl.truststore.location")).toURI().getPath());
      }

catch(Exception e){
        System.out.println("Failed to load config");
      }

为了测试,我尝试在两个不同(不同的 VM 规格)独立服务器上提交作业。一台服务器成功运行,但另一台服务器抛出java.nio.file.NoSuchFileException,说找不到我的 .jks 文件。有人可以指出可能的问题吗?

这里flink部署在standalone集群模式,版本如下:

  • Flink 版本:1.14.0
  • Java 版本:11.0.13

【问题讨论】:

  • 你需要展示你是如何阅读文件的
  • 请包含显示用于>打开
  • 对不起。是的,你是正确的斯蒂芬。我实际上认为使用 .toUri().getPath() 将解析为正确的路径,但它返回 null。因此,正在使用的配置是从原始配置文件加载的配置,这就是为什么解析为相对路径的原因。再次为这个愚蠢的问题道歉。

标签: java apache-flink


【解决方案1】:

我意识到我的问题真的很愚蠢。这部分实际上返回null并触发异常。

loader.getResource(properties.getProperty("ssl.truststore.location")).toURI().getPath()

问题是我通过 Web UI 提交作业,因此我看不到打印的消息。因此,文件名解析为存储在 configFile 下的原始文件名,这是一个相对路径。为什么一台机器可以工作而另一台机器不行?因为我以前不知何故在我的 homedir 上有 .jks 进行另一次测试:)。

为了让其他人不要陷入这个错误,这里是 .getResource() 分别从 IDE(gradle 运行任务)和 jar 运行时将解决的问题的摘要。

//      file:home/gradle-demo/build/resources/main/kafka-client.truststore.jks
//      jar:file:home/gradle-demo/build/libs/gradle-demo-1.0-SNAPSHOT.jar!/kafka-client.truststore.jks
      System.out.println(loader.getResource("kafka-client.trustore.jks").toString());

//      home/gradle-demo/build/resources/main/kafka-client.truststore.jks
//      file:home/gradle-demo/build/libs/gradle-demo-1.0-SNAPSHOT.jar!/kafka-client.truststore.jks
      System.out.println(loader.getResource("kafka-client.trustore.jks").getPath());

//      home/gradle-demo/build/resources/main/kafka-client.truststore.jks
//      null
      System.out.println(loader.getResource("kafka-client.trustore.jks").toURI().getPath());

//      file:home/gradle-demo/build/resources/main/kafka-client.truststore.jks
//      jar:file:home/gradle-demo/build/libs/gradle-demo-1.0-SNAPSHOT.jar!/kafka-client.truststore.jks
      System.out.println(loader.getResource("kafka-client.trustore.jks").toURI());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2016-07-29
    • 2016-06-05
    • 1970-01-01
    • 2022-10-23
    • 2021-11-18
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多