- Добавлен kafka-python==2.0.6 в airflow/requirements.txt - Создан dags/utils/kafka_helpers.py с функциями: - check_kafka_ready() — проверка доступности брокера - prepare_topics() — создание/сброс топиков через KafkaAdminClient - load_jsonl() — загрузка данных через KafkaProducer (limit=0 = все) - validate_load_params(), check_input_files() — валидация - Создан dags/kafka_load_dag.py с TaskGroup: - precheck: check_kafka, check_input_files, validate_load_params - ingest: prepare_topics, параллельная загрузка 4 потоков, verify_publish_counts - Параметры DAG: limit (0 = все), reset_topics, load_* (выбор потоков) - Обновлена документация: AGENTS.md, README.md, plans/runbook.md, plans/airflow_dags_plan.md, docs/ARCHITECTURE.md Тестирование: - Подключение к Kafka: ✅ (kafka:29092 доступен, брокер 2.6.0) - Загрузка данных: ✅ (1000 сообщений — полный файл browser_events) - Python синтаксис: ✅ (py_compile проходит) - Структура DAG: ✅ (все 9 задач корректно определены)
4.7 KiB
4.7 KiB
Runbook: запуск демо и загрузка данных
Этот документ фиксирует порядок действий и make‑таргеты. Он не описывает внутренности ClickHouse‑слоёв (это в plans/clickhouse_ddl.md).
Предпосылки
- Docker + Docker Compose.
- Доступ к Docker daemon (если
docker compose ...пишетpermission denied ... /var/run/docker.sock, добавьте пользователя в группуdockerили запускайте команды с правами, принятыми в вашей среде).
Быстрый сценарий
- Поднять инфраструктуру:
make up
- Залить данные в Kafka (два варианта):
Вариант А: Через Airflow DAG kafka_load (рекомендуется, фаза 2)
# Через CLI — полная загрузка по умолчанию
docker compose exec -T airflow-webserver airflow dags trigger kafka_load \
--conf '{"reset_topics": true}'
# Ограниченная загрузка — первые 100 строк
docker compose exec -T airflow-webserver airflow dags trigger kafka_load \
--conf '{"limit": 100, "reset_topics": true}'
# Или через UI: Airflow → DAGs → kafka_load → Trigger DAG with config
Параметры kafka_load:
limit— количество строк (default: 0 — все строки)reset_topics— пересоздать топики (default: true)load_browser/load_location/load_device/load_geo— выбор потоков (default: true)
Вариант Б: Через shell-скрипт make data (устаревший)
make data
make data не зависит от ClickHouse/DDL — достаточно, чтобы Kafka была поднята.
- Применить DDL в ClickHouse:
make ddl
Make таргеты
make up—docker compose up -d(поднимает весь стек изdocker-compose.yml).make ddl— применяет исполняемые SQL-файлы изsql/ddl/*в контейнер ClickHouse черезclickhouse-client.make data— пересоздаёт топики (по умолчанию) и публикует события изdata/*.jsonlв Kafka (1 строка = 1 Kafka message value).make transform— выполняет batch-процессSTG -> ODS -> DDS -> DMчерезscripts/run_batch.sh.
План реализации механики заливки (дизайн/решения): plans/kafka_ingest_plan.md.
План Airflow DAG'ов: plans/airflow_dags_plan.md.
Загрузка данных в Kafka (make data)
Топики
Скрипт использует фиксированный маппинг:
data/browser_events.jsonl→browser_eventsdata/location_events.jsonl→location_eventsdata/device_events.jsonl→device_eventsdata/geo_events.jsonl→geo_events
Режимы загрузки
- По умолчанию — “debug срез”: первые 50 строк каждого файла.
- Полная загрузка — весь файл.
Параметры (env):
LIMIT— сколько строк брать из каждого.jsonl. По умолчанию загружаются все записи (весь файл). Для ограничения используйтеLIMIT=50илиLIMIT=100.RESET_TOPICS— еслиRESET_TOPICS=1(по умолчанию), топики удаляются и создаются заново с теми же именами.BOOTSTRAP_SERVER— bootstrap для Kafka изнутри kafka‑контейнера (по умолчаниюkafka:29092).
Примеры:
# Загрузить все данные (по умолчанию)
make data
# Быстрый тест — 50 строк на поток
LIMIT=50 make data
# Ограниченная загрузка — 100 строк на поток
LIMIT=100 make data
# Дозалить данные без пересоздания топиков
RESET_TOPICS=0 make data
Применение DDL в ClickHouse (make ddl)
Скрипт исполняет SQL-файлы из sql/ddl/* по фиксированному порядку. Для ENGINE = Kafka важно, чтобы kafka_broker_list был доступен из контейнера ClickHouse.
В текущем compose:
- для соединений “контейнер → Kafka” используйте
kafka:29092; localhost:9092подходит только для клиентов на хосте.