我们当前正在使用maven-shade-plugin将Flink应用程序部署为胖子。问题是,每个应用程序jar最终大约需要130-140 MB,这使得每次构建和部署都很麻烦。有没有一种方法可以排除依赖关系,而只需将一个精简的jar部署到群集中,容量大约为50 kB?
答案 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,也可以手动进行操作。
最后,在我们的特殊情况下,我们的作业和运行时依赖项之间没有定义直接依赖项(通过反射来发现)。