google-cloud-storage - Cloud Dataproc 无法访问 Cloud Storage 存储分区
问题描述
我有一个云数据处理 Spark 作业,它也使用 Drvier 端的 Cloud Strage API(从同一文件夹中选择特定文件以使用)。
以下是 Maven 依赖项:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.101.0</version>
</dependency>
</dependencies>
这是失败的代码的最简单版本:
import com.google.cloud.storage._
object Test {
def main(args: Array[String]): Unit = {
val storage = StorageOptions.getDefaultInstance().getService()
--> storage.list("intent_raw")
}
}
这是堆栈跟踪:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at com.google.api.gax.retrying.BasicRetryingFuture.<init>(BasicRetryingFuture.java:84)
at com.google.api.gax.retrying.DirectRetryingExecutor.createFuture(DirectRetryingExecutor.java:88)
at com.google.api.gax.retrying.DirectRetryingExecutor.createFuture(DirectRetryingExecutor.java:74)
at com.google.cloud.RetryHelper.run(RetryHelper.java:75)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
at com.google.cloud.storage.StorageImpl.listBlobs(StorageImpl.java:372)
at com.google.cloud.storage.StorageImpl.list(StorageImpl.java:328)
--> at ai.mandal.cloud.dataproc.Test$.main(Test.scala:14)
at ai.mandal.cloud.dataproc.Test.main(Test.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:845)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:184)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:920)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
我的问题通常是什么会导致它,如果我从数据处理服务(可以访问存储桶)运行它,我是否需要为此配置单独的凭据。
解决方案
解决方案是添加
spark.executor.userClassPathFirst = true
spark.driver.userClassPathFirst = true
到工作属性。
该问题是由google-cloud-storage
在宿主环境中发现的 guava 版本冲突引起的。
Google 建议在您的依赖项中隐藏冲突的番石榴,我也尝试过,但这不适用于这种情况。
推荐阅读
- sql - 如何找到每个月“流出”的客户份额?(SQLite 或 Oracle)
- python - 将列表与元组列表进行比较
- python - 将 Azure Durable Functions 与 CosmosDBTrigger 结合使用
- mysql - 在同一查询中执行 2 个计数时的 mysql 问题
- pine-script - SMA 绿色蜡烛
- c++ - 为什么即使我有足够的空间来分配更多内存,分配内存也会失败?
- javascript - 使用子数组修改 JSON
- node.js - 本地运行的 NodeJS 中 SocketIO 生成的 URL
- powershell - PowerShell 导出 AD 用户 x509 证书并为用户导入 ADUC
- python - `zip()` 中生成器的额外 next()?