使用 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>
我正在 运行 编写示例 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>