scala - 如何在 EMR 上使用 Spark 3 解析 Scala 对象的 "Failed to load class"

标签 scala apache-spark sbt

我正在尝试构建一个简单的基于 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/

相关文章:

java - Blowfish 在 Java/Scala 中加密并在 bash 中解密

java - Play Framework “eclipsify”命令引发错误,找不到sbt_2.9.1; 0.13.5

python - 无法从列表 : pyspark 创建数据框

scala - 在 IntelliJ 中,我在哪里输入 Homebrew Scala 路径/usr/local/opt/scala/idea?

scala - java.net.URISyntaxException。 sbt - 路径中的空间

azure - 使用 sbt : Unable to find credentials for 将 scala 项目发布到 azure feed

scala - 用于命令行参数的简单解构提取器

scala - 在 Scala 中编写 {1, 2, 4, 8, 16 } 的最简单方法

java - 在 Spark 中,是否可以在两个执行者之间共享数据?

apache-spark - 无法在 Cloudera Quickstart VM 5.3.0 中使用 Cloudera Manager 添加新服务