【问题标题】:scala.Function0 running spark simple WordCount in Scalascala.Function0 在 Scala 中运行 spark 简单的 WordCount
【发布时间】:2017-10-26 17:36:51
【问题描述】:

我正在尝试运行一个简单的程序,用 spark 计算 scala 中的单词。我在linux中自己完成了所有的安装,我无法执行,因为我遇到了这个错误:

java.lang.ClassNotFoundException: scala.Function0
at sbt.internal.inc.classpath.ClasspathFilter.loadClass(ClassLoaders.scala:74)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.twitter.chill.KryoBase$$anonfun$1.apply(KryoBase.scala:41)
at com.twitter.chill.KryoBase$$anonfun$1.apply(KryoBase.scala:41)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.immutable.Range.foreach(Range.scala:160)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at com.twitter.chill.KryoBase.<init>(KryoBase.scala:41)
at com.twitter.chill.EmptyScalaKryoInstantiator.newKryo(ScalaKryoInstantiator.scala:57)
at org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:96)
at org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:292)
at org.apache.spark.serializer.KryoSerializerInstance.<init>(KryoSerializer.scala:277)
at org.apache.spark.serializer.KryoSerializer.newInstance(KryoSerializer.scala:186)
at org.apache.spark.serializer.KryoSerializer.supportsRelocationOfSerializedObjects$lzycompute(KryoSerializer.scala:193)
at org.apache.spark.serializer.KryoSerializer.supportsRelocationOfSerializedObjects(KryoSerializer.scala:189)
at org.apache.spark.shuffle.sort.SortShuffleManager$.canUseSerializedShuffle(SortShuffleManager.scala:187)
at org.apache.spark.shuffle.sort.SortShuffleManager.registerShuffle(SortShuffleManager.scala:99)
at org.apache.spark.ShuffleDependency.<init>(Dependency.scala:90)
at org.apache.spark.rdd.ShuffledRDD.getDependencies(ShuffledRDD.scala:87)
at org.apache.spark.rdd.RDD$$anonfun$dependencies$2.apply(RDD.scala:239)
at org.apache.spark.rdd.RDD$$anonfun$dependencies$2.apply(RDD.scala:237)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.dependencies(RDD.scala:237)
at org.apache.spark.scheduler.DAGScheduler.getShuffleDependencies(DAGScheduler.scala:431)
at org.apache.spark.scheduler.DAGScheduler.getOrCreateParentStages(DAGScheduler.scala:380)
at org.apache.spark.scheduler.DAGScheduler.createResultStage(DAGScheduler.scala:367)
at org.apache.spark.scheduler.DAGScheduler.handleJobSubmitted(DAGScheduler.scala:850)
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1677)
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1669)
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1658)
at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48)

基本上我要执行的代码是:

import org.apache.spark.sql.SparkSession

object SparkWordCount extends App {

  val spark = SparkSession.builder
    .master("local[*]")
    .appName("Spark Word Count")
    .getOrCreate()

  val lines = spark.sparkContext.parallelize(
    Seq("Spark Intellij Idea Scala test one",
      "Spark Intellij Idea Scala test two",
      "Spark Intellij Idea Scala test three"))

  val counts = lines.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)

  counts.foreach(println)
}

我认为这应该是由于 spark 和 scala 版本的原因,但我找不到好的解决方案。

我的 build.sbt 看起来像这样:

name := "com.example.test"
version := "0.1"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.2.0",
  "org.apache.spark" %% "spark-sql" % "2.2.0"
)

如果我在 spark-shell 中执行相同的代码,它可以工作,我已经安装了版本:

  • scala:2.11.8
  • 火花:2.2.0
  • sbt: 1.0.2

我也尝试过使用不同的 scala 版本、spark 和所有东西,但都不起作用,有人可以帮我吗?

提前谢谢你, 哈维。

  • 当我在项目中执行命令 sbt 时,它显示:

    获取 Scala 2.12.3(用于 sbt)...

我无法理解,因为我在 build.sbt (scalaVersion := "2.11.8") 中指定了 scala 版本

【问题讨论】:

    标签: scala apache-spark sbt bigdata data-science


    【解决方案1】:

    我假设您正在尝试从 Intellij Idea 运行此代码。如果这是真的,主要问题在于想法配置。

    转到 File > Project Structures > Global Libraries 并检查您是否安装了 scala-library。 Idea 使用自己的库和 SDK 源,这就是为什么在 shell 中一切正常。

    我在纯 sbt 布局中尝试了您的代码,它使用完全相同的 build.sbt 和源文件。

    一件小事。也许 Idea 在运行结束时会自动停止所有正在运行的 spark 会话,但我相信您必须明确停止活动会话。只需将spark.stop() 放在可执行函数或对象的末尾即可。

    【讨论】:

    • 嗨 Dennis,非常感谢您的帮助,我正在使用 Intellij,但我也在尝试使用 sbt 运行,但它也无法正常工作。我已经检查了你所说的,它已经安装了 scala-sdk 2.11.8,所以一切看起来都很好......,最后我创建了一个新项目,并且神秘地工作了......
    • 我写了一篇关于制作新项目的评论,只是为了测试它是系统问题还是与项目相关。很高兴一切都为你解决。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2016-10-26
    • 1970-01-01
    • 2015-07-25
    • 2016-10-31
    • 2018-08-23
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多