使用 BigQuery 遇到问题

Getting Issue with BigQuery

我正在 运行 编写示例 Java 代码,我试图在其中获取 BigQuery table 的描述。当我 运行 它在我的本地时,它工作正常。但是当我去 google 云并在 GCS 中部署 jar 并通过 dataproc 运行 它时,我遇到了以下问题

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:88)  
    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.bigquery.BigQueryImpl.getTable(BigQueryImpl.java:665)

示例代码:

private static BigQuery bigquery = null;
    static {
        bigquery = BigQueryOptions.newBuilder()
                .setProjectId("**PROJECT_ID**")
                .build().getService();
    }
 public static void getTable(String projectId, String datasetName, String tableName) {
        try {
           TableId tableId = TableId.of(projectId, datasetName, tableName);
            Table table = bigquery.getTable(tableId);
            System.out.println("Table info: " + table.getDescription());
        } catch (BigQueryException e) {
            System.out.println("Table not retrieved. \n" + e.toString());
        }
    }

pom.xml - 这是我 pom.xml 中唯一的依赖项。我从早期的 pos 中看到了检查番石榴依赖冲突的建议,但就我而言,我没有看到冲突,因为我没有其他可能与此冲突的依赖。

<dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-bigquery</artifactId>
            <version>1.116.10</version>
</dependency>

在 Dataproc ui 中,我通过将作业类型作为 Spark 传递来提交此作业。

一般来说,java.lang.NoSuchMethodError 通常表示正在使用 API 的两个不同版本,并且编译后的代码期望的版本与部署站点实际存在的版本不同。在这种情况下, com.google.common.util.concurrent.MoreExecutors 似乎是冲突的依赖项。 IIRC 它是 Google 番石榴的一部分。

如果方法MoreExecutors.directExecutor()最近有修改,请查看guava的版本历史,并将部署的guava版本与本地版本进行比较。

此问题已解决。番石榴库发生冲突

<dependency>
     <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-shared-dependencies</artifactId>
      <version>0.13.0</version>
      <type>pom</type>
      <scope>import</scope>
</dependency>
<dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-bigquery</artifactId>
       <version>1.116.10</version>
       <exclusions>
           <exclusion>
               <groupId>com.google.guava</groupId>
               <artifactId>guava-jdk5</artifactId>
           </exclusion>
           <exclusion>
               <groupId>com.google.guava</groupId>
               <artifactId>guava</artifactId>
           </exclusion>
           <exclusion>
               <groupId>com.google.guava</groupId>
               <artifactId>failureaccess</artifactId>
           </exclusion>
           <exclusion>
               <groupId>com.google.guava</groupId>
               <artifactId>listenablefuture</artifactId>
           </exclusion>
       </exclusions>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.0-jre</version>
</dependency>

并将 com.google.com 包重新定位到 shaded

<relocations>
  <relocation>
    <pattern>com.google.common</pattern>                               
    <shadedPattern>shaded.com.google.common</shadedPattern>
  </relocation>
</relocations>