Google cloud storage Google数据流管道创建失败,400:请求错误/授权无效

Google cloud storage Google数据流管道创建失败,400:请求错误/授权无效,google-cloud-storage,google-cloud-dataflow,google-authentication,bad-request,Google Cloud Storage,Google Cloud Dataflow,Google Authentication,Bad Request,一年多以来,我一直在为谷歌数据流构建和创建模板。我从来并没有遇到过创建模板并使用选项将其上传到gcs的问题呼叫。从今天开始,当使用Pipeline.create(选项)创建管道时并在eclipse中运行java程序,我得到以下异常: Exception in thread "main" java.lang.RuntimeException: Failed to construct instance from factory method DataflowRunner#fromOptions(in

一年多以来,我一直在为谷歌数据流构建和创建模板。我从来并没有遇到过创建模板并使用
选项将其上传到gcs的问题呼叫。从今天开始,当使用
Pipeline.create(选项)创建管道时
并在eclipse中运行java程序,我得到以下异常:

Exception in thread "main" java.lang.RuntimeException: Failed to construct instance from factory method DataflowRunner#fromOptions(interface org.apache.beam.sdk.options.PipelineOptions)
    at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:233)
    at org.apache.beam.sdk.util.InstanceBuilder.build(InstanceBuilder.java:162)
    at org.apache.beam.sdk.PipelineRunner.fromOptions(PipelineRunner.java:52)
    at org.apache.beam.sdk.Pipeline.create(Pipeline.java:142)
    at mypackage.PipelineCreation.getTemplatePipeline(PipelineCreation.java:34)
    at myotherpackage.Main.main(Main.java:51)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:222)
    ... 5 more
Caused by: java.lang.RuntimeException: Unable to verify that GCS bucket gs://my-projects-staging-bucket exists.
    at org.apache.beam.sdk.extensions.gcp.storage.GcsPathValidator.verifyPathIsAccessible(GcsPathValidator.java:92)
    at org.apache.beam.sdk.extensions.gcp.storage.GcsPathValidator.validateOutputFilePrefixSupported(GcsPathValidator.java:61)
    at org.apache.beam.runners.dataflow.DataflowRunner.fromOptions(DataflowRunner.java:228)
    ... 10 more
Caused by: com.google.api.client.http.HttpResponseException: 400 Bad Request
{
  "error" : "invalid_grant",
  "error_description" : "Bad Request"
}
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1070)
    at com.google.auth.oauth2.UserCredentials.refreshAccessToken(UserCredentials.java:207)
    at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:149)
    at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:135)
    at com.google.auth.http.HttpCredentialsAdapter.initialize(HttpCredentialsAdapter.java:96)
    at com.google.cloud.hadoop.util.ChainingHttpRequestInitializer.initialize(ChainingHttpRequestInitializer.java:52)
    at com.google.api.client.http.HttpRequestFactory.buildRequest(HttpRequestFactory.java:93)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.buildHttpRequest(AbstractGoogleClientRequest.java:300)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
    at com.google.cloud.hadoop.util.ResilientOperation$AbstractGoogleClientRequestExecutor.call(ResilientOperation.java:166)
    at com.google.cloud.hadoop.util.ResilientOperation.retry(ResilientOperation.java:66)
    at org.apache.beam.sdk.util.GcsUtil.getBucket(GcsUtil.java:505)
    at org.apache.beam.sdk.util.GcsUtil.bucketAccessible(GcsUtil.java:492)
    at org.apache.beam.sdk.util.GcsUtil.bucketAccessible(GcsUtil.java:457)
    at org.apache.beam.sdk.extensions.gcp.storage.GcsPathValidator.verifyPathIsAccessible(GcsPathValidator.java:88)
    ... 12 more
我今天用另一个帐户登录到了gcloud,但用与项目相关联的帐户再次登录,
gcloud auth login
。 我也重新启动了Eclipse,但同样的错误不断发生。此外,当尝试在本地运行管道时,我还遇到另一个错误,但也有“无效的_grant”“错误的请求”内容。重启笔记本电脑也没有效果

我的pom定义了google云数据流java sdk,所有版本都是2.2.0,升级到2.5.0没有任何效果

我能够使用gsutil从命令行将数据复制到bucket。但是当使用mvn compile exec:java-Dexec.mainClass=mypackage.Main从命令行运行java程序时,我仍然会遇到相同的错误

我创建templatePipeline的函数如下所示:

public static Pipeline getTemplatePipeline(String jobName, String templatePath){
        DataflowPipelineOptions options = PipelineOptionsFactory.as(DataflowPipelineOptions.class);
        options.setProject("my-project-id");
        options.setRunner(DataflowRunner.class);
        options.setStagingLocation("gs://my-projects-staging-bucket/binaries");
        options.setTempLocation("gs://my-projects-staging-bucket/binaries/tmp");
        options.setGcpTempLocation("gs://my-projects-staging-bucket/binaries/tmp");
        options.setZone("europe-west3-a");
        options.setWorkerMachineType("n1-standard-2");
        options.setJobName(jobName);
        options.setMaxNumWorkers(2);
        options.setDiskSizeGb(40);
        options.setTemplateLocation(templatePath);
        return Pipeline.create(options);
    }

非常感谢您的帮助。

我在快速入门中找到了解决方案

似乎不再使用gcloud身份验证,您必须使用服务帐户。就像在文档中一样,我创建了一个角色为“project/owner”的服务帐户,并将其json文件下载到$path


然后在我的Mac电脑上,我使用了导出GOOGLE应用程序凭据=“$path”
,并在同一个会话中使用问题中提到的命令编译和执行java程序。

您不必使用服务帐户,仍然可以使用gcloud,您应该使用以下命令并使用您的帐户登录:

gcloud auth application-default login

如果你对某事没有100%的把握,尽量不要误导别人。gcloud auth仍在使用,设置GOOGLE_应用程序_凭据也是一个选项。这两种方法都有效,但不建议这样做,并生成警告:警告:您的应用程序已使用来自Google Cloud SDK的最终用户凭据进行身份验证。我们建议大多数服务器应用程序改用服务帐户。如果您的应用程序继续使用云SDK中的最终用户凭据,您可能会收到“超出配额”或“API未启用”错误。有关服务帐户的详细信息,请参阅。