Как мне ждать асинхронной записи в таблицу в BigQuery, прежде чем объединять и экспортировать их в GCS? - PullRequest
0 голосов
/ 26 октября 2019

У меня есть система, работающая на Google Cloud Platform, и она работает следующим образом:

Во-первых, есть облачная функция, которая запускается при загрузке данных в определенную корзину. Затем он организует эти данные и генерирует задания процессора в формате «.json», которые сохраняются в другом сегменте.

Существует вторая облачная функция - ядро ​​системы, которая запускается этим «.json». загрузить. Затем он обрабатывает данные и записывает выходные результаты в набор данных BigQuery в виде одной таблицы.

Я также написал другую облачную функцию, которая объединяет все таблицы в этом наборе данных BigQuery и экспортирует ее в CSV в видеGoogle Cloud Storage.

Следовательно, возникает проблема: я могу вызывать эту последнюю агрегирующую функцию Cloud только после того, как все таблицы вставлены в BigQuery. Как мне это сделать? Как я могу вызвать эту функцию только после того, как все таблицы есть?

1 Ответ

1 голос
/ 26 октября 2019

Простого пути не существует, но у меня есть 2 предложения для этого

  • Если вы не ограничены во времени и если возможна последовательная обработка файла, вы можете сделать это
    • Первая функция выполняет разбиение и создает файл overview.json. Затем вызовите 2-ю функцию с параметром in, имя 1-го json в файле overwien.json
    • 2-я функция обрабатывает данные файла JSON в соответствии с параметром, записывает их в BQ. Затем вызовите 2-ю функцию со следующей записью в файле overview.json. Если это последняя запись, вызовите 3-ю функцию
    • 3-я функция вызывается после обработки всех данных

Она работает, но вы теряетесила распараллеливания.

  • Другим решением является использование Datastore / Firestore. И для этого
    • 1-я функция выполняет разделение и записывает в Datastore / Firestore запись со списком JSON-файлов для обработки и их статусом «необработанные».
    • 2-я функциязапускается при загрузке json (как сегодня), обрабатывает данные, записывает их в BigQuery, обновляет состояние файла JSON в Datastore / Firestore как «обработано» и вызывает третьи функции
    • Третья функция запрашивает хранилище данных/ Firestore и проверяет, все ли файлы json для обработки находятся в статусе «обработано». Если нет, выйдите из функции. Если да, выполните обработку в этой функции.

Я предпочитаю это решение. Вы должны позаботиться о состоянии гонки в последней функции (я могу дать вам подсказки, чтобы справиться с ней, если хотите), и вам нужно иметь глобальный идентификатор сборки, чтобы не смешивать обновление состояния двух разных исполнений (если есть 2параллельное выполнение 1-й функции)

ОБНОВЛЕНИЕ

Для условий гонки я обычно выполняю это

  • Создание пространства (таблицы или коллекции) где что-то регистрировать. В вашем случае это может быть с обзорным документом в Firestore.
  • 3-я функция, когда она проверила, что все детали были обработаны, проверить, работает ли 3-я функция
    • Если да, выход
    • Если нет, запишите уникальный идентификатор, сгенерированный функцией (например, UUID), в таблицу / коллекцию (в вашем Firestore)
  • 3-й снова прочитайте таблицу / коллекцию (в вашем Firestore) и проверьте, является ли сохраненный идентификатор его собственным идентификатором
    • Если да, обработайте
    • Если нет, выйдите из

это не идеально, но оно может охватывать большинство случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...