feat(dq): добавлен контроль качества конвейера

- Зачем:
  - конвейеру нужна публикуемая сводка текущего качества с красным завершением при нарушении договоров.
- Что:
  - добавлены DDL, публичное представление и пять сверок на естественном деловом зерне.
  - даг dq_check встроен после DM и публикует полные дневные партиции до именованных утверждений.
  - параллелизм DDS, DM и DQ приведён к измеренному лимиту памяти планировщика.
- Проверка:
  - make lint; make config-test; make rebuild-storage.
  - make smoke; make check-clickhouse; make check-services.
  - три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
This commit is contained in:
ddadmin committed 2026-08-27 07:55:28 -04:00
1 parent 4e60aafc31
commit 26b2e5fea1
17 files changed
+753 -38

No files matched your search

+47
View File
@@ -121,3 +121,50 @@ ENGINE = Distributed(
'daily_traffic_rep',
cityHash64(report_date)
);
-- Сводка качества хранит текущее состояние атомарной проверки одного дня.
-- История запусков остаётся в Airflow, поэтому версия строки не нужна:
-- следующий успешный прогон заменяет дневную партицию целиком.
CREATE TABLE IF NOT EXISTS dm.dq_summary_rep ON CLUSTER clickstream_cluster
(
data_date Date,
check_name LowCardinality(String),
reference_rows UInt64,
actual_rows UInt64,
failed_rows UInt64,
status LowCardinality(String),
_load_id String,
_load_ts DateTime64(3, 'UTC')
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}')
PARTITION BY data_date
ORDER BY (data_date, check_name);
-- Все строки одной проверки лежат на одном шарде. Таблица мала, а ключ
-- check_name делает раскладку донора и цели одинаковой без нового измерения.
CREATE TABLE IF NOT EXISTS dm.dq_summary_dist ON CLUSTER clickstream_cluster
AS dm.dq_summary_rep
ENGINE = Distributed(
'clickstream_cluster',
'dm',
'dq_summary_rep',
cityHash64(check_name)
);
-- Источник и цель REPLACE PARTITION обязаны совпадать по структуре, ключам и
-- политике хранения. Требование повторно сверено по документации ClickHouse
-- через Context7 27 августа 2026 года; AS не даёт формам разойтись.
CREATE TABLE IF NOT EXISTS dm.dq_summary_stage_rep ON CLUSTER clickstream_cluster
AS dm.dq_summary_rep
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}')
PARTITION BY data_date
ORDER BY (data_date, check_name);
CREATE TABLE IF NOT EXISTS dm.dq_summary_stage_dist ON CLUSTER clickstream_cluster
AS dm.dq_summary_stage_rep
ENGINE = Distributed(
'clickstream_cluster',
'dm',
'dq_summary_stage_rep',
cityHash64(check_name)
);
+15
View File
@@ -42,3 +42,18 @@ SELECT
_load_id,
_load_ts
FROM dm.daily_traffic_dist FINAL;
-- Сводка отвечает, какие атомарные договоры дня выполняются сейчас.
-- Явный список не пропускает в публичный договор будущие физические колонки.
CREATE VIEW IF NOT EXISTS dm.dq_summary_v ON CLUSTER clickstream_cluster
AS
SELECT
data_date,
check_name,
reference_rows,
actual_rows,
failed_rows,
status,
_load_id,
_load_ts
FROM dm.dq_summary_dist;