在 bigquery 中创建数据集时,谷歌 App 引擎出错

Posted

技术标签:

【中文标题】在 bigquery 中创建数据集时,谷歌 App 引擎出错【英文标题】:Error in google App engine when creating a dataset in bigquery 【发布时间】:2017-08-07 13:25:25 【问题描述】:

我正在开发一个 App Engine 应用程序来从 BigQuery 进行查询。当我创建一个 bigquery 实例,然后我想创建一个数据集或获取对数据集的引用时,会发生以下错误。这只发生在我在 App Engine 上部署应用程序时,但是当我使用本地应用程序引擎 sdk 测试我的应用程序时,我没有任何问题

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at com.google.api.gax.retrying.BasicRetryingFuture.<init> (BasicRetryingFuture.java:77)
at com.google.api.gax.retrying.DirectRetryingExecutor.createFuture (DirectRetryingExecutor.java:75)
at com.google.cloud.RetryHelper.runWithRetries (RetryHelper.java:53)
at com.google.cloud.bigquery.BigQueryImpl.getDataset (BigQueryImpl.java:227)
at com.google.cloud.bigquery.BigQueryImpl.getDataset (BigQueryImpl.java:218)
at com.example.Edmonds.myapplication.backend.MyServlet.doGet (MyServlet.java:75)
at javax.servlet.http.HttpServlet.service (HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service (HttpServlet.java:717)

我尝试这样做的部分如下:

InputStream ios = getServletContext().getResourceAsStream("/WEB-INF/BackendTestMac-f8739513cc27.json") ;
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setServiceAccount(getServletContext().getResourceAsStream("/WEB-INF/BackendTestMac-f8739513cc27.json"))
                .setDatabaseUrl("https://backendtestmac.firebaseio.com/")
                .build();

BigQuery bigQuery = BigQueryOptions.newBuilder().setProjectId("backendtestmac").setCredentials(ServiceAccountCredentials.fromStream(ios)).build().getService() ;

 String datasetId = "my_dataset_id";
 Dataset dataset = bigQuery.create(DatasetInfo.newBuilder(datasetId).build()) ;

【问题讨论】:

您是否尝试过使用适用于 App Engine 的 Java 8 运行时?还是这是 Java 7?我相信 Java 7 版本的 App Engine 可能与某些 Google Cloud 客户端库不兼容,因此如果需要 Java 7,您可能必须使用 Google API 客户端库developers.google.com/api-client-library/java/apis/bigquery/v2 @TimSwast 你如何告诉 Google Cloud 客户端库与哪个 Java 版本兼容? 如何在本地运行项目? 【参考方案1】:

我在做标准应用引擎教程时遇到了类似的异常:

在页面上:

    Error: Server Error
    The server encountered an error and could not complete your request.
    Please try again in 30 seconds

在服务器日志中

Error for /create
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
    at com.google.api.gax.retrying.BasicRetryingFuture.<init>(BasicRetryingFuture.java:77)
    at com.google.api.gax.retrying.DirectRetryingExecutor.createFuture(DirectRetryingExecutor.java:75)
    at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:53)
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:148)
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:141)
    at com.example.getstarted.util.CloudStorageHelper.uploadFile(CloudStorageHelper.java:65)
    at com.example.getstarted.basicactions.CreateBookServlet.doPost(CreateBookServlet.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.example.getstarted.util.DatastoreSessionFilter.doFilter(DatastoreSessionFilter.java:98)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.JdbcmysqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)

上传图片时,它在本地运行良好,但升级到 apppot 时崩溃

但是,在用户身份验证部分之后,登录后,我没有收到错误。如果是匿名的 - 得到那个错误。它可能在最近的补丁中被破坏。因为我认为他们不会在不提及它的情况下发布该核心教程。

教程链接为:https://cloud.google.com/java/getting-started-appengine-standard/tutorial-app

也许这会有所帮助。如果您发现更多信息,请告诉我!

【讨论】:

【参考方案2】:

您应该检查应用程序的类路径。很可能你的 CP 上有旧版本的番石榴

【讨论】:

以上是关于在 bigquery 中创建数据集时,谷歌 App 引擎出错的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样? [关闭]

谷歌分析导出设置到 Bigquery

谷歌数据工作室在不同时间显示不同数据值的问题(BigQuery+Data Studio)

在 BigQuery 中创建动态视图

如何在 BigQuery 中创建 UDF?例程名称缺失数据集

减去刚刚在 bigquery 中创建的列