【问题标题】:Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/spark/Logging线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/spark/Logging
【发布时间】:2019-08-22 10:00:55
【问题描述】:

我是 Spark 的新手。我尝试在 Oracle VirtualBox 5.1.4r110228 上的 CDH 5.8.0-0 上运行 Spark 应用程序 (.jar),该应用程序利用 Spark Steaming 在 Twitter 上执行情绪分析。我创建了我的 Twitter 帐户并生成了所有必需的 (4) 令牌。我被NoClassDefFoundError 异常阻止了。

我已经在谷歌上搜索了几天。到目前为止,我发现的最佳建议在下面的 URL 中,但显然我的环境仍然缺少一些东西。

http://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html#ixzz4Ia99dsp0

编译时出现的库在运行时丢失是什么意思?我们该如何解决这个问题?

什么是 Logging 库?我看到一篇文章说此日志记录可能会被弃用。除此之外,我确实在我的环境中看到了 log4j。

在我的 CDH 5.8 中,我正在运行以下版本的软件: Spark-2.0.0-bin-hadoop2.7 / spark-core_2.10-2.0.0 jdk-8u101-linux-x64 / jre-bu101-linux-x64

我在最后附加了异常的详细信息。这是我执行应用程序的过程以及遇到异常后进行的一些验证:

  1. 解压缩 twitter-streaming.zip(Spark 应用程序)
  2. cd twitter-streaming
  3. 运行 ./sbt/sbt 程序集
  4. 使用您的 Twitter 帐户更新 env.sh

$ cat env.sh

export SPARK_HOME=/home/cloudera/spark-2.0.0-bin-hadoop2.7
export CONSUMER_KEY=<my_consumer_key>
export CONSUMER_SECRET=<my_consumer_secret>
export ACCESS_TOKEN=<my_twitterapp_access_token>
export ACCESS_TOKEN_SECRET=<my_twitterapp_access_token>

submit.sh 脚本在 env.sh 中使用所需的凭据信息包装了 spark-submit 命令:

$ cat submit.sh

source ./env.sh
$SPARK_HOME/bin/spark-submit --class "TwitterStreamingApp" --master local[*] ./target/scala-2.10/twitter-streaming-assembly-1.0.jar $CONSUMER_KEY $CONSUMER_SECRET $ACCESS_TOKEN $ACCESS_TOKEN_SECRET

组装过程的日志: [cloudera@quickstart twitter-streaming]$ ./sbt/sbt 程序集

Launching sbt from sbt/sbt-launch-0.13.7.jar
[info] Loading project definition from /home/cloudera/workspace/twitter-streaming/project
[info] Set current project to twitter-streaming (in build file:/home/cloudera/workspace/twitter-streaming/)
[info] Including: twitter4j-stream-3.0.3.jar
[info] Including: twitter4j-core-3.0.3.jar
[info] Including: scala-library.jar
[info] Including: unused-1.0.0.jar
[info] Including: spark-streaming-twitter_2.10-1.4.1.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF/LICENSE.txt' with strategy 'first'
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Merging 'META-INF/maven/org.spark-project.spark/unused/pom.properties' with strategy 'first'
[warn] Merging 'META-INF/maven/org.spark-project.spark/unused/pom.xml' with strategy 'first'
[warn] Merging 'log4j.properties' with strategy 'discard'
[warn] Merging 'org/apache/spark/unused/UnusedStubClass.class' with strategy 'first'
[warn] Strategy 'discard' was applied to 2 files
[warn] Strategy 'first' was applied to 4 files
[info] SHA-1: 69146d6fdecc2a97e346d36fafc86c2819d5bd8f
[info] Packaging /home/cloudera/workspace/twitter-streaming/target/scala-2.10/twitter-streaming-assembly-1.0.jar ...
[info] Done packaging.
[success] Total time: 6 s, completed Aug 27, 2016 11:58:03 AM

不确定具体是什么意思,但是当我运行 Hadoop NativeCheck 时一切看起来都不错:

$ hadoop checknative -a

16/08/27 13:27:22 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
16/08/27 13:27:22 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:  true /usr/lib/hadoop/lib/native/libhadoop.so.1.0.0
zlib:    true /lib64/libz.so.1
snappy:  true /usr/lib/hadoop/lib/native/libsnappy.so.1
lz4:     true revision:10301
bzip2:   true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so

