Задание Google Cloud DataFlow выдает предупреждение через несколько часов - PullRequest
1 голос
/ 06 ноября 2019

Запуск потокового задания DataFlow с использованием выпуска 2.11.0. Через несколько часов я получаю следующую ошибку аутентификации:

File "streaming_twitter.py", line 188, in <lambda> 
File "streaming_twitter.py", line 102, in estimate 
File "streaming_twitter.py", line 84, in estimate_aiplatform 
File "streaming_twitter.py", line 42, in get_service 
File "/usr/local/lib/python2.7/dist-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper return wrapped(*args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/googleapiclient/discovery.py", line 227, in build credentials=credentials) 
File "/usr/local/lib/python2.7/dist-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper return wrapped(*args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/googleapiclient/discovery.py", line 363, in build_from_document credentials = _auth.default_credentials() 
File "/usr/local/lib/python2.7/dist-packages/googleapiclient/_auth.py", line 42, in default_credentials credentials, _ = google.auth.default() 
File "/usr/local/lib/python2.7/dist-packages/google/auth/_default.py", line 306, in default raise exceptions.DefaultCredentialsError(_HELP_MESSAGE) DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. 

Это задание потока данных выполняет запрос API к прогнозированию платформы AI и, похоже, срок действия маркера аутентификации истекает.

Фрагмент кода:

def get_service():
    # If it hasn't been instantiated yet: do it now
    return discovery.build('ml', 'v1',
                           discoveryServiceUrl=DISCOVERY_SERVICE,
                           cache_discovery=True)

Я попытался добавить следующие строки в сервисную функцию:

    os.environ[
        "GOOGLE_APPLICATION_CREDENTIALS"] = "/tmp/key.json"

Но я получаю:

DefaultCredentialsError: File "/tmp/key.json" was not found. [while running 'generatedPtransform-930']

Я предполагаю, что файл не находится на машине DataFlow. Другой вариант - использовать developerKey param в методе сборки, но, похоже, не поддерживается прогнозом AI Platform, я получаю сообщение об ошибке:

Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project."> [while running 'generatedPtransform-22624']

Нужно понять, как это исправить и каков лучший метод?

Есть предложения?

1 Ответ

1 голос
/ 11 ноября 2019

Настройка os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/tmp/key.json' работает только локально с DirectRunner. После развертывания на распределенном устройстве, таком как Dataflow, каждый работник не сможет найти локальный файл /tmp/key.json.

. Если вы хотите, чтобы каждый работник использовал определенную служебную учетную запись, выможет сообщить Beam, какую учетную запись службы использовать для идентификации работников.

Сначала предоставьте роль roles/dataflow.worker служебной учетной записи , которую вы хотите, чтобы ваши работники использовали. Нет необходимости загружать файл ключа учетной записи службы:)

Тогда, если вы позволяете PipelineOptions анализировать аргументы командной строки, вы можете просто использовать service_account_email параметр ,и укажите его как --service_account_email your-email@your-project.iam.gserviceaccount.com при запуске конвейера.

Учетная запись службы, указанная вашим GOOGLE_APPLICATION_CREDENTIALS, просто используется для запуска задания, но каждый работник использует учетную запись службы, указаннуюservice_account_email. Если service_account_email не передано, по умолчанию используется электронная почта из вашего GOOGLE_APPLICATION_CREDENTIALS файла.

...