我正在尝试在dataproc集群中运行一个简单的spark脚本,它需要使用scala和java云存储客户机库读/写gcs bucket。脚本如下:
//Build.sbt
name := "trialGCS"
version :="0.0.1"
scalaVersion := "2.12.10"
val sparkVersion = "3.0.1"
libraryDependencies ++= Seq(
// Spark core libraries
"org.apache.spark" %% "spark-core" % sparkVersion,
"org.apache.spark" %% "spark-sql" % sparkVersion,
"com.google.cloud" % "google-cloud-storage" % "1.113.15"
)
resolvers += Resolver.mavenLocal
package DEV
import com.google.cloud.storage.StorageOptions
object TrialGCS extends App {
import spark.implicits._
val storage = StorageOptions.getDefaultInstance.getService
}
我使用shell命令通过终端启动脚本:
gcloud dataproc jobs submit spark --class DEV.TrialGCS --jars target/scala-2.12/trialgcs_2.12-0.0.1.jar --cluster <CLUSTERNAME> --region=<REGIONNAME>
但是,这会产生错误 java.lang.NoClassDefFoundError: com/google/cloud/storage/Storage
.
如果手动包含cloudstorage jar,则 --jars
在上一个命令中
--jars target/scala-2.12/trialgcs_2.12-0.0.1.jar,google-cloud-storage-1.113.15.jar
错误现在是 java.lang.NoClassDefFoundError: com/google/cloud/Service
.
所以,很显然,这是一个缺少图书馆的问题。
另一方面,如果我使用 spark-shell --packages "com.google.cloud:google-cloud-storage:1.113.15"
通过dataproc驱动程序的vm中的ssh,所有这些都可以完美地工作。
如何解决这个问题?
2条答案
按热度按时间ohtdti5x1#
如果确保在驱动程序机器中有依赖jar,那么可以显式地将jar添加到类路径中。您可以通过以下命令尝试,
dgiusagp2#
我找到了解决方案:为了正确管理包依赖性,google云存储库需要通过
--properties=spark.jars.packages=<MAVEN_COORDINATES>
,如中所示https://cloud.google.com/dataproc/docs/guides/manage-spark-dependencies . 对我来说这意味着当包或多个属性需要多个maven坐标时,需要转义字符串:https://cloud.google.com/sdk/gcloud/reference/topic/escaping
例如,对于google云存储和kafka: