Если вы хотите полностью автоматизировать этот процесс, я бы сделал следующее:
- Создание Облачной функции для обработки экспорта :
Это более легкое решение, так как облачные функции не содержат серверов и обеспечивают гибкость реализации кода с помощью клиентских библиотек .См. quickstart , я рекомендую вам использовать консоль для создания функций для начала.
В этом примере я рекомендую вам запускать облачную функцию из HTTP-запроса , т. Е. Когда вызывается URL-адрес функции, он запускает код внутри нее.
Пример кода облачной функции в Python, который создает экспорт при выполнении HTTP-запроса:
main.py
from google.cloud import bigquery
def hello_world(request):
project_name = "MY_PROJECT"
bucket_name = "MY_BUCKET"
dataset_name = "MY_DATASET"
table_name = "MY_TABLE"
destination_uri = "gs://{}/{}".format(bucket_name, "bq_export.csv.gz")
bq_client = bigquery.Client(project=project_name)
dataset = bq_client.dataset(dataset_name, project=project_name)
table_to_export = dataset.table(table_name)
job_config = bigquery.job.ExtractJobConfig()
job_config.compression = bigquery.Compression.GZIP
extract_job = bq_client.extract_table(
table_to_export,
destination_uri,
# Location must match that of the source table.
location="US",
job_config=job_config,
)
return "Job with ID {} started exporting data from {}.{} to {}".format(extract_job.job_id, dataset_name, table_name, destination_uri)
needs.txt
google-cloud-bigquery
Обратите внимание, что задание будет выполняться асинхронно в фоновом режиме, вы получите ответ с идентификатором задания, который можно использовать для проверки состояния экспорта.задание в Cloud Shell, запустив:
bq show -j <job_id>
Создать Облачный планировщик запланированное задание :
Следуйте этой документации , чтобы начать работу.Вы можете установить частоту с помощью стандартного формата cron , например, 0 0 * * *
будет запускать задание каждый день в полночь.
В качестве цели выберите HTTP
в URL-адресеURL-адрес облачной функции (вы можете найти его в консоли, в деталях облачной функции, на вкладке Триггер), и в качестве HTTP method
выберите GET
.
Создайте его, и вы можете проверить егов облачном планировщике, нажав кнопку Run now
на консоли.
Синхронизируйте ваш внешний сервер и корзину :
До сих пор у вас был запланированный экспорт только для запуска каждые 24 часа, теперь для синхронизации содержимого корзины с вашим локальным компьютеромВы можете использовать команду gsutil rsync
.Если вы хотите сохранить импорт, скажем, в папку my_exports
, вы можете запустить на внешнем сервере:
gsutil rsync gs://BUCKET_WITH_EXPORTS /local-path-to/my_exports
Чтобы периодически запускать эту команду на вашем сервере, вы можете создать стандарт задание cron в вашем crontab на внешнем сервере, которое также запускается каждый день, всего на несколько часов позже, чем экспорт bigquery, чтобы гарантировать, что экспорт был выполнен.
Extra :
Я жестко закодировал большинство переменных в облачной функции, чтобы они всегда были одинаковыми.Однако вы можете отправить параметры в функцию, если вы делаете запрос POST
вместо запроса GET
и отправляете параметры в виде данных в теле.
Вам придется изменить планировщик облака.задание на отправку запроса POST
на HTTP-адрес облачной функции, и там же вы можете настроить тело для отправки параметров, например, table
, dataset
и bucket
.Это позволит вам запускать экспорт из разных таблиц в разные часы и в разные сегменты.