Как я могу атомарно вручную изменить схему таблицы BQ? - PullRequest
1 голос
/ 19 сентября 2019

У меня есть несколько таблиц, которые заполняются потоковым приложением GCP DataFlow как часть некоторых конвейеров данных (тот факт, что это DataFlow, здесь не так уж важен, за исключением того, что он заполняется на полурегулярной основе впотоковый режим).Эти таблицы используются нижестоящими процессами, которые зависят от имени таблицы.

Мне нужно разработать схему этих таблиц производственным способом.Следуя рекомендациям по документации BQ (https://cloud.google.com/bigquery/docs/manually-changing-schemas#option_2_exporting_your_data_and_loading_it_into_a_new_table),, я намереваюсь экспортировать текущую таблицу в формате AVRO в GCS, а затем создать новую таблицу * на основе новой обратно совместимой схемы и, наконец, загрузить экспорт AVRO в новую таблицу перед тем, какзатем перезаписываем исходную таблицу.

* Причина, по которой я создаю новую таблицу, а не пишу по той же самой таблице, заключается в том, что мне нужно убедиться, что эта операция выполнена успешно в нескольких проектах, с которыми я координирую эту эволюцию схемы, прежде чем«обновить» фактическую таблицу. В любом случае, я думаю, у меня возникла бы та же проблема, если бы я попытался обновить таблицу на месте.

Проблема

Проблема заключается в том, что междуПри запуске экспорта и завершении загрузки мое приложение DataFlow могло обновить исходную таблицу (она работает в режиме INSERT / OVERWRITE PARTITION). Это является проблемой, поскольку при обработке изменения схемы я потеряю эти данные.

Как мне безопасно обновить схему таблицы без пакетной передачи?sactions / распределенные транзакции / блокировки таблиц?Как упоминалось в приведенном выше блоке *, у меня есть дополнительная сложность, связанная с необходимостью использования прерывистой таблицы, чтобы гарантировать, что моя работа будет работать во всех проектах, прежде чем я обработаю ее в таблице, от которой зависят нисходящие компоненты.

Единственный вариант, который я могу придумать, - это пользовательская реализация поведения, которое я получу через блокировку, но через сотрудничество.Т.е. мой процесс обновления схемы может отправить сообщение в DataFlow, чтобы он отложил его до завершения своей работы.

1 Ответ

0 голосов
/ 20 сентября 2019

Я воспринимаю этот вопрос как «Как безопасно развить схему таблицы, когда у таблицы есть потоковые обновления».

Компоненты, затронутые изменением схемы:

  1. Потоковое приложение DataFlow (или Streamingисточник в целом)
  2. Таблица BigQuery (цель потоковой передачи)
  3. Пользователь таблицы

Я предлагаю сделать ниже, чтобы перенести схему из V1 в V2

Компоненты

  1. Версия приложения DataFlow
  2. Версия таблицы BigQuery
  3. (Необязательно) Длясвести к минимуму влияние пользователя, представление BigQuery, чтобы скрыть детализацию таблицы версий

Шаги миграции

  1. (предварительный шаг)Имея команду MERGE готов / проверена, которая объединяет данные из таблицы V1 в таблицу V2.
  2. Переключите приложение DataFlow на V2 и запишите в новую таблицу V2.
  3. Запустите MERGEкоманда для завершения переноса данных из таблицы V1 в таблицу V2.
  4. (если используется представление) Обновите представление до точкив таблицу V2.
  5. Удалите таблицу V1 после завершения проверки.

Этапы миграции с учетом отката

  1. (предварительный шаг) Наличие команды MERGE готов / проверен, которая объединяет данные из таблицы V1 в таблицу V2.
  2. Наличие приложения DataFlow V1 для записи в таблицу V1 и V2 для записи в новыйТаблица V2, одновременно.
  3. Запустите команду MERGE, чтобы завершить миграцию данных из таблицы V1 в таблицу V2.
  4. Проверка: исправно , остановите приложение DataFlowV1 и удалите таблицу V1.
  5. Проверка: плохо : остановите приложение DataFlow V2 и удалите таблицу V2.
  6. (если используется представление)Обновите представление так, чтобы оно указывало на таблицу V2.
...