数据处理作业失败,出现 Class 未找到异常

Data proc job is failing with Class not found exception

我刚开始第一次学习 GCP 和 IntelliJ SBT time.Please 请耐心等待任何基本问题。

我的项目结构:

这是我的SBT.Build

名称:=“MySBTproject”

version := "0.1"
scalaVersion := "2.11.12"
val moutlingyaml = "net.jcazevedo" %% "moultingyaml" % "0.4.2"
lazy val root = (project in file("."))
  .settings(
    name := "MySBTproject",
    libraryDependencies += moutlingyaml
  )

然后我 运行 从终端创建 SBT 包来创建一个 jar,如下所示

C:\Users\xyz\IdeaProjects\MySBTproject>SBT Package 

将此 jar 部署到 GCP 存储桶后,我尝试运行使用数据处理

完成作业
  gcloud dataproc jobs submit spark \
--cluster my-cluster \
--region europe-north1  \
--jars gs://test-my-bucket-01/spark-jobs/mysbtproject_2.11-0.1.jar \
--class com.test.processing.jobs.mytestmain 

一旦我 运行 作业

,我就会遇到以下错误
Job failed with message [java.lang.ClassNotFoundException: com.test.processing.jobs.mytestmain] 

是不是因为我自定义的项目目录结构和build.sbt不同步?

是否需要任何更改,或者我是否需要从项目子目录创建一个 jar,如下所示?

C:\Users\xyz\IdeaProjects\MySBTproject\ProcessDataDataProcessingJobs>SBT Package

src目录应该在project.in(directory)指向的目录中。在您的案例中,项目目录是 ProcessData,而您的 srcProcessData/DataProcessingJobs 中。所以我猜 sbt 根本看不到你的代码,不编译它,也不打包它。

您可以通过打开 JAR(毕竟它只是一个目录中带有 类 的 ZIP 文件!)并通过调用 show sourceDirectories 查看 sbt 在哪里寻找您的代码来检查它。

由于我没有编辑问题的权限,所以我将详细信息作为 answer.Once 附上,我得到了正确的答案,我将删除我的答案。

下面是我在 IntelliJ window 面板上从“运行”运行ning 时遇到的错误

我也验证了jar文件,发现没有类,下面是jar和manifest文件的内容。

Manifest-Version: 1.0
Implementation-Title: MySBTproject
Implementation-Version: 0.1.0-SNAPSHOT
Specification-Vendor: default
Specification-Title: MySBTproject
Implementation-Vendor-Id: default
Specification-Version: 0.1.0-SNAPSHOT
Implementation-Vendor: default

JAR文件内容如下图

请您就进一步需要做的事情提出建议。

当我 运行 在 sbt shell 中显示目录命令时,下面是输出

MySBTproject> show sourceDirectories
    [info] root / Compile / sourceDirectories
    [info]  List(C:\Users\XXXXX\IdeaProjects\MySBTproject\DataProcessingjobs\src\main\scala-2.11, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\DataProcessingjobs\src\main\scala, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\DataProcessingjobs\src\main\java, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\DataProcessingjobs\target\scala-2.11\src_managed\main)
    [info] Compile / sourceDirectories
    [info]  List(C:\Users\XXXXXX\IdeaProjects\MySBTproject\src\scala-2.12, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\src\scala, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\src\java, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\target\scala-2.12\src_managed\main
    
    [info]  List(C:\Users\XXXXXX\IdeaProjects\MySBTproject\src\scala-2.12, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\src\scala, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\src\java, C:\Users\XXXXXXXXX\IdeaProjects\MySBTproject\target\scala-2.12\src_managed\main)
    [IJ]sbt:MySBTproject>

我最近在 Google Cloud DataProc 上执行 jar 时收到同样的错误。我不确定这是否与您遇到的问题相同,但如果您仍然遇到此问题且尚未解决,请尝试一下。

我的设置是:

  • Scala 2.11.12
  • sbt 1.3.13
  • Spark SQL 2.3.2

对我来说,问题与 grpc v1.29.0 中系统 属性 io.grpc.internal.DnsNameResolverProvider.enable_grpclb 的删除有关。您可以从 2020 年 10 月 8 日起在 googleapis/java-logging issue on github 阅读更多相关信息。查找用户 athakor[=32= 的评论].

解决方案是添加依赖项:

libraryDependencies += "com.google.cloud" % "google-cloud-logging" % "1.102.0" exclude("io.grpc", "grpc-alts")

libraryDependencies += "io.grpc" % "grpc-alts" % "1.29.0"