Move STG->ODS to Airflow batch and align monitoring

This commit is contained in:
2026-02-08 16:36:01 +03:00
parent a7963c17b3
commit 284dc3dc1f
10 changed files with 536 additions and 335 deletions
+60 -15
View File
@@ -1,11 +1,12 @@
#!/usr/bin/env bash
#
# Скрипт batch-трансформации данных: ODS → DDS → DM
# Скрипт batch-трансформации данных: STG → ODS → DDS → DM
#
# Назначение:
# Запускает SQL-скрипты из sql/dds и sql/dm для преобразования данных между слоями:
# 1. ODSDDS : Сборка сущностей из типизированных данных
# 2. DDS → DM : Обновление сводки по качеству данных (dq_summary)
# Запускает SQL-скрипты из sql/ods, sql/dds и sql/dm для преобразования данных между слоями:
# 1. STGODS : Типизация и перенос ошибок в *_errors
# 2. ODS → DDS : Сборка сущностей из типизированных данных
# 3. DDS → DM : Обновление сводки по качеству данных (dq_summary)
#
# Как запускать:
# make transform
@@ -13,7 +14,7 @@
#
# Требования:
# - ClickHouse запущен (make up)
# - ODS содержит данные (make data выполнен)
# - STG содержит данные (make data выполнен)
#
# Стратегия:
# Сейчас: полная перезагрузка (TRUNCATE + INSERT) — для демо
@@ -25,6 +26,7 @@ set -euo pipefail
# Директория со скриптом
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SQL_ROOT_DIR="${SCRIPT_DIR}/../sql"
ODS_TRANSFORM_SQL="${SQL_ROOT_DIR}/ods/20_stg_to_ods.sql"
DDS_TRANSFORM_SQL="${SQL_ROOT_DIR}/dds/30_ods_to_dds.sql"
DM_TRANSFORM_SQL="${SQL_ROOT_DIR}/dm/40_dds_to_dm.sql"
@@ -47,6 +49,11 @@ fi
# -----------------------------------------------------------------------------
# Проверка: SQL-файлы batch существуют?
# -----------------------------------------------------------------------------
if [[ ! -f "${ODS_TRANSFORM_SQL}" ]]; then
echo "Ошибка: Не найден SQL-файл: ${ODS_TRANSFORM_SQL}"
exit 1
fi
if [[ ! -f "${DDS_TRANSFORM_SQL}" ]]; then
echo "Ошибка: Не найден SQL-файл: ${DDS_TRANSFORM_SQL}"
exit 1
@@ -58,27 +65,65 @@ if [[ ! -f "${DM_TRANSFORM_SQL}" ]]; then
fi
# -----------------------------------------------------------------------------
# Проверка: в ODS есть данные?
# Проверка: в STG есть данные?
# -----------------------------------------------------------------------------
ODS_COUNT=$(${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
STG_COUNT=$(${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--user="${CLICKHOUSE_USER}" \
--password="${CLICKHOUSE_PASSWORD}" \
--database="${CLICKHOUSE_DB}" \
--query="SELECT count() FROM ods.browser_event" 2>/dev/null || echo "0")
--query="
SELECT
(SELECT count() FROM stg.browser_raw)
+ (SELECT count() FROM stg.location_raw)
+ (SELECT count() FROM stg.device_raw)
+ (SELECT count() FROM stg.geo_raw) AS stg_rows_total
" 2>/dev/null || echo "0")
if [[ "${ODS_COUNT}" == "0" ]]; then
echo "Предупреждение: Таблица ODS.browser_event пуста."
if [[ "${STG_COUNT}" == "0" ]]; then
echo "Предупреждение: Таблицы STG пусты."
echo "Сначала загрузите данные: make data"
exit 1
fi
echo "Найдено ${ODS_COUNT} строк в ODS.browser_event"
echo "Найдено ${STG_COUNT} строк в STG (суммарно по 4 потокам)"
echo ""
# -----------------------------------------------------------------------------
# Шаг 1: ODSDDS (сборка сущностей)
# Шаг 1: STGODS (типизация и DQ)
# -----------------------------------------------------------------------------
echo "Шаг 1: Обновление DDS слоя (ODSDDS)..."
echo "Шаг 1: Обновление ODS слоя (STGODS)..."
${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--user="${CLICKHOUSE_USER}" \
--password="${CLICKHOUSE_PASSWORD}" \
--database="${CLICKHOUSE_DB}" \
--multiquery < "${ODS_TRANSFORM_SQL}"
echo " ✓ ODS обновлён"
# Показываем статистику ODS
echo ""
echo "Статистика ODS:"
${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--user="${CLICKHOUSE_USER}" \
--password="${CLICKHOUSE_PASSWORD}" \
--database="${CLICKHOUSE_DB}" \
--query="
SELECT 'ods.browser_event' AS table, count() AS rows FROM ods.browser_event
UNION ALL SELECT 'ods.location_event', count() FROM ods.location_event
UNION ALL SELECT 'ods.device_by_click', count() FROM ods.device_by_click
UNION ALL SELECT 'ods.geo_by_click', count() FROM ods.geo_by_click
UNION ALL SELECT 'ods.browser_event_errors', count() FROM ods.browser_event_errors
UNION ALL SELECT 'ods.location_event_errors', count() FROM ods.location_event_errors
UNION ALL SELECT 'ods.device_by_click_errors', count() FROM ods.device_by_click_errors
UNION ALL SELECT 'ods.geo_by_click_errors', count() FROM ods.geo_by_click_errors
FORMAT PrettyCompact
"
# -----------------------------------------------------------------------------
# Шаг 2: ODS → DDS (сборка сущностей)
# -----------------------------------------------------------------------------
echo ""
echo "Шаг 2: Обновление DDS слоя (ODS → DDS)..."
echo " - Очистка текущих данных (TRUNCATE)..."
# Очищаем таблицы перед загрузкой (полная перезагрузка для демо)
@@ -112,10 +157,10 @@ ${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--query="SELECT 'dds.click' AS table, count() AS rows FROM dds.click UNION ALL SELECT 'dds.event', count() FROM dds.event FORMAT PrettyCompact"
# -----------------------------------------------------------------------------
# Шаг 2: DDS → DM (сводка по качеству)
# Шаг 3: DDS → DM (сводка по качеству)
# -----------------------------------------------------------------------------
echo ""
echo "Шаг 2: Обновление DM слоя (DQ summary)..."
echo "Шаг 3: Обновление DM слоя (DQ summary)..."
${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--user="${CLICKHOUSE_USER}" \
--password="${CLICKHOUSE_PASSWORD}" \