Google cloud storage NoSuchMethodError StorageObject.getTimeCreated正在Dataproc中运行作业

Google cloud storage NoSuchMethodError StorageObject.getTimeCreated正在Dataproc中运行作业,google-cloud-storage,google-cloud-dataproc,Google Cloud Storage,Google Cloud Dataproc,我正在试着做一份在当地工作的工作。它使用谷歌存储。我得到了这个错误: Exception in thread "main" java.lang.NoSuchMethodError: com.google.api.services.storage.model.StorageObject.getTimeCreated()Lcom/google/api/client/util/DateTime; at com.google.cloud.storage.BlobInfo.fromPb(BlobI

我正在试着做一份在当地工作的工作。它使用谷歌存储。我得到了这个错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.api.services.storage.model.StorageObject.getTimeCreated()Lcom/google/api/client/util/DateTime;
    at com.google.cloud.storage.BlobInfo.fromPb(BlobInfo.java:798)
    at com.google.cloud.storage.Blob.fromPb(Blob.java:641)
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:139)
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:132)
...
Dataproc作业正在使用
gcloud-java-storage-0.2.8.jar
,我尝试了
google-api-services-storage-v1-rev62-1.21.0.jar
google-api-services-storage-v1-rev83-1.22.0.jar
,但都没有成功,即使定义了该方法。看起来它没有使用正确版本的GoogleAPI服务存储,但我不知道除了上传和指定jar之外还能做什么


有什么我遗漏的吗?

看起来问题在于Dataproc中内置的GCS连接器当前是
google-api-services-storage-v1
版本。
com.google.api.services.storage.model.StorageObject.getTimeCreated()
方法仅在较新版本中添加,因此当较旧版本在类路径上获胜时,您会遇到错误。在验证完全向后兼容性之后,我们可能会在不久的将来更新该版本

同时,您可以尝试在自己的fatjar中使用shade插件重新打包
com.google.api.services.storage.*
包,就像使用GCS连接器一样,以避免与使用自己的Guava版本的用户发生类路径冲突,或者您可以尝试自己重新编译GCS连接器,并使用init操作将其交换到Dataproc集群中(您基本上可以在此处逐字复制/粘贴所有内容,但需要提供GCS存储桶的第一行除外):


我在Dataproc的1.0映像版本中遇到了同样的问题。我通过在集群初始化操作中添加以下内容解决了此问题:

#!/bin/bash

rm /usr/lib/hadoop/lib/bigquery-connector-0.10.1-hadoop2.jar
rm /usr/lib/hadoop/lib/gcs-connector-1.6.0-hadoop2.jar

rm /usr/lib/hadoop/lib/guava-11.0.2.jar
gsutil cp gs://my-bucket/jars/guava-18.0.jar /usr/lib/hadoop/lib/
此外,我使用以下maven配置将Spark应用程序jar构建为胖jar:

    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-storage</artifactId>
        <version>v1-rev97-1.22.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.cloud.bigdataoss</groupId>
        <artifactId>gcs-connector</artifactId>
        <version>1.6.0-hadoop2</version>
    </dependency>

com.google.api
谷歌api服务存储
v1-rev97-1.22.0
com.google.cloud.bigdataoss
地面军事系统连接器
1.6.0-hadoop2

首先,非常感谢您,丹尼斯。我尝试了您的指令来重新编译和交换,当我尝试运行一个作业时,我得到了以下错误:
=============Cloud Dataproc代理错误=================com.google.api.client.util.SecurityUtils.loadKeyStore(SecurityUtils.java:84)上的java.lang.NullPointerException位于com.google.api.client.getCertificateTrustStore(GoogleUtils.java:76)在com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport(GoogleNetHttpTransport.java:55)
。有什么线索吗?我也在尝试Hadoop FS,但作业失败:
ExitCodeException exitCode=52:org.apache.Hadoop.util.Shell.runCommand(Shell.java:545)…
。我仍在尝试调试Hadoop本身,但它似乎是相关的:如果我运行我的作业,用一条简单的stdout消息代替编写,它就会工作。使用
Path foo=new Path(“gs://my bucket/my data.txt”)
style终于对我起作用了,谢谢!@Dennis您的解决方案在我的集群上确实起了作用,是否计划对此进行修复?谢谢您的帮助
#!/bin/bash

rm /usr/lib/hadoop/lib/bigquery-connector-0.10.1-hadoop2.jar
rm /usr/lib/hadoop/lib/gcs-connector-1.6.0-hadoop2.jar

rm /usr/lib/hadoop/lib/guava-11.0.2.jar
gsutil cp gs://my-bucket/jars/guava-18.0.jar /usr/lib/hadoop/lib/
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-storage</artifactId>
        <version>v1-rev97-1.22.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.cloud.bigdataoss</groupId>
        <artifactId>gcs-connector</artifactId>
        <version>1.6.0-hadoop2</version>
    </dependency>