Требования к конвейеру
- Исходная подписка Pub/Sub должна существовать.
- Сообщения, публикуемые в подписку, должны быть корректным JSON.
- Целевая таблица ClickHouse должна существовать, а имена её столбцов должны совпадать с именами полей в полезной нагрузке JSON.
- Хост ClickHouse должен быть доступен с машин воркеров Dataflow.
- Должен быть указан как минимум один пункт назначения dead-letter (
clickHouseDeadLetterTableилиdeadLetterTopic). Если указаны оба, сообщения с ошибками направляются в оба пункта назначения одновременно. - Если задан
clickHouseDeadLetterTable, таблица dead-letter уже должна существовать в ClickHouse со схемой, показанной в разделе Обработка dead-letter. - Если задан
deadLetterTopic, топик Pub/Sub уже должен существовать.
Параметры шаблона
Значения по умолчанию для всех параметров
ClickHouseIO можно найти в разделе ClickHouseIO Apache Beam Connector.Формат сообщения и сопоставление со схемой
- Получает схему целевой таблицы ClickHouse.
- Создает схему Beam
Rowна основе схемы ClickHouse. - Для каждого входящего сообщения Pub/Sub разбирает полезную нагрузку JSON и формирует строку, считывая поля с именами из схемы ClickHouse.
Преобразование типов
Батчинг и оконная обработка
Подбирая эти значения, вы находите баланс между задержкой и эффективностью вставки. Меньшие окна снижают сквозную задержку; большие окна дают меньшее число более крупных батчей
INSERT.
Обработка dead-letter
clickHouseDeadLetterTable или deadLetterTopic; если заданы оба, сообщения с ошибками будут отправлены в оба.
Таблица ClickHouse dead-letter
clickHouseDeadLetterTable, таблица dead-letter уже должна существовать со следующей фиксированной схемой:
Минимальное определение для одновузлового развертывания:
Адаптируйте движок и предложение
ORDER BY под своё развертывание — используйте ReplicatedMergeTree для реплицируемых таблиц, добавьте ON CLUSTER для распределённых развертываний и при необходимости настройте партиционирование или TTL.dead-letter-топик Pub/Sub
deadLetterTopic, каждое сообщение, обработка которого завершилась ошибкой, повторно публикуется в топик со следующим содержимым:
- Полезная нагрузка: исходные байты сообщения.
- Атрибут
errorMessage: сообщение исключения, зафиксированное в момент сбоя. - Атрибут
failedAt: временная метка времени обработки, соответствующая моменту сбоя строки.
Запуск шаблона
Pub/Sub to ClickHouse доступен в Google Cloud Console.
Обязательно ознакомьтесь с этим документом, особенно с разделами выше, чтобы полностью понять требования к конфигурации шаблона и необходимые предварительные условия.
-
Нажмите кнопку
CREATE JOB FROM TEMPLATE. - Когда откроется форма шаблона, введите имя задачи и выберите нужный регион.
-
В поле
Dataflow TemplateвведитеClickHouseилиPub/Subи выберите шаблонPub/Sub to ClickHouse. -
После выбора форма развернётся. Заполните:
- входную подписку Pub/Sub в формате
projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_NAME>. - URL конечной точки ClickHouse — для ClickHouse Cloud используйте
https://<HOST>:8443. - базу данных ClickHouse, целевую таблицу, имя пользователя и пароль.
- как минимум один пункт назначения dead-letter: таблицу ClickHouse или топик Pub/Sub (или оба варианта).
- входную подписку Pub/Sub в формате
-
При необходимости настройте батчинг (
windowSeconds,batchRowCount) и параметры тонкой настройкиClickHouseIO, как подробно описано в разделе Параметры шаблона.
Отслеживание задачи
PubSubToClickHouse; их можно просмотреть на странице задания Dataflow:
Устранение неполадок
Ошибка превышения общего лимита памяти (код 241)
- Увеличьте ресурсы инстанса: переведите ClickHouse server на более крупный инстанс с большим объёмом памяти, чтобы он справлялся с нагрузкой при обработке данных.
- Уменьшите размер батча: сократите
batchRowCount(и/илиmaxInsertBlockSize) в конфигурации задачи Dataflow, чтобы отправлять в ClickHouse меньшие фрагменты данных и снизить потребление памяти на батч.
Все сообщения отправляются в пункт назначения dead-letter
- Имена JSON-полей не совпадают в точности с именами столбцов ClickHouse (сопоставление чувствительно к регистру).
- Значение JSON невозможно привести к типу столбца (например, строку не в формате ISO-8601 в столбце
DateTime). - Схема целевой таблицы изменилась после запуска конвейера — схема загружается один раз при запуске. Перезапустите задачу после внесения изменений в схему.
error_message и stack_trace в таблице dead-letter ClickHouse (или атрибут errorMessage в сообщениях Pub/Sub dead-letter), чтобы определить первопричину.
Конвейер запускается, но строки не поступают в ClickHouse
- Убедитесь, что подписка получает сообщения — проверьте метрику
messages-receivedна странице задачи Dataflow. - В режиме по времени (только
windowSeconds) строки сбрасываются на диск только на границах окна. УменьшитеwindowSeconds, чтобы проверить, происходят ли сбросы. - Проверьте сетевую доступность между воркерами Dataflow и конечной точкой ClickHouse (брандмауэр, пиринг VPC или Private Service Connect).
Исходный код шаблона
GoogleCloudPlatform/DataflowTemplates— основной репозиторий Google Cloud Platform.ClickHouse/DataflowTemplates— форк ClickHouse.