使用 Scala 和 Dataproc 的云存储客户端:缺少库
Cloud Storage Client with Scala and Dataproc: missing libraries
我正在尝试 运行 dataproc 集群中的一个简单的 spark 脚本,它需要使用 scala 和 java 云存储客户端库 read/write 到 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
错误现在是 java.lang.NoClassDefFoundError: com/google/cloud/Service
。
所以,显然这是缺少库的问题。
另一方面,如果我在 dataproc 驱动程序的 vm 中通过 ssh 使用 spark-shell --packages "com.google.cloud:google-cloud-storage:1.113.15"
,一切都完美无缺。
如何解决这个问题?
我找到了解决方案:要正确管理包依赖性,需要通过 --properties=spark.jars.packages=<MAVEN_COORDINATES>
包含 google-cloud-storage 库,如 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
例如,对于 google-cloud-storage 和 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
如果确定驱动机器中有依赖的jar,则可以在class路径中显式添加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>
我正在尝试 运行 dataproc 集群中的一个简单的 spark 脚本,它需要使用 scala 和 java 云存储客户端库 read/write 到 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
错误现在是 java.lang.NoClassDefFoundError: com/google/cloud/Service
。
所以,显然这是缺少库的问题。
另一方面,如果我在 dataproc 驱动程序的 vm 中通过 ssh 使用 spark-shell --packages "com.google.cloud:google-cloud-storage:1.113.15"
,一切都完美无缺。
如何解决这个问题?
我找到了解决方案:要正确管理包依赖性,需要通过 --properties=spark.jars.packages=<MAVEN_COORDINATES>
包含 google-cloud-storage 库,如 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
例如,对于 google-cloud-storage 和 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
如果确定驱动机器中有依赖的jar,则可以在class路径中显式添加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>