如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”
Posted
技术标签:
【中文标题】如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”【英文标题】:How to resolve "Failed to load class" with Spark 3 on EMR for Scala object 【发布时间】:2021-01-17 20:22:45 【问题描述】:我正在尝试构建一个简单的基于 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")
在现有的 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
的罐子中。我将此复制到运行 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。我的错误的可能原因是什么?
【问题讨论】:
您是否将文件复制到 hdfs 或只是本地?指定文件位置。 【参考方案1】:原来我的问题在于我如何构建我的 jar 文件。多年没有接触Java,我忘记了限定类名——在本例中为com.myorganization.MyScalaObj
——需要反映在目录结构中。我正在运行jar cf MyScalaObj.jar MyScalaObj.class
,但我应该在两个目录中运行jar cf MyScalaObj.jar com/
。
【讨论】:
你的回答不清楚。你可以通过写清楚完整的spark-submit
命令来解释更多
问题中列出了我的spark-submit
命令。以上是关于如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Lambda 函数在亚马逊 EMR 上执行 spark 提交?