这是我的异常的控制台日志: $ ./submit.sh

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
16/08/28 20:13:23 INFO SparkContext: Running Spark version 2.0.0
16/08/28 20:13:24 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/08/28 20:13:24 WARN Utils: Your hostname, quickstart.cloudera resolves to a loopback address: 127.0.0.1; using 10.0.2.15 instead (on interface eth0)
16/08/28 20:13:24 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
16/08/28 20:13:24 INFO SecurityManager: Changing view acls to: cloudera
16/08/28 20:13:24 INFO SecurityManager: Changing modify acls to: cloudera
16/08/28 20:13:24 INFO SecurityManager: Changing view acls groups to: 
16/08/28 20:13:24 INFO SecurityManager: Changing modify acls groups to: 
16/08/28 20:13:24 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users  with view permissions: Set(cloudera); groups with view permissions: Set(); users  with modify permissions: Set(cloudera); groups with modify permissions: Set()
16/08/28 20:13:25 INFO Utils: Successfully started service 'sparkDriver' on port 37550.
16/08/28 20:13:25 INFO SparkEnv: Registering MapOutputTracker
16/08/28 20:13:25 INFO SparkEnv: Registering BlockManagerMaster
16/08/28 20:13:25 INFO DiskBlockManager: Created local directory at /tmp/blockmgr-37a0492e-67e3-4ad5-ac38-40448c25d523
16/08/28 20:13:25 INFO MemoryStore: MemoryStore started with capacity 366.3 MB
16/08/28 20:13:25 INFO SparkEnv: Registering OutputCommitCoordinator
16/08/28 20:13:25 INFO Utils: Successfully started service 'SparkUI' on port 4040.
16/08/28 20:13:25 INFO SparkUI: Bound SparkUI to 0.0.0.0, and started at http://10.0.2.15:4040
16/08/28 20:13:25 INFO SparkContext: Added JAR file:/home/cloudera/workspace/twitter-streaming/target/scala-2.10/twitter-streaming-assembly-1.1.jar at spark://10.0.2.15:37550/jars/twitter-streaming-assembly-1.1.jar with timestamp 1472440405882
16/08/28 20:13:26 INFO Executor: Starting executor ID driver on host localhost
16/08/28 20:13:26 INFO Utils: Successfully started service 'org.apache.spark.network.netty.NettyBlockTransferService' on port 41264.
16/08/28 20:13:26 INFO NettyBlockTransferService: Server created on 10.0.2.15:41264
16/08/28 20:13:26 INFO BlockManagerMaster: Registering BlockManager BlockManagerId(driver, 10.0.2.15, 41264)
16/08/28 20:13:26 INFO BlockManagerMasterEndpoint: Registering block manager 10.0.2.15:41264 with 366.3 MB RAM, BlockManagerId(driver, 10.0.2.15, 41264)
16/08/28 20:13:26 INFO BlockManagerMaster: Registered BlockManager BlockManagerId(driver, 10.0.2.15, 41264)
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/Logging
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)I
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.streaming.twitter.TwitterUtils$.createStream(TwitterUtils.scala:44)
    at TwitterStreamingApp$.main(TwitterStreamingApp.scala:42)
    at TwitterStreamingApp.main(TwitterStreamingApp.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:729)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.Logging
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 23 more
16/08/28 20:13:26 INFO SparkContext: Invoking stop() from shutdown hook
16/08/28 20:13:26 INFO SparkUI: Stopped Spark web UI at http://10.0.2.15:4040
16/08/28 20:13:26 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
16/08/28 20:13:26 INFO MemoryStore: MemoryStore cleared
16/08/28 20:13:26 INFO BlockManager: BlockManager stopped
16/08/28 20:13:26 INFO BlockManagerMaster: BlockManagerMaster stopped
16/08/28 20:13:26 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
16/08/28 20:13:26 INFO SparkContext: Successfully stopped SparkContext
16/08/28 20:13:26 INFO ShutdownHookManager: Shutdown hook called
16/08/28 20:13:26 INFO ShutdownHookManager: Deleting directory /tmp/spark-5e29c3b2-74c2-4d89-970f-5be89d176b26

