Получение проблемы с BigQuery

Я запускаю пример кода Java, в котором пытаюсь получить описание таблицы BigQuery. Когда я запускаю его на своем локальном компьютере, он работает нормально. Но когда я иду в облако Google, развертываю банку в GCS и запускаю ее через 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. Я видел предложения из более раннего сообщения, чтобы проверить конфликт зависимостей гуавы, но в моем случае я не вижу конфликта, поскольку у меня нет другой зависимости, которая может конфликтовать с этим.

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

В пользовательском интерфейсе Dataproc я отправляю это задание, передавая тип задания как Spark.


person arunkindra    schedule 28.10.2020    source источник


Ответы (2)


Как правило, java.lang.NoSuchMethodError обычно указывает на то, что используются две разные версии API, и скомпилированный код ожидает версию, отличную от той, которая фактически присутствует на сайте развертывания. В этом случае кажется, что com.google.common.util.concurrent.MoreExecutors является конфликтующей зависимостью. IIRC является частью Google Guava.

Проверьте историю версий гуавы, если метод MoreExecutors.directExecutor() был изменен в последнее время, и сравните развернутую версию гуавы с вашей локальной.

person Alan47    schedule 28.10.2020
comment
Как я упоминал ранее, у меня есть только одна зависимость в моем pom, и я пытался исключить гуаву из зависимости большого запроса и добавить ее отдельно, что также не сработало для меня. - person arunkindra; 28.10.2020

Эта проблема решена. Произошел конфликт в библиотеке гуавы

<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 в затененный

<relocations>
  <relocation>
    <pattern>com.google.common</pattern>                               
    <shadedPattern>shaded.com.google.common</shadedPattern>
  </relocation>
</relocations> 
person arunkindra    schedule 30.10.2020