带有Scala和Dataproc的云存储客户端:缺少库



我正试图在dataproc集群中运行一个简单的spark脚本,该脚本需要使用scala和java云存储客户端库读取/写入gcs存储桶。脚本如下:

//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

错误现在是CCD_ 3。

所以,很明显,这是一个缺少图书馆的问题。

另一方面,如果我在dataproc驱动程序的vm中通过ssh使用spark-shell --packages "com.google.cloud:google-cloud-storage:1.113.15",那么一切都可以完美工作。

如何解决这个问题?

如果确保在驱动程序机器中有依赖的jar,则可以在类路径中显式添加jar。您可以通过以下命令尝试,

gcloud dataproc jobs submit spark  
--class DEV.TrialGCS 
--properties spark.driver.extraClassPath=<comma seperated full path of jars>,spark.jars.packages=com.google.cloud:google-cloud-storage:1.113.15 
--cluster <CLUSTERNAME> --region=<REGIONNAME>

我找到了解决方案:为了正确管理包依赖性,需要通过--properties=spark.jars.packages=<MAVEN_COORDINATES>包含google云存储库,如https://cloud.google.com/dataproc/docs/guides/manage-spark-dependencies。在我的情况下,这意味着

gcloud dataproc jobs submit spark --class DEV.TrialGCS 
--jars target/scala-2.12/trialgcs_2.12-0.0.1.jar 
--cluster <CLUSTERNAME> --region=<REGIONNAME> 
--properties=spark.jars.packages="com.google.cloud:google-cloud-storage:1.113.15"

当需要包或多个属性的多个maven坐标时,有必要转义字符串:https://cloud.google.com/sdk/gcloud/reference/topic/escaping

例如,对于谷歌云存储和kafka:

--properties=^#^spark.jars.packages=com.google.cloud:google-cloud-storage:1.113.15,org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1,io#spark.executor.extraClassPath=org.apache.kafka_kafka-clients-2.4.1.jar#spark.driver.extraClassPath=org.apache.kafka_kafka-clients-2.4.1.jar

最新更新