我知道我的帖子很长。非常感谢您的建议或见解!

-jsung8

【问题讨论】:

  • 该错误表示在运行时它无法在包 org.apache.spark 中找到要加载的 Logging 类。 twitter-streaming-assembly-1.0.jar 中根本没有这个类。确保在构建时将其放入罐中。在构建此示例时是否创建了任何其他 jar。
  • 这可能对你有帮助:stackoverflow.com/a/39194820/2873538
  • @amit_kumar & Ajeets 这看起来确实很有希望!非常感谢您的指导和链接!!尽管“287358”帖子上的建议很明确,但对我来说,一个挑战是确定要编辑的正确 pom.xml 文件以及下载/配置 Spark 1.6.2。我找到了半打与 twitter-stream 目录名称相关的 pom.xml 文件......我会四处玩耍并分享我发现的内容。
  • @jsung8 答案2873538 是我最近写的,你应该注意org.apache.spark.Logging 出现在Spark 1.5.2 中,而不是你似乎要使用的1.6.2。跨度>
  • @jsung8,你能发布你的 pom.xml 或 .sbt 文件吗

标签: apache-spark


【解决方案1】:

使用:spark-core_2.11-1.5.2.jar

我遇到了@jsung8 描述的相同问题,并试图找到@youngstephen 建议的.jar 但找不到。然而,链接 spark-core_2.11-1.5.2.jar 而不是 spark-core_2.11-1.5.2.logging.jar 以 @youngstephen 建议的方式解决了异常。

【讨论】:

  • 在 spark-submit 命令期间需要 core_2.11-1.5.2.logging.jar。
【解决方案2】:

在 spark 1.5.2 之后删除了 org/apache/spark/Logging。

既然你的 spark-core 版本是 2.0,那么最简单的解决方案是:

下载单个 spark-core_2.11-1.5.2.logging.jar 并将其放在 spark 根目录下的 jars 目录中。

无论如何,它解决了我的问题,希望它有所帮助。

【讨论】:

  • 你在哪里找到它?能给个链接吗?
  • @romainjouin :抱歉,没有链接。我刚刚和我的搭档讨论过。
【解决方案3】:

可能导致此问题的一个原因是lib 和类冲突。 我遇到了这个问题并使用了一些 ma​​ven 排除

   <dependency>
       <groupId>org.apache.spark</groupId>
       <artifactId>spark-core_2.11</artifactId>
       <version>2.0.0</version>
       <scope>provided</scope>
       <exclusions>
           <exclusion>
               <groupId>log4j</groupId>
               <artifactId>log4j</artifactId>
           </exclusion>
       </exclusions>
   </dependency>

   <dependency>
       <groupId>org.apache.spark</groupId>
       <artifactId>spark-streaming_2.11</artifactId>
       <version>2.0.0</version>
       <scope>provided</scope>
   </dependency>

   <dependency>
       <groupId>org.apache.spark</groupId>
       <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
       <version>2.0.0</version>
       <exclusions>
           <exclusion>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-log4j12</artifactId>
           </exclusion>
           <exclusion>
               <groupId>log4j</groupId>
               <artifactId>log4j</artifactId>
           </exclusion>
       </exclusions>
   </dependency>

【讨论】:

    【解决方案4】:

    您使用的是旧版本的 Spark Twitter 连接器。您的堆栈跟踪中的此类暗示了这一点:

    org.apache.spark.streaming.twitter.TwitterUtils
    

    Spark 在 2.0 版中删除了该集成。您使用的是旧 Spark 版本中的一个,它引用了旧的 Logging 类,该类在 Spark 2.0 中移动到了不同的包。

    如果您想使用 Spark 2.0,您需要使用来自 Bahir 项目的 Twitter 连接器。

    【讨论】:

      【解决方案5】:

      由于以下错误,Spark 核心版本应该降级到 1.5

      java.lang.NoClassDefFoundError: org/apache/spark/Logging
      

      http://bahir.apache.org/docs/spark/2.0.0/spark-streaming-twitter/为此提供了更好的解决方案。通过添加以下依赖项,我的问题得到了解决。

       <dependency>
      <groupId>org.apache.bahir</groupId>
      <artifactId>spark-streaming-twitter_2.11</artifactId>
      <version>2.0.0</version>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多