По умолчанию GCS ClickPipe предполагает, что файлы добавляются в бакет в лексикографическом порядке. Однако GCS ClickPipe можно настроить на приём файлов без неявного порядка, создав подписку Google Cloud Pub/Sub, подключённую к бакету. Это позволяет ClickPipes отслеживать уведомления OBJECT_FINALIZE и принимать любые новые файлы независимо от схемы их именования.
Как это работает
В этом режиме GCS ClickPipe выполняет начальную загрузку всех файлов по выбранному пути, а затем отслеживает уведомления об объектах через подписку Pub/Sub, соответствующие указанному пути. Любые сообщения о ранее обнаруженном файле, о файле, не соответствующем пути, или о событии другого типа будут игнорироваться.
Чтобы выполнять приём только файлов, поступающих через подписку, включите Пропустить начальную загрузку. Когда эта опция включена, ClickPipes пропускает первоначальное сканирование существующих файлов по выбранному пути и обрабатывает только файлы, поступающие через подписку Pub/Sub.
При приёме данных могут возникать различные сбои, что может приводить к частичным вставкам или дублированию данных. ClickPipes для объектного хранилища устойчивы к сбоям вставки и обеспечивают семантику «ровно один раз» с помощью временных staging-таблиц. Сначала данные вставляются в staging-таблицу; если что-то идёт не так, staging-таблица очищается, и вставка повторяется с чистого состояния. Только после успешного завершения вставки партиции перемещаются в целевую таблицу.
Создайте топик Google Cloud Pub/Sub
1. В Google Cloud Console перейдите в Pub/Sub > Topics > Create topic. Создайте новый топик с подпиской по умолчанию и запишите Topic Name.
2. Настройте уведомление для бакета GCS, которое публикует события OBJECT_FINALIZE в созданный выше топик Pub/Sub.
2.1. Этот шаг нельзя выполнить в Google Cloud Console, поэтому необходимо использовать клиент gcloud или предпочитаемый вами программный интерфейс для Google Cloud. Например, с помощью gcloud:
# Create a Pub/Sub notification for new objects in the bucket
gcloud storage buckets notifications create "gs://${YOUR_BUCKET_NAME}" \
--topic="projects/${YOUR_PROJECT_ID}/topics/${YOUR_TOPIC_NAME}" \
--event-types="OBJECT_FINALIZE" \
--payload-format="json"
# List the Pub/Sub notifications in the bucket
gcloud storage buckets notifications describeНастройте сервисный аккаунт
1. Настройте сервисный аккаунт с необходимыми разрешениями, чтобы ClickPipes мог получать список объектов и считывать объекты в указанном бакете, а также получать и отслеживать уведомления из подписки Pub/Sub.
1.1. Этот шаг можно выполнить в Google Cloud Console, с помощью клиента gcloud или предпочитаемого вами программного интерфейса для Google Cloud. Например, с помощью gcloud:
# 1. Grant read access to the GCS bucket
gcloud storage buckets add-iam-policy-binding "gs://${YOUR_BUCKET_NAME}" \
--member="serviceAccount:${YOUR_SERVICE_ACCOUNT}@${YOUR_PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"
# 2. Grant read access to the Pub/Sub subscription
gcloud pubsub subscriptions add-iam-policy-binding "${YOUR_SUBSCRIPTION_NAME}" \
--member="serviceAccount:${YOUR_SERVICE_ACCOUNT}@${YOUR_PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/pubsub.subscriber"
# 3. Grant permission to get the Pub/Sub subscription metadata
gcloud pubsub subscriptions add-iam-policy-binding "${YOUR_SUBSCRIPTION_NAME}" \
--member="serviceAccount:${YOUR_SERVICE_ACCOUNT}@${YOUR_PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/pubsub.viewer"Создайте ClickPipe с неупорядоченным режимом
1. В консоли ClickHouse Cloud перейдите в Data Sources > Create ClickPipe и выберите Google Cloud Storage. Введите данные для подключения к вашему бакету GCS. В разделе Authentication method выберите Service Account и укажите .json-ключ сервисного аккаунта.
2. Включите Continuous ingestion, затем выберите Any order в качестве режима ингестии и укажите имя подписки Pub/Sub для подписки, подключённой к вашему бакету. Чтобы обрабатывать только файлы из подписки и пропустить начальное сканирование существующих файлов по выбранному пути, включите Skip initial load. Эта подписка должна использоваться исключительно этим ClickPipe — см. Создайте топик Google Cloud Pub/Sub. Имя подписки должно иметь следующий формат:
projects/${YOUR_PROJECT_ID}/subscriptions/${YOUR_SUBSCRIPTION_NAME}3. Нажмите Incoming data. Задайте Sorting key для целевой таблицы. При необходимости внесите изменения в сопоставленную схему, затем настройте роль для пользователя базы данных ClickPipes.
4. Проверьте конфигурацию и нажмите Create ClickPipe. Если не включён параметр Skip initial load, ClickPipes выполнит начальное сканирование вашего бакета, чтобы загрузить все существующие файлы, соответствующие указанному пути, а затем начнёт обрабатывать файлы по мере доставки из подписки соответствующих событий OBJECT_FINALIZE.