每个人。我试图在 Flink 中引用我的公司 jar,将其复制到所有任务管理器中的 $FLINK/lib 中,但失败了。而且我不想打包一个胖罐子,太重了,浪费时间。我认为第一种方法也不是一个好主意,因为我必须管理整个集群中的 jars。任何人都知道如何解决这个问题?任何建议将不胜感激。
3 回答
一般来说,建造一个胖罐子是最好的方法。不确定您的远罐有多大,您认为它“太重”?
将罐子复制到$FLINK/lib
应该可以工作。但是,您需要重新启动 Flink,以便将 jars 添加到 Flink 的类路径中。因此,这种方法不允许动态添加罐子——但是它应该适用于一堆稳定的罐子。
为了管理整个集群中的 jar,使用 NFS 文件夹$FLINK/lib
来保持所有 TaskManager 同步可能会有所帮助。或者您只需编写一个 bash 脚本来分发您的 jar。
Flink 的命令行界面 (CLI) 允许使用 -C 选项传递额外的 jar 位置路径。我们使用它将依赖项传递给每个作业。
我们的问题:鉴于我们的作业通常在整个项目生命周期中不断发展,并且它们的外部依赖项会更改它们的版本,并且我们在同一个集群中运行多个进程,因此我们希望在每次运行时选择要加载的确切 jar 版本。因此,$FLINK/lib 目录对我们来说是不够的。
详细信息:我们所做的是将 jar 分发到每个节点上的固定目录(不同于 $FLINK/lib)。稍后我们使用 CLI 启动工作(不是直接调用,因为调用很长,而是使用 bash 脚本来缩写调用)。
如果您想避免依赖冲突,请不要将您的 jar 复制到 ${FLINK}/lib。如果你使用 yarn-cluster 作为你的 master,你可以使用-yt(--yarn-ship)
,它会将 jars 复制到 hdfs 并作为你的分布式程序类路径。