【问题标题】:Spark: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/LoggingSpark:线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/spark/Logging
【发布时间】:2021-07-22 08:18:09
【问题描述】:

运行以下代码时出现此错误

import org.apache.spark.streaming._
import org.apache.spark.streaming.twitter._

object PopularTwitterHashtags {


  def setupTwitter() = {
    import scala.io.Source

    for (line <- Source.fromFile("data/twitter.txt").getLines) {
      val fields = line.split(" ")
      if (fields.length == 2) {
        System.setProperty("twitter4j.oauth." + fields(0), fields(1))
      }
    }
  }

  def main(args: Array[String]) {

    setupTwitter()

    
    val ssc = new StreamingContext("local[*]", "PopularHashtags", Seconds(1))
    val sc = ssc.sparkContext
    sc.setLogLevel("ERROR")

    val tweets = TwitterUtils.createStream(ssc, None)

    val statuses = tweets.map(status => status.getText())

    val tweetwords = statuses.flatMap(tweetText => tweetText.split(" "))

    val hashtags = tweetwords.filter(word => word.startsWith("#"))


    val hashtagKeyValues = hashtags.map(hashtag => (hashtag, 1))


    val hashtagCounts = hashtagKeyValues.reduceByKeyAndWindow( (x,y) => x + y, (x,y) => x - y, Seconds(300), Seconds(1))

    val sortedResults = hashtagCounts.transform(rdd => rdd.sortBy(x => x._2, false))

    sortedResults.print

    ssc.checkpoint("data")
    ssc.start()
    ssc.awaitTermination()
  }
}

我不知道哪个库或部分代码使用了这个org/apache/spark/Logging。与日志记录有关的唯一部分是当我调用sc.setLogLevel("ERROR") 时。但我已经尝试删除它,但我仍然收到此错误。

我将 sbt 用于依赖项。我的 sbt 文件是

name := "SparkStreaming"

version := "0.1"

scalaVersion := "2.12.10"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "3.0.0",
  "org.apache.spark" %% "spark-sql" % "3.0.0",
  "org.apache.spark" %% "spark-streaming" % "3.1.1",
  "org.apache.spark" % "spark-streaming-twitter_2.11" % "1.6.3",
)

更新:

人们告诉我,问题在于将 spark-streaming-twitter_2.11 与 Scala 2.12 一起使用。但事实并非如此,我已更改为 Scala 2.11,但仍然遇到完全相同的错误。这是新的 sbt 文件

name := "SparkStreaming"

version := "0.1"

scalaVersion := "2.11.12"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.4.7",
  "org.apache.spark" %% "spark-sql" % "2.4.7",
  "org.apache.spark" %% "spark-streaming" % "2.4.7",
  "org.apache.spark" %% "spark-streaming-twitter" % "1.6.3"
)

【问题讨论】:

    标签: scala apache-spark sbt spark-streaming


    【解决方案1】:

    您的 scala 版本是 2.12,但您引用的是基于 scala 2.11 构建的 spark-streaming-twitter_2.11 库。 Scala 2.11 和 2.12 不兼容,这就是导致此错误的原因。

    如果您想使用 Spark 3,则必须使用支持 scala 2.12 的不同依赖项。

    【讨论】:

    • 我尝试过使用 Scala 2.11 和 Spark 2.4.7,但我遇到了同样的错误。
    • sbt clean了吗?我对sbt不熟悉,但是如果你用maven构建代码,有时版本错误的旧jar会污染你的工作空间。
    • 我在另一个问题中发现问题是org.apache.spark.Logging 仅在Spark 1.5.2 或更低版本中可用。所以我将 Spark 版本更改为 1.5.2 并且它工作正常。
    【解决方案2】:

    问题是org.apache.spark.Logging只在Spark 1.5.2或更低版本中可用,而这个类是org.apache.spark.streaming.twitter的依赖。

    由于 Spark 1.5.2 不适用于 Scala 2.12,我们应该降级到 Scala 2.11。

    所以使这个应用程序工作的 sbt 文件如下

    name := "SparkStreaming"
    
    version := "0.1"
    
    scalaVersion := "2.11.12"
    
    libraryDependencies ++= Seq(
      "org.apache.spark" %% "spark-core" % "1.5.2",
      "org.apache.spark" %% "spark-sql" % "1.5.2",
      "org.apache.spark" %% "spark-streaming" % "1.5.2",
      "org.apache.spark" %% "spark-streaming-twitter" % "1.6.3"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2022-01-07
      • 2017-03-10
      • 2018-08-09
      相关资源
      最近更新 更多