【问题标题】:How to use a thin jar instead of a fat jar?如何使用薄罐而不是肥罐?
【发布时间】:2018-10-03 10:11:47
【问题描述】:

我们目前正在使用 maven-shade-plugin 将 Flink 应用程序部署为 fat-jar。问题是,每个应用程序 jar 最终大约为 130-140 MB,每次构建和部署都很痛苦。有没有办法排除依赖关系,只需将一个瘦 jar 部署到大约 50 kB 的集群中?

【问题讨论】:

  • 是的,只是没有任何依赖(除了 flink 核心依赖),那么你的 fat-jar 会更小。如果您有所需的依赖项,则需要包含它们。否则它们会如何进入 flink 容器?

标签: java apache-flink uberjar


【解决方案1】:

您可以在 Flink 的lib(参见Avoid Dynamic Classloading)中预先将依赖项 JAR 放在集群中,然后在每次作业提交时上传精简 JAR。

【讨论】:

  • 我可以从 fat jar 文件中删除我的所有类,然后将其放入 lib 目录,然后使用我的瘦 jar 文件启动 Flink 吗?
【解决方案2】:

这是我们使用 Gradle 的方法!

我们有两个子项目:

  • job:对于我们要运行的流作业
  • runtime:对于其他运行时依赖项(例如自定义 FileSystem 实现)

我们为在运行时提供的依赖项创建一个新的gradle配置

configurations {
  provided,
  compile.extendsFrom provided
}

然后将提供的依赖标记为:

provided("org.apache.flink:flink-java:1.6.0")  // flink java v1.6.0

然后,我们修改jar任务来构建一个jar没有任何provided依赖

jar {
  dependsOn configurations.runtime
  from {
    (configurations.runtime - configurations.provided).collect {
      it.isDirectory()? it : zipTree(it)
    }
  } {
    exclude 'META-INF/*.RSA'
    exclude 'META-INF/*.SF'
    exclude 'META-INF/*.DSA'
  }
  manifest {
    attributes 'Main-Class': 'com.example.Entrypoint'
  }
}

结果是 jar必需 依赖项 (compile) 捆绑在一起,然后我们使用 Web UI 进行部署。

至于自定义运行时依赖,我们构建了一个自定义的Docker镜像,并将构建的工件(runtime.jar,使用与上面相同的配置构建)推送到Flink中的libs/目录。如果您不使用 Docker,也可以手动执行此操作。

最后,在我们的特殊情况下,在我们的作业和运行时依赖关系(使用反射发现)之间没有定义直接依赖关系

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多