问题是 Flink 的二进制发行版不包含库(flink-ml、gelly 等)。这意味着您要么必须将库 jar 文件与作业 jar 一起发送,要么必须手动将它们复制到集群中。我强烈推荐第一个选项。
构建一个包含库 jar 的 fat-jar
构建一个不包含不必要 jar 的胖 jar 的最简单方法是使用 Flink 的快速入门原型来设置项目的 pom.jar。
mvn archetype:generate -DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-scala -DarchetypeVersion=0.9.0
将使用 Scala API 为 Flink 项目创建结构。生成的 pom 文件将具有以下依赖项。
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies>
您可以删除flink-streaming-scala
并插入以下依赖项标签,以包含 Flink 的机器学习库。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-ml</artifactId>
<version>0.9.0</version>
</dependency>
当您知道使用 构建作业 jar 时mvn package
,生成的 jar 应包含该flink-ml
jar 及其所有传递依赖项。
手动将库 jar 复制到集群
Flink 包含所有位于<FLINK_ROOT_DIR>/lib
已执行作业的类路径中的文件夹中的 jar。因此,为了使用 Flink 的机器学习库,您必须将flink-ml
jar 和所有需要的传递依赖项放入/lib
文件夹中。这相当棘手,因为您必须弄清楚您的算法实际需要哪些传递依赖,因此,您通常最终会复制所有传递依赖。
如何使用 maven 构建特定的子模块
为了从您的父项目构建特定的子模块 X,您可以使用以下命令:
mvn clean package -pl X -am
-pl
允许您指定要构建的子模块,并-am
告诉 maven 还构建其他必需的子模块。这里也有描述。