当运行用maven构建的jar时,flinkmltools noclassdef

vi4fp9gy  于 2021-06-24  发布在  Flink
关注(0)|答案(2)|浏览(427)

我正在使用ApacheFlink开发一个推荐系统。当我在intellij中测试它时,实现正在运行,但是我现在想在集群上运行。我还构建了一个jar文件,并在本地对其进行了测试,以查看是否一切正常,但我遇到了一个问题。
noclassdeffounderror:org/apache/flink/ml/common/flinkmltools$
如我们所见,班级 FlinkMLTools 在jar运行期间找不到在我的代码中使用的。我用maven 3.3.3和 mvn clean install 我用的是flink的0.9.0版本。
第一条线索
事实上,我的全局项目包含其他项目(这个推荐者是子项目之一)。这样,我就必须启动 mvn clean install 在正确项目的文件夹中,否则maven总是构建另一个项目的jar(我不明白为什么)。所以我想知道是否有一种方法可以明确地告诉maven构建一个特定的全局项目。事实上,也许 FlinkMLTools 包含在 pom.xml 全局项目的文件。
还有其他想法吗?

bvjxkvbb

bvjxkvbb1#

问题是flink的二进制发行版不包含库(FlinkML、gelly等)。这意味着您要么必须将库jar文件与作业jar一起提供,要么必须手动将它们复制到集群中。我强烈推荐第一种选择。

构建一个fat jar以包含库jar

构建不包含不必要jar的胖jar的最简单方法是使用flink的quickstart原型来设置项目的pom。

mvn archetype:generate -DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-scala -DarchetypeVersion=0.9.0

将使用scalaapi为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>

当你知道如何用 mvn package ,生成的jar应该包含 flink-ml jar及其所有可传递依赖项。

将库jar手动复制到集群

flink包括所有位于 <FLINK_ROOT_DIR>/lib 已执行作业的类路径中的文件夹。因此,为了使用flink的机器学习库,您必须将 flink-ml jar和所有需要的可传递依赖项 /lib 文件夹。这是相当棘手的,因为您必须弄清楚您的算法实际需要哪些可传递依赖项,因此,您通常会复制所有可传递依赖项。

如何用maven构建特定的子模块

为了从父项目构建特定的子模块x,可以使用以下命令:

mvn clean package -pl X -am
``` `-pl` 允许您指定要生成的子模块和 `-am` 告诉maven也构建其他必需的子模块。这里也有描述。
hsvhsicv

hsvhsicv2#

在集群模式下,flink不会将所有库jar文件放入其worker的类路径中。在intellij中本地执行程序时,所有必需的依赖项都在类路径中,但在集群上执行时不在类路径中。
您有两种选择:
将flinkmljar文件复制到 lib 所有flink taskmanager的文件夹
为您的应用程序构建一个包含flinkml依赖项的胖jar文件。
有关详细信息,请参阅集群执行文档。

相关问题