Возможно ли создать конвейер, который ежедневно записывает базу данных SQL в MongoDB? - PullRequest
2 голосов
/ 20 апреля 2020

TL: DR Я хотел бы объединить возможности BigQuery с моим приложением MERN-стека. Лучше (а) использовать nodejs -biquery , чтобы написать API Node / Express напрямую с BigQuery, или (б) создать ежедневную работу, которая записывает мою (всю) базу данных BigQuery в MongoDB, а затем использовать mon goose, чтобы написать Node / Express API с MongoDB?

Мне нужно определить наилучший подход для объединения рабочего процесса ETL данных, который создает базу данных BigQuery, с веб-приложением реагирования / узла. ETL данных использует Airflow для создания рабочего процесса, который (а) выполняет резервное копирование ежедневных данных в GCS, (б) записывает эти данные в базу данных BigQuery и (c) запускает группу SQL для создания дополнительных таблиц в BigQuery. Мне кажется, что у меня есть только два варианта:

  1. Ежедневно записывать / конвертировать / переносить / переносить (независимо от правильного глагола) из базы данных BigQuery в MongoDB. У меня уже есть нод / express API, написанный с использованием mon goose, подключенный к кластеру MongoDB, и этот подход позволил бы мне сохранить этот API.
  2. Используйте библиотеку nodejs -biquery для создания API узла, который напрямую связан с BigQuery. Мое приложение будет меняться от стека MERN (BQ) ERN. Мне пришлось бы переписать API узла / express для работы с BigQuery, но мне больше не понадобился бы MongoDB (и не приходилось ежедневно переносить данные из BigQuery в Mon go). Однако BigQuery может быть очень медленной базой данных, если я ищу одну запись, поскольку она не предназначена для использования в качестве базы данных Mon go или SQL (у нее нет индекса, запрос на получение одной строки выполняется медленно, так как полное сканирование таблицы). Большинство моих вызовов API для очень небольшого количества данных из базы данных.

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

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Я иду с (1). Не должно быть слишком много работы, чтобы написать python скрипт, который запрашивает таблицы из BigQuery, преобразует и записывает коллекции в Mon go. Есть некоторые вещи, которые нужно обработать (инкрементные изменения и т. Д. c.), Однако это гораздо проще, чем написание совершенно нового API узла / большого запроса.

1 голос
/ 29 апреля 2020

FWIW В прошлой жизни я работал на веб-сайте электронной коммерции, на котором было 4 разных серверных базы данных. (Mon go, MySql, Redis, ElasticSearch), так что больше 1 не является проблемой вообще, но вам нужно рассматривать одну базу данных записи, IE, если между ними ничего не совпадает, одна источник правды, другой подозреваемый. Для моего примера, Redis и ElasticSearch были почти эфемерными - взорвать их, и они воссоздаются из неподвластных mysql и mon go источников. Теперь mySql и Mon go одновременно были немного странными, и мы были вынуждены медленно перемещаться. Это означает, что различные типы записей были переведены с MySql на mon go. Этот процесс выглядел примерно так: - Уровень ORM записывает как mysql, так и mon go, чтение все еще происходит из MySql. - данные регулярно сравниваются. - прошло несколько месяцев без каких-либо нарушений, записи в MySql отключены, а чтения перенесены в понедельник go.

Конечная цель больше не была MySql, все было в понедельник go. Я понизил эту касательную, потому что кажется, что вы могли бы делать подобное - записывать в обе базы данных на любом используемом вами уровне абстракции базы данных (ORM, DAO, другие вещи, которые я не в курсе с et c.) И в конечном итоге переместить читает в зависимости от того, где они должны go. Если вам нужны большие пакеты для записи, вы можете буферизовать на этом уровне абстракции, пока не будет достигнут порог по вашему выбору, прежде чем отправлять его.

С учетом всего сказанного, в зависимости от сложности ваших данных, ночное задание ETL будет вполне выполнимо, но вы сталкиваетесь с дополнительной сложностью управления и мониторинга этого дополнительного процесса. Другим потенциальным недостатком является то, что данные всегда устаревают за день.

...