Непрерывно реплицировать изменения из базы данных OLTP (например, Oracle, PostgreSQL, MySQL) в BigQuery с низкой задержкой.
→Используйте Datastream для выполнения Change Data Capture (CDC). Настройте его для потоковой передачи изменений непосредственно в BigQuery, который применяет их с помощью своей функции MERGE.
Почему: Datastream — это управляемый, бессерверный сервис CDC, который упрощает репликацию баз данных в реальном времени, не требуя пользовательских конвейеров или значительной нагрузки на исходную базу данных.
Источник↗
Потоковый конвейер Dataflow должен выдавать точные оконные результаты по времени события, несмотря на то, что некоторые события приходят на несколько часов позже.
→Настройте временные окна событий с allowedLateness, установленным для учета задержки. Используйте триггеры с ранними срабатываниями для предварительных результатов и накапливающие сработавшие панели для включения поздних данных.
Почему: Модель Dataflow с водными знаками, триггерами и допустимым опозданием предоставляет надежную основу для балансирования полноты и задержки при работе с неупорядоченными данными.
Конвейер Dataflow, записывающий данные в BigQuery, сталкивается с дубликатами после перезапусков или временных сбоев.
→Используйте приемник BigQuery Storage Write API (STORAGE_WRITE_API) с методом, установленным в "at-least-once" (по умолчанию, ранее STREAMING_INSERTS) или "exactly-once" (режим COMMITTED).
Почему: Storage Write API в режиме COMMITTED обеспечивает встроенную семантику "exactly-once" для потоковой передачи, устраняя необходимость в пользовательской логике дедупликации.
Прием данных из страничного, с ограничением скорости REST API с использованием Dataflow.
→Используйте SplittableDoFn для параллельной обработки страничного источника. Реализуйте логику ограничения скорости (например, с использованием Guava RateLimiter) и экспоненциальную задержку для повторных попыток внутри DoFn.
Почему: SplittableDoFn позволяет динамически перераспределять работу. Сочетание его с ограничением скорости и логикой повторных попыток создает отказоустойчивый и эффективный шаблон для работы с внешними API.
Один поток данных необходимо записать в несколько назначений (например, BigQuery, Bigtable, Cloud Storage).
→В одном конвейере Dataflow после первоначальной обработки примените несколько писателей PTransform к одной и той же конечной PCollection.
Почему: Шаблон "веерной" записи (fan-out) высокоэффективен, так как данные обрабатываются только один раз. Он позволяет избежать затрат и сложности запуска нескольких отдельных конвейеров, читающих из одного и того же источника.
Поток большого объема должен быть обогащен путем объединения с медленно меняющейся таблицей измерений (например, профили пользователей), которая периодически обновляется.
→Используйте шаблон бокового ввода (side input) в Dataflow. Загрузите таблицу измерений как PCollectionView. Настройте периодический триггер для обновления бокового ввода по расписанию, предотвращая перезапуски конвейера.
Почему: Боковые входы транслируют данные измерений всем рабочим для быстрого поиска в памяти, избегая вызовов API/БД для каждого элемента. Периодическое обновление эффективно обрабатывает изменения.
Рабочие нагрузки кластера Dataproc значительно меняются, что приводит либо к избыточному выделению ресурсов, либо к недостаточной производительности.
→Создайте кластер Dataproc с политикой автомасштабирования. Определите минимальное/максимальное количество первичных и вторичных рабочих узлов. Политика будет масштабировать кластер на основе метрик YARN.
Почему: Автомасштабирование оптимизирует затраты, сопоставляя ресурсы кластера с потребностями задания, масштабируясь вверх при больших нагрузках и вниз в периоды простоя.
Конвейер Dataflow требует пользовательских бинарных файлов, проприетарных библиотек или определенных версий, отсутствующих в стандартных образах рабочих узлов, и должен работать в VPC без доступа в интернет.
→Создайте пользовательский образ контейнера со всеми предварительно установленными зависимостями. Загрузите образ в Artifact Registry. Разверните конвейер с помощью Flex Template, который ссылается на пользовательский контейнер.
Почему: Flex Templates с пользовательскими контейнерами обеспечивают полный контроль над средой выполнения и зависимостями, что критически важно для автономных или специализированных сред.
Задание Dataflow или Spark, выполняющее GroupByKey, работает медленно, потому что некоторые ключи имеют непропорционально много значений ("горячий ключ").
→Реализуйте двухэтапную агрегацию (соление ключа). Сначала добавьте случайный суффикс к ключу, чтобы разделить горячий ключ между несколькими рабочими узлами. Частично агрегируйте. Во-вторых, удалите суффикс и агрегируйте частичные результаты.
Почему: Эта техника "веерного" распределения (fanout) вручную разделяет работу для горячего ключа, позволяя обрабатывать его параллельно и преодолевать узкое место.
Потоковый конвейер не должен завершаться с ошибкой из-за некорректно сформированных записей. Некорректные записи должны быть изолированы для анализа без остановки обработки.
→В DoFn используйте блок try-catch для парсинга. Используйте DoFn с несколькими выходами и TupleTag для маршрутизации валидных записей в основной выход и невалидных записей (с контекстом ошибки) в отдельный выход ошибок. Перенаправьте PCollection ошибок в целевое назначение для "мертвых" писем (dead-letter queue), например, в тему Pub/Sub или таблицу BigQuery.
Почему: Этот шаблон обеспечивает отказоустойчивость, изолируя некорректные данные, предотвращая сбои конвейера и гарантируя захват ошибочных записей для отладки и повторной обработки.