Не удается создать конвейер Google Dataflow с кодом 400: неверный запрос / недопустимый грант

Я занимаюсь созданием и созданием шаблонов для потока данных Google уже более года. У меня никогда не было проблем с созданием шаблонов и их загрузкой в ​​gcs с помощью вызова options.setTemplateLocation(templatePath);. С сегодняшнего дня при создании конвейера с Pipeline.create(options); и запуске java-программы в eclipse я получаю следующее исключение:

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, но ошибка повторяется. Также при попытке запустить конвейер локально я получаю еще одну ошибку, но также с содержанием «invalid_grant» «плохой запрос». Перезагрузка ноутбука тоже не подействовала.

Мой pom определяет google-cloud-dataflow-java-sdk-all с версией 2.2.0, и обновление до 2.5.0 не повлияло.

Я могу копировать данные в корзину с помощью gsutil из командной строки. Но при запуске java-программы из командной строки с mvn compile exec:java -Dexec.mainClass=mypackage.Main я все равно получаю те же ошибки.

Моя функция для создания 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);
    }

Любая помощь высоко ценится.


person user2122552    schedule 25.09.2018    source источник


Ответы (2)


Вам не обязательно использовать служебную учетную запись, но вы все равно можете использовать gcloud, вам следует использовать следующую команду и войти в свою учетную запись:

gcloud auth application-default login
person Majico    schedule 06.03.2019
comment
Это не рекомендуется и вызывает предупреждение: ВНИМАНИЕ! Ваше приложение прошло аутентификацию с использованием учетных данных конечного пользователя из Google Cloud SDK. Мы рекомендуем вместо этого использовать в большинстве серверных приложений учетные записи служб. Если ваше приложение продолжает использовать учетные данные конечного пользователя из Cloud SDK, вы можете получить сообщение об ошибке превышения квоты или API не включен. Дополнительную информацию об учетных записях служб см. На странице cloud.google.com/docs/authentication. - person vdolez; 01.04.2021

Я нашел решение в документации по быстрому запуску.

Похоже, что аутентификация gcloud больше не используется, и вам нужно использовать учетную запись службы. Как и в документации, я создал учетную запись службы с ролью «проект / владелец» и загрузил ее json-файл в $ path.

Затем на моем Mac я использовал export GOOGLE_APPLICATION_CREDENTIALS="$path" и в том же сеансе использовал команду, упомянутую в вопросе, для компиляции и выполнения java-программы.

person user2122552    schedule 27.09.2018
comment
Старайтесь не вводить кого-то в заблуждение, если в чем-то не уверены на 100%. gcloud auth все еще используется, и установка GOOGLE_APPLICATION_CREDENTIALS также возможна. Оба работают нормально - person rand0mb0t; 21.05.2020