如何在intellij中设置和运行scala-spark?

问题描述 投票:0回答:1

我正在尝试运行使用 Intellij 来构建用 scala 编写的 Spark 应用程序。当我执行scala程序时,出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf
    at Main$.main(Main.scala:10)
    at Main.main(Main.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 2 more

引发错误的行如下:

val conf = new SparkConf().setAppName("Sample Spark Scala Application")

如果我只是尝试导入spark SparkConf()而不尝试执行上面的行,我不会收到任何错误。

以下是我的sbt文件的内容:

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.12.15"

val sparkVersion = "3.2.4"

// Note the dependencies are provided
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided"
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % sparkVersion % "provided"

lazy val root = (project in file("."))
  .settings(
    name := "untitled4"
  )

sbt 中提到的版本与我打开 Spark shell 时看到的版本相符。

以下是我的PATH、JAVA_HOME和SPARK_HOME变量的内容

ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/spark/spark-3.2.4-bin-hadoop2.7/bin
ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $SPARK_HOME
/usr/spark/spark-3.2.4-bin-hadoop2.7

我能够在 Spark shell 中正确运行代码。所以 Spark 和 scala 似乎设置正确。但 Intellij 无法使用这些。

我尝试遵循一些在线指南,但它们没有帮助。将不胜感激帮助解决问题。如果需要更多信息或详细信息,也请告诉我。

scala intellij-idea scala-spark
1个回答
0
投票

如果您想从 Intellij 内部运行代码,则不会“提供”spark 依赖项。使用默认配置通过 Intellij 运行,您的应用程序将作为简单的 JVM 应用程序运行,并且应该在类路径中提供其所有依赖项。像下面这样的东西 当您在 JVM 项目中按下

Run
按钮时,默认情况下会发生:

java -classpath /path/to/dependency:/path/to/dependency_2 YourMain

所以,我的猜测是,当您从 Intellij 运行代码时,因为您的 Spark 依赖项被标记为

provided
,而在提供的
java
中无法通过
classpath
找到它。 您应该在 sbt 文件中将 Spark 包的范围更改为
compile
,构建项目并重试。

© www.soinside.com 2019 - 2024. All rights reserved.