Плюсы/минусы потоковой передачи в BigQuery напрямую через Google Pub/Sub + Dataflow

У нас есть API NodeJS, размещенный в Google Kubernetes Engine, и мы хотели бы начать запись событий в BigQuery.

Я вижу три разных способа сделать это:

В этом конкретном случае использования нам не нужно делать никаких преобразований и просто отправлять события прямо в нужный формат. Но позже мы можем использовать другие варианты использования, где нам нужно синхронизировать таблицы из нашего основного хранилища данных (MySQL) в BQ для аналитики, так что, возможно, начиная с Dataflow сразу стоит того?

Несколько вопросов:

  • Вариант 1 (отправка одного события прямо в BQ) кажется простым, если у вас нет каких-либо преобразований. Это так же быстро и надежно, как и публикация в Паб/Под тема? Я в основном обеспокоен задержкой и обработка ошибок/дублирования (https://cloud.google.com/bigquery/troubleshooting-errors#streaming). Может быть, это лучше сделать в отдельном процессе?
  • Для варианта 2 существуют ли какие-либо "пресеты" потока данных, которые не требуют, чтобы вы писали пользовательский код, когда все, что вам нужно, - это читать с Pub/Sub + надежно в BQ без каких-либо преобразований (возможно, только дедупликация/обработка ошибок )
  • Существуют ли какие-либо недостатки в отношении простого пользовательского рабочего (опция 3), который читает из Pub/Sub, а затем передает в BQ и выполняет ли все обработку/повторную обработку ошибок и т.д.?

Ответ 1

Для варианта 2 да, есть пресет, называемый шаблоном, предоставленным Google, который облегчает перемещение данных из PubSub в BigQuery без необходимости писать какой-либо код.

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

Ответ 2

Другой вариант - экспортировать журналы с помощью системного лога. Прямо из пользовательского интерфейса регистрации Stackdriver вы можете указать BigQuery (или другие адресаты) для своих журналов. Поскольку ваш API Node работает в Kubernetes, вам просто нужно записывать сообщения на stdout, и они автоматически будут записаны в Stackdriver.

Ссылка: https://cloud.google.com/logging/docs/export/configure_export_v2

Ответ 3

Я посмотрел на это, и мне кажется, что ответов немного не хватает. Вот что я могу рассказать вам о плюсах и минусах каждого подхода:

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

  2. Если ваши требования изменяются (например, выполнение потоковых вставок BQ становится слишком дорогим), Dataflow Java SDK без проблем поддерживает любой из вариантов: потоковые вставки или более дешевое выполнение нескольких заданий загрузки в BQ вместо потоковых вставок; и он также хорошо обрабатывает несколько источников данных.

  3. Поток данных обеспечивает автоматическое автоматическое масштабирование в случае увеличения объема данных.

Имея это в виду, я бы сказал:

  • Если ваш сценарий использования относительно прост, и у вас все в порядке с очень редкими точками данных, отбрасываемыми при перезапуске рабочих, тогда написанное пользователем приложение Node/Python должно помочь вам.

  • Если ваш вариант использования предусматривает только потоковую передачу PubSub на BQ, но вы должны убедиться, что данные не удалены, проверьте шаблон, предоставленный Эндрю, который делает именно это.

  • Если ваш вариант использования, вероятно, будет более сложным, чем это, вы можете заняться написанием своего собственного конвейера (и использовать код шаблона в качестве вдохновения !).