Skip to main content

Обзор

В этой статье рассматривается процесс отправки данных из топика Kafka в таблицу ClickHouse. Мы будем использовать ленту недавних изменений Wiki, которая предоставляет поток событий, отражающих изменения, внесённые в различные ресурсы Wikimedia. Шаги включают:
  1. Как настроить Kafka на Ubuntu
  2. Настроить приём потока данных в топик Kafka
  3. Создать таблицу ClickHouse, которая подписывается на топик

1. Настройка Kafka на Ubuntu

  1. Создайте Ubuntu-инстанс ec2 и подключитесь к нему по SSH:
  1. Установите Kafka (по инструкции здесь: https://www.linode.com/docs/guides/how-to-install-apache-kafka-on-ubuntu/):
  1. Запустите ZooKeeper:
  1. Откройте новую консоль и запустите Kafka:
  1. Откройте третью консоль и создайте топик под названием wikimedia:
  1. Вы можете проверить, что он был успешно создан, выполнив:

2. Приём потока Wikimedia в Kafka

  1. Сначала понадобятся несколько утилит:
  1. Данные отправляются в Kafka с помощью хитроумной команды curl, которая получает последние события Wikimedia, извлекает JSON и отправляет его в топик Kafka:
  1. Вы можете посмотреть описание топика:
  1. Давайте убедимся, что всё работает, обработав несколько событий:
  1. Нажмите Ctrl+c, чтобы прервать выполнение предыдущей команды.

3. Приём данных в ClickHouse

  1. Вот как выглядят входящие данные:
  1. Нам понадобится движок таблицы Kafka, чтобы считывать данные из топика Kafka:
  1. По какой-то причине движок таблицы Kafka, похоже, берёт публичный URL ec2 и преобразует его в частное DNS-имя, поэтому мне пришлось добавить его в локальный файл /etc/hosts:
  1. Вы можете считывать данные из таблицы Kafka — для этого нужно лишь включить одну настройку:
Строки должны отобразиться в корректно разобранном виде в соответствии со столбцами, определёнными в таблице wikiQueue:
  1. Нам нужна таблица MergeTree для хранения поступающих событий:
  1. Давайте определим materialized view, которое будет срабатывать при вставке в таблицу Kafka и отправлять данные в нашу таблицу rawEvents:
  1. Почти сразу вы увидите, как данные начинают поступать в rawEvents:
  1. Давайте посмотрим на несколько строк:
  1. Давайте посмотрим, какие типы событий поступают:
Давайте определим materialized view, построенную поверх нашей текущей materialized view. Мы будем отслеживать агрегированную статистику по минутам:
  1. Чтобы увидеть результаты, нам понадобятся функции -Merge:
Последнее изменение 3 июля 2026 г.