运行 Apache Flink 作业时链接失败

Posted

技术标签:

【中文标题】运行 Apache Flink 作业时链接失败【英文标题】:Linkage failure when running Apache Flink jobs 【发布时间】:2015-05-07 13:28:35 【问题描述】:

我在 Flink 0.9 中开发了一个使用图形模块(Gelly)的工作。该作业在 IDE (Eclipse) 中成功运行,但在使用 maven (mvn clean install) 将其导出到 JAR 后,它无法在本地 flink 实例上执行,并出现以下错误

“由于链接失败,无法加载程序的入口点类'myclass'”

java.lang.NoClassDefFoundError: org/apache/flink/graph/GraphAlgorithm

知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

您是否使用 Flink 的 quickstart.sh (=Maven archetype) 创建了项目 pom?你的 pom 中有 flink-gelly 作为依赖项吗? 【参考方案1】:

看起来flink-gelly 的代码没有出现在您的 jar 文件中。 此问题最明显的原因是项目的 pom 文件中缺少 maven 依赖项。但我假设存在依赖关系,否则无法在 IDE 中开发作业。

很可能,jar 文件是由maven-jar-plugin 创建的,它不包括依赖项。 尝试将以下片段添加到您的 pom.xml

    <build>
    <plugins>
        <!-- We use the maven-shade plugin to create a fat jar that contains all dependencies
        except flink and it's transitive dependencies. The resulting fat-jar can be executed
        on a cluster. Change the value of Program-Class if your program entry point changes. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <!-- Run shade goal on package phase -->
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>org.apache.flink:*</artifact>
                                <excludes>
                                    <exclude>org/apache/flink/shaded/**</exclude>
                                    <exclude>web-docs/**</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <!-- add Main-Class to manifest file -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>YOURMAINCLASS</mainClass>
                            </transformer>
                        </transformers>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

</build>
<profiles>
    <profile>
        <!-- A profile that does everyting correctly:
        We set the Flink dependencies to provided -->
        <id>build-jar</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-java</artifactId>
                <version>0.9-SNAPSHOT</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-streaming-core</artifactId>
                <version>0.9-SNAPSHOT</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-clients</artifactId>
                <version>0.9-SNAPSHOT</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

现在,您可以使用 mvn clean package -Pbuild-jar 构建 jar。 jar 文件现在将位于target/ 目录中。

您可以手动检查jar(zip)文件是否包含/org/apache/flink/graph/中的类文件

【讨论】:

确实如此。我不得不从 pom.xml 中删除 maven-jar-plugin 并在修改 Flink 版本后添加上面的 sn-p。我现在可以在本地实例上成功运行了

以上是关于运行 Apache Flink 作业时链接失败的主要内容,如果未能解决你的问题,请参考以下文章

Apache Flink 常见问题定位指南

Flink 任务失败重启与恢复策略

Flink 任务失败重启与恢复策略

如何通过在 Apache Flink 中使用上传的 jar 来提交作业?

flink作业提交源码解析-命令行解析及运行

flink作业提交源码解析-命令行解析及运行