BigQuery с Airflow — отсутствует идентификатор проекта

Пример ниже:

https://cloud.google.com/blog/big-data/2017/07/how-to-aggregate-data-for-bigquery-using-apache-airflow

При выполнении одной из команд:

airflow test bigquery_github_trends_v1 bq_check_githubarchive_day 2017-06-02

получаю сообщение об ошибке: TypeError: отсутствует обязательный параметр "projectId"

Стек ошибок:

[2017-09-11 16:32:26,630] {models.py:1126} INFO - Dependencies all met for <TaskInstance: bigquery_github_trends_v1.bq_check_githubarchive_day 2017-06-02 00:00:00 [None]>
[2017-09-11 16:32:26,631] {models.py:1126} INFO - Dependencies all met for <TaskInstance: bigquery_github_trends_v1.bq_check_githubarchive_day 2017-06-02 00:00:00 [None]>
[2017-09-11 16:32:26,632] {models.py:1318} INFO - 
-----------------------------------------------------------------------
---------
Starting attempt 1 of 6
-----------------------------------------------------------------------
---------

[2017-09-11 16:32:26,632] {models.py:1342} INFO - Executing <Task(BigQueryCheckOperator): bq_check_githubarchive_day> on 2017-06-02 00:00:00
[2017-09-11 16:32:26,643] {check_operator.py:75} INFO - Executing SQL check: 
#legacySql
SELECT table_id 
FROM [githubarchive:day.__TABLES__] 
WHERE table_id = "20170601"

[2017-09-11 16:32:26,646] {gcp_api_base_hook.py:73} INFO - Getting connection using `gcloud auth` user, since no key file is defined for hook.
[2017-09-11 16:32:26,671] {models.py:1417} ERROR - Missing required parameter "projectId"
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/airflow/models.py", line 1374, in run
result = task_copy.execute(context=context)
  File "/usr/local/lib/python2.7/site-packages/airflow/operators/check_operator.py", line 76, in execute
records = self.get_db_hook().get_first(self.sql)
  File "/usr/local/lib/python2.7/site-packages/airflow/hooks/dbapi_hook.py", line 135, in get_first
cur.execute(sql)
  File "/usr/local/lib/python2.7/site-packages/airflow/contrib/hooks/bigquery_hook.py", line 752, in execute
self.job_id = self.run_query(bql)
  File "/usr/local/lib/python2.7/site-packages/airflow/contrib/hooks/bigquery_hook.py", line 244, in run_query
return self.run_with_configuration(configuration)
  File "/usr/local/lib/python2.7/site-packages/airflow/contrib/hooks/bigquery_hook.py", line 498, in run_with_configuration
.insert(projectId=self.project_id, body=job_data) \
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery.py", line 716, in method
raise TypeError('Missing required parameter "%s"' % name)
TypeError: Missing required parameter "projectId"

person axrd    schedule 12.09.2017    source источник


Ответы (2)


Если вы проверите код для bigquery_hook, вы обнаружите, что он проверяет project_id, https://github.com/apache/incubator-airflow/blob/master/airflow/contrib/hooks/bigquery_hook.py#L54.

Соединение по умолчанию — bigquery_default, если вы не переопределите его, перейдите в пользовательский интерфейс Airflow, перейдите в admin -> connection -> bigquery_default (или что-то еще, что вы создали) -> добавьте туда идентификатор проекта.

введите здесь описание изображения

person Chengzhi    schedule 12.09.2017
comment
Это очень полезно, есть идеи, как установить это программно? - person Datageek; 24.04.2018

Я знаю, что это старый вопрос, но я тоже боролся, так как для меня не работал пользовательский интерфейс. Только что узнал, как это сделать через CLI, и хотел поделиться своими выводами, поскольку это не задокументировано.

На самом деле есть три пути:

  1. Через переменную среды, как указано здесь
export AIRFLOW_CONN_BIGQUERY_DEFAULT=google-cloud-platform://:@:?extra__google_cloud_platform__project=yourprojectid&extra__google_cloud_platform__key_path=/path/to/keyfile.json
  1. Через кли и URI
airflow connections -d --conn_id bigquery_default
airflow connections -a --conn_id bigquery_default --conn_uri 'google-cloud-platform://:@:?extra__google_cloud_platform__project=yourprojectid&extra__google_cloud_platform__key_path=/path/to/keyfile.json'
  1. Через кли и параметры
airflow connections -d --conn_id bigquery_default
airflow connections -a --conn_id bigquery_default --conn_type google-cloud-platform --conn_extra '{"extra__google_cloud_platform__project":"yourprojectid", "extra__google_cloud_platform__key_path":"/path/to/keyfile.json"}'

Если вы пропустите ключевой путь, airflow будет использовать те учетные данные, которые в настоящее время используются инструментом командной строки gcloud. Обычно ваш личный пользователь.

Как только это будет сделано, вы можете запускать любые задачи, используя это соединение с airflow run ... или airflow test ....

person swenzel    schedule 08.03.2019
comment
Это было единственное, что сработало для меня (я сделал решение 2). Изменение его в пользовательском интерфейсе, похоже, не дало никакого эффекта. - person Stephen; 03.01.2020