Flink:如何使用稀罐而不是胖罐?

时间:2018-10-03 10:11:47

标签: java apache-flink uberjar

我们当前正在使用maven-shade-plugin将Flink应用程序部署为胖子。问题是,每个应用程序jar最终大约需要130-140 MB,这使得每次构建和部署都很麻烦。有没有一种方法可以排除依赖关系,而只需将一个精简的jar部署到群集中,容量大约为50 kB?

2 个答案:

答案 0 :(得分:3)

您可以预先在Flink的lib中将依赖关系JAR放置在集群中(请参阅Avoid Dynamic Classloading),并在每次作业提交时上载精简JAR。

答案 1 :(得分:1)

这就是我们使用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任务以构建一个没有任何provided依赖项的jar

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'
  }
}

结果是一个捆绑了{em>必需依赖(jar)的compile,然后我们使用Web UI进行部署。

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

最后,在我们的特殊情况下,我们的作业和运行时依赖项之间没有定义直接依赖项(通过反射来发现)。