【问题标题】:NoClassDefFoundError when running flink with kafka connector使用 kafka 连接器运行 flink 时出现 NoClassDefFoundError
【发布时间】:2018-03-21 04:45:55
【问题描述】:

我正在尝试使用 flink 从 kafka 流式传输数据。我的代码编译没有错误,但在运行时出现以下错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: 
    org/apache/flink/streaming/util/serialization/DeserializationSchema
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.flink.streaming.util.serialization.DeserializationSchema
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more  

我的POM依赖列表如下:

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-core</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>0.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka-0.9_2.11</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1</version>
        </dependency>  
    </dependencies>

我尝试运行的 java 代码只是订阅了一个名为“streamer”的 kafka 主题:

import java.util.Properties;
import java.util.Arrays;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer09;
import org.apache.flink.streaming.util.serialization.SimpleStringSchema;
import org.apache.flink.streaming.util.serialization.DeserializationSchema;

public class StreamConsumer {
public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "localhost:9092");
        properties.setProperty("group.id", "samplegroup");

        DataStream<String> messageStream = env.addSource(new FlinkKafkaConsumer09<String>("streamer", new SimpleStringSchema(), properties));

        messageStream.rebalance().map(new MapFunction<String, String>() {
                        private static final long serialVersionUID = -6867736771747690202L;
                        @Override
                        public String map(String value) throws Exception {
                                return "Streamed data: " + value;
                        }
                }).print();
        env.execute();
}
}

系统信息:
1. Kafka 版本:0.9.0.1
2. Flink 版本:1.3.2
3.OpenJDK版本:1.8

虽然我使用的是 maven,但我认为这不是任何 maven 问题,因为即使我在没有 maven 的情况下尝试也会遇到同样的错误。我手动将所有必要的 .jar 文件下载到一个文件夹中,并在使用 javac 编译时使用 -cp 选项指定了该文件夹路径。我在运行时遇到与上述相同的错误,但在编译时没有错误。

【问题讨论】:

  • If in IntelliJ: "关于 IntelliJ 的注意事项:为了使应用程序在 IntelliJ IDEA 中运行,必须在运行配置中勾选 Include dependencies with "Provided" scope 框。如果此选项不可用(可能是由于使用了较旧的 IntelliJ IDEA 版本),那么一个简单的解决方法是创建一个调用应用程序 main() 方法的测试。" ci.apache.org/projects/flink/flink-docs-master/dev/…

标签: java apache-flink flink-streaming


【解决方案1】:

如果您在 pom 文件中的某个位置指定了 scope,请尝试删除它,因为它会在运行时限制类文件的范围

Limit Scope in POM file

【讨论】:

    【解决方案2】:

    我找到了原因,现在这似乎是一个非常愚蠢的错误。就我而言,jar 包在运行时不可用。我最终根本没有使用 Maven。我用javac -cp &lt;path_to_jar_files&gt;编译并用java -cp &lt;path_to_jar_files&gt;再次执行

    【讨论】:

      【解决方案3】:

      使用 kafka 连接器运行 flink 时出现 NoClassDefFoundError

      您的代码编译并且您收到 NoClassDefFoundError,我认为其中之一 您的依赖库在 maven .pom 自动下载过程中缺少 Compile DependenciesRuntime Dependencies

      所以这可能是你得到 NoClassDefFoundError 的根本原因

      解决方案:清理并构建

      【讨论】:

        【解决方案4】:

        看起来你的 pom 的第一个问题是你为你的 flink 导入使用了不同的版本。尝试对所有 flink 模块使用更新版本的1.3.2。当您使用不兼容或多个版本的库时,通常会出现此错误。

        尝试使用休闲依赖(假设您使用的是 scala 2.11):

        <dependencies>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-java</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-streaming-java_2.11</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-clients_2.11</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-connector-kafka-0.9_2.11</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>com.googlecode.json-simple</groupId>
                <artifactId>json-simple</artifactId>
                <version>1.1</version>
            </dependency>  
        </dependencies>
        

        如果你仍然有同样的问题发布示例代码,那么我可以重现错误。

        【讨论】:

        • 我试过了,但是这里提到的版本是最新的。
        • flink-streaming-core 不再存在,被 flink-streaming-java_ 所包含。 flink-clients 现在也有 scala 后缀了。
        • 我尝试了这些依赖项,但仍然有同样的错误。我已经添加了上面的java代码。
        • @raviabhiram 我在 Intellij 中创建了具有这些依赖项的新 maven 项目。我在官方教程data-artisans.com/blog/kafka-flink-a-practical-how-to 中设置了 kafla 和 kafka 生产者。不同的是,我从同一站点kafka_2.11-0.9.0.0 下载了更新版本的 kafka。一切都对我有用。
        • 谢谢@abalcerek。我才知道原因。就我而言,jar 包在运行时不可用。我最终根本没有使用 Maven。我用javac -cp &lt;path_to_jar_files&gt; 编译并用java -cp &lt;path_to_jar_files&gt; 再次执行。
        猜你喜欢
        • 2017-02-21
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2017-06-27
        • 2018-06-16
        相关资源
        最近更新 更多