我试图构建一个简单的基于scala的spark应用程序并在emr中运行它,但是当我运行它时,我得到了 Error: Failed to load class: 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")
}
在stock build.sbt文件中,我添加了几行内容,包括scala版本、spark库依赖项和 mainClass
(这是我从这个问题中发现的。
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里 jar cf MyScalaObj.jar MyScalaObj.class
. 我把它复制到运行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
,但它失败了 Error: Failed to load class com.myorganization.MyScalaObj.
由于整个过程对我来说都是全新的,所以我不确定这个错误是在我的sbt配置(我根本不知道sbt)中,还是在scala对象本身中,或者是在调用spark的方式中丢失了什么(例如,清单?)。我犯错误的可能原因是什么?
1条答案
按热度按时间4sup72z81#
我的问题在于如何构建jar文件。由于多年没有使用java,我忘记了限定类名——在本例中,
com.myorganization.MyScalaObj
--需要反映在目录结构中。我在跑步jar cf MyScalaObj.jar MyScalaObj.class
,但我应该在两个目录上运行jar cf MyScalaObj.jar com/
.