Сбой связи при выполнении заданий Apache Flink

У меня есть работа, разработанная в Flink 0.9, в которой используется модуль графа (Gelly). Задание успешно выполняется в среде IDE (Eclipse), но после экспорта его в JAR с использованием maven (mvn clean install) оно не может выполняться на локальном экземпляре flink со следующей ошибкой

«Не удалось загрузить класс точки входа программы myclass из-за сбоя связи»

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

Есть идеи, почему это происходит и как это решить?


person Karim Wadie    schedule 07.05.2015    source источник
comment
Вы создавали проект pom с помощью Flink quickstart.sh (= архетип Maven)? У вас есть flink-gelly как зависимость в вашем помпе?   -  person Robert Metzger    schedule 07.05.2015


Ответы (1)


Похоже, что код flink-gelly не попал в ваш файл jar. Наиболее очевидной причиной этой проблемы является отсутствие зависимости maven в файле pom вашего проекта. Но я предполагаю, что зависимость присутствует, иначе разработка работы в среде 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 будет находиться в каталоге target/.

Вы можете вручную проверить, содержит ли файл jar (zip) файлы классов в /org/apache/flink/graph/

person Robert Metzger    schedule 13.05.2015
comment
Это правда. Мне пришлось удалить maven-jar-plugin из pom.xml и добавить приведенный выше фрагмент после изменения версии Flink. Теперь я могу успешно запустить его на локальном экземпляре - person Karim Wadie; 14.05.2015