Как выполнить обратное заполнение при миграции redshift на bigquery?

#google-cloud-platform #google-bigquery

#google-cloud-platform #google-bigquery

Вопрос:

Я использую службу передачи данных BigQuery для переноса всех данных из redshift в bigquery.

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

Как я могу добиться этого в bigquery?

Комментарии:

1. Как ваши данные организованы в Redshift? Разделено ли оно по значениям в столбце «тип времени»? Откуда вы знаете, что некоторые данные могут отсутствовать? они уже отсутствовали в Redshift (поздние данные, которые появляются после приема), или вы подразумеваете, что отсутствующие значения подразумеваются службой переноса?

2. @chaiyachaiya, я хочу получить данные, которые поступили с опозданием после миграции до сих пор (за определенный промежуток времени)

3. Хорошо, очистите, и вы все еще хотите получать данные в Redshift, а затем в BigQuery, или вы хотите просто использовать Bigquery после переноса всех данных из Redshift? Кроме того, как вы помещаете данные в redshift? Используя какой-то потоковый API или накапливая данные в корзину S3, а затем периодически перенося данные в redshift? Откуда изначально поступают данные? API? другой сервис AWS?

4. Я вставляю данные в redshift с помощью инструментов ETL. я выполню перенос redshift на bigquery с помощью службы переноса bigquery. затем я буду продолжать выполнять преобразования ETL как для redshift, так и для bigquery до завершения. Но меня беспокоит то, что данные поступают после переноса redshift на biquery и перед запуском ETL для bigquery.. как заполнить эти данные?

Ответ №1:

Читая ваш вопрос в свете ваших комментариев, я бы поступил иначе, чем вы описали. Однако вы достигаете той же цели :).

Используя конвейер ETL, первым шагом будет накопление необработанных данных в потоке данных. Давайте возьмем для этого службу хранения, такую как S3. Для этого конвейера ETL S3 является вашим каналом передачи данных. Обратите внимание, что ваш конвейер не делает ничего, кроме как берет необработанные данные из A, чтобы поместить их в S3. Кроме того, местоположение в S3 должно находиться в папке с меткой времени, например, в день (например, ггггммдд), чтобы вы могли сортировать и использовать свои данные по измерению времени.
Очевидно, что рассмотренные данные опережают по времени те, которые у вас уже есть в Redshift. Возможно, это также структура, отличная от той, которую вы уже ввели в redshift, из-за потенциального преобразования, которое вы задали в своем первоначальном конвейере. Если вы устанавливаете необработанные данные непосредственно в redshift, просто экспортируйте данные в ту же корзину S3 под именем legacy/* . (В случае, если он будет преобразован, вам нужно поместить второй канал передачи данных S3 в свой конвейер с этим промежуточным преобразованием и сохранить ту же стратегию именования S3).

Давайте сделаем перерыв, чтобы понять, что у нас есть. Мы заполнили корзину S3 необработанными данными, которые теперь мы можем воспроизводить по желанию в определенный день с помощью cron или инструмента оркестровки, такого как Apache Airflow. Кроме того, вы можете свободно изменять содержимое каждой папки с временной меткой на случай, если вы пропустили данные, чтобы воспроизвести следующие конвейеры => нужное обратное заполнение.

Говоря об этом, S3 будет выступать в качестве источника данных для следующих конвейеров, которые будут устанавливать требуемые преобразования для необработанных данных из S3 и выбирать BigQuery и, возможно, Redshift в качестве канала передачи данных. Теперь, пожалуйста, примите во внимание стоимость этих операций. Потоковый API в BQ стоит дорого. Максимум 0,50 доллара за ГБ. Делайте это, только если вам нужен результат в реальном времени. Если вы можете позволить себе задержку более 5 минут, лучшей стратегией было бы установить GCS в качестве источника данных вашего ETL и перенести данные оттуда в BQ (обратите внимание, чтобы поместить данные в тот же шаблон именования файлов yyyymmdd, чтобы включить возможное обратное заполнение). Эта передача бесплатна, если корзина GCS и набор данных BQ находятся в одном регионе. Вы бы запустили передачу, например, с помощью событий GCS (запуск облачной функции при создании большого двоичного объекта, которая помещает данные в BQ).

И последнее, но не менее важное: обратное заполнение должно выполняться с умом, особенно в BQ, где обновление или создание на уровне строк не является формальным и является открытой дверью для дублирования. Что вам следует учитывать, так это раздел BigQuery, который вы можете установить для столбца, содержащего временную метку или скрытую, если ваши данные не содержат ее. Какая временная метка? Ну, тот, который указан в имени папки GCS! Еще раз вы можете изменять данные в своей корзине GCS каждый день и воспроизводить передачу в BQ. Но при каждой передаче с определенного дня необходимо перезаписывать раздел, к которому принадлежат рассматриваемые данные. (например: данные в 20200914 перезаписывают соответствующий раздел в BQ. Мы придерживаемся концепции выполнения чистой задачи, что гарантирует идемпотентность и отсутствие дублирования). Пожалуйста, прочтите эту статью, чтобы получить больше информации.

Примечание: Если вы намерены избавиться от Redshit, вы можете сделать это напрямую и забыть о S3 в качестве источника данных вашего первого ETL. Выберите непосредственно GCS (вход бесплатный) и перенесите уже имеющиеся данные Redshift в GCS, используя S3 в качестве промежуточной службы и службу Google transfer с S3 на GCS.

Комментарии:

1. Спасибо @chaiyachaiya, после прочтения вашего решения я могу сделать вывод относительно моей проблемы; во-первых, мне нужно будет создать два процесса ETL, один с redshift-sink (который уже запущен), второй — redshift на s3 / gcs (со структурой папок в формате yy / mm / dd). поэтому, как только я завершу миграцию redshift на bq, я легко смогу найти записи для определенного интервала дат

2. почти! первый конвейер, о котором я думаю, — это тот, который помещает необработанные данные в datalake (GCS или S3 со структурой yyyymmdd). Второй конвейер преобразует данные и помещает их непосредственно в Redshift amp; BQ или передает через промежуточную область в GCS или S3 (с той же организацией). В последнем случае вы можете использовать transfer API для передачи данных из GCS в BQ, используя partition, чтобы избежать дублирования (обратите внимание, что для прямого доступа к BQ dataflow предлагает вам соединитель, который позволяет избежать дублирования). Это понятнее?