如何在 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 提交?

在 AWS EMR 上使用 Spark 访问关系数据库

AWS EMR 上的 Spark:使用更多执行器

在 emr 集群上安装 com.databricks.spark.xml

EMR:Spark 应用程序在引导时可用吗?

在 AWS EMR 上设置 Spark Thrift 服务器以建立 JBDC/ODBC 连接