我正在尝试构建一个简单的基于 Scala 的 Spark 应用程序并在 EMR 中运行它,但是当我运行它时,我收到错误:无法加载类:com.myorganization.MyScalaObj
。我的 Scala 文件是:
package com.myorganization
import org.apache.spark.sql.SparkSession
object MyScalaObj extends App {
val spark = SparkSession.builder()
.master(("local[*]"))
.appName("myTestApp")
.getOrCreate()
val df = spark.read.csv("s3://my_bucket/foo.csv")
df.write.parquet("s3://my_bucket/foo.parquet")
}
对于库存 build.sbt 文件,我添加了几行,包括 Scala 版本、Spark 库依赖项和 mainClass
(我从 this question 找到的。
name := "sbtproj"
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"
)
mainClass in (Compile, run) := Some("com.myorganization.MyScalaObj")
我构建了这个并获得了一个MyScalaObj.class
,我使用jar cf MyScalaObj.jar MyScalaObj.class
将其手动打包到一个jar中。我将其复制到运行 Spark 3.0.0 和 Scala 2.12.10 的 EMR 集群。
然后,我尝试使用 spark-submit --class com.myorganization.MyScalaObj MyScalaObj.jar --deploy-mode cluster --master Spark://x.x.x.x
运行我的应用程序,但失败了出现错误:无法加载类 com.myorganization.MyScalaObj。
由于这整个过程对我来说相当新,我不确定错误是否出在我的 sbt 配置中(我根本不知道 sbt),Scala 对象本身缺少某些东西(例如, list ?),或者我如何调用 Spark。我的错误的可能原因是什么?
最佳答案
事实证明我的问题在于如何构建 jar 文件。我已经多年没有使用 Java,忘记了限定类名(在本例中为 com.myorganization.MyScalaObj)需要反射(reflect)在目录结构中。我正在运行 jar cf MyScalaObj.jar MyScalaObj.class
,但我应该在两个目录中运行 jar cf MyScalaObj.jar com/
。
关于scala - 如何在 EMR 上使用 Spark 3 解析 Scala 对象的 "Failed to load class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64166776/