【问题标题】:Resolving NoClassDefFoundError: org/apache/spark/Logging exception解决 NoClassDefFoundError: org/apache/spark/Logging 异常
【发布时间】:2018-10-08 07:04:00
【问题描述】:

我正在试用 hbase-spark 连接器。首先,我正在尝试this 代码。

我的 pom 依赖项是:

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-spark</artifactId>
        <version>2.0.0-alpha4</version>
    </dependency>
</dependencies>

运行代码时出现以下异常:

线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/spark/Logging 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:760) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:368) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:362) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:361) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 org.apache.hadoop.hbase.spark.JavaHBaseContext.(JavaHBaseContext.scala:46) 在 com.myproj.poc.sparkhbaseneo4j.App.main(App.java:71) 引起:java.lang.ClassNotFoundException:org.apache.spark.Logging 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 14 更多

com.myproj.poc.sparkhbaseneo4j.App.main(App.java:71) 在 github 代码中是 line 67

我检查了this thread。它说我应该包含所有库的相同版本。早些时候,我的 pom 中有 2.3.0 版本的 spark 库。但我意识到hbase-spark 有最新版本2.0.0。所以我将所有 spark 库的版本降级为2.0.0。但我仍然遇到同样的异常。

或者我是否必须坚持使用 1.X.X 版本才能使用它,因为 this 回答说它在 1.5.2 版之后被删除?

【问题讨论】:

    标签: apache-spark hadoop hbase maven-dependency


    【解决方案1】:

    Sean Owenhttp://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/Hit-quot-Exception-in-thread-main-java-lang-NoClassDefFoundError/td-p/44486 中建议 “你根本不应该在你的应用程序中使用 org.apache.spark.Logging。这很可能是问题和解决方案。” em>

    所以你应该使用以下或higher version

    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    

    更新

    我指定了,现在我得到 NoClassDefFoundError: org/apache/spark/streaming/dstream/DStream

    对于上述问题,您需要以下依赖项

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.0.0</version>
        <scope>provided</scope>
    </dependency>
    

    【讨论】:

    • (Q1) 你的意思是说我应该添加你指定的依赖?我指定了,现在我得到NoClassDefFoundError: org/apache/spark/streaming/dstream/DStream。我在这里错过了一些基本的东西吗? (Q2) 另外,我不知道添加该依赖项如何解决缺少的Logging 类异常。我没有在代码中的任何地方使用Logging 类。似乎连接器在内部使用该类。但是如何通过添加该依赖项来解决它?只能通过添加包含org.apache.spark.Logging 的依赖项来解决它。不是吗?
    • 我已经更新了我的答案。通过查看可用的依赖关系来解决依赖关系。您添加了 apache commons 日志记录,这有助于解决您的第一个依赖问题。 Spark 也使用了自己的外部依赖和包。
    • 一个小问题。我想获取我的 hbase 表中某些列的前 10 个值的行键。为此,我可以使用 hbase-spark 连接器获取 spark RDD 中的所有值,然后通过 Spark sql 在内存中执行排序吗?这会很快吗?还是我应该遵循其他方法?还是在 HBase 中使用任何框架都不可行。
    • 一个小请求,如果它对您有帮助,请您支持这个答案;)。现在为了您的关注,我想您可以编写 spark-sql 查询来仅从 Hbase 获取前 10 条记录。是的,应该可以单独在 HBASE 中完成
    • 如果您自己或在 stackoverflow 中找不到解决方案,随时欢迎您提出其他问题
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2021-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2018-06-18
    相关资源
    最近更新 更多