NiFi → ClickHouse ↔ PostgreSQL → Superset

NiFi → ClickHouse ↔ PostgreSQL → Superset

(гид обновлён 19 июня 2025 г.)


1. Почему именно эта связка

Два хранилища — две скорости, одна голова. Небольшим командам приходится балансировать: операционные запросы «покажи сделку прямо сейчас» → требуют транзакций и UPDATE-ов, аналитика «дай сводку за три года» → требует скана терабайтов без тормозов. Мы ставим PostgreSQL 16 в роль «горячего слоя» (OLTP), а ClickHouse 25.5 — «холодного» колоночного ускорителя (OLAP).

NiFi 2.4 тянет Bitrix24 REST, делит поток на «тэ» и «тэ»:

  • PutDatabaseRecord → Postgres (stage.crm_deal).
  • PutClickHouseBatch → ClickHouse (raw.crm_deal).

Без кода, чистый drag-and-drop и REST-ProcessGroup.

Superset 5.1 за секунду переключает datasource: менеджер кликает «Postgres» для свежих сделок, аналитик включает «ClickHouse» для годового графика. Всё open-source: лицензия Apache 2, никакой Pro-подписки.

Типовые сценарии

Сценарий Что делает связка
SLA-борда кол-центра Postgres отдаёт live-джоин calls + operators, ClickHouse хранит всю историю.
E-commerce Товарные фиды в ClickHouse → cohort-чарты, Postgres выдаёт остатки склада в реальном времени.
Финконтроль Superset KPI плитка читает pipeline_today из PG, а график LTV — из ClickHouse.

2. Компоненты и роли

Компонент Роль Ответственный
NiFi 2.4 Drag-and-drop ETL, fan-out потоков Data Engineer
Bitrix24 Источник CRM-событий CRM-админ
PostgreSQL 16 OLTP/оперативный слой DBA
ClickHouse 25.5 OLAP, исторический слой Data Engineer
Superset 5.1 Self-service BI, алерты BI-аналитик
(опция) dbt 1.9 SQL-модели в ClickHouse Analytics Engineer

3. Подготовка окружения

3.1 Устанавливаем ПО

Что Где взять
NiFi 2.4.0 docker pull apache/nifi:2.4.0
ClickHouse 25.5 docker pull clickhouse/clickhouse-server:25.5
PostgreSQL 16.3 docker pull postgres:16
Superset 5.1 docker pull apache/superset:5.1

3.2 docker-compose (DEV)

version: "3.9"
services:
  nifi:
    image: apache/nifi:2.4.0
    environment:
      NIFI_WEB_HTTP_PORT: 8080
    ports: ["8080:8080"]

  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: etl
      POSTGRES_PASSWORD: etl_pwd
      POSTGRES_DB: datamart
    ports: ["5432:5432"]

  clickhouse:
    image: clickhouse/clickhouse-server:25.5
    environment:
      - CLICKHOUSE_DB=datamart
      - CLICKHOUSE_USER=ch
      - CLICKHOUSE_PASSWORD=ch_pwd
      - TZ=Europe/Moscow
    ports: ["8123:8123","9000:9000"]

  superset:
    image: apache/superset:5.1
    env_file: superset.env
    depends_on: [postgres, clickhouse]
    ports: ["8088:8088"]

docker compose up -d — через пару минут все сервисы на ногах.

Читай также:  RudderStack OSS → PostgreSQL → Power BI

3.3 Мини-права

Аккаунт Права
NiFi → Postgres INSERT, SELECT на stage
NiFi → ClickHouse INSERT на raw
Superset → Postgres SELECT на mart
Superset → ClickHouse SELECT на mart

4. Настройка потоков данных

4.1 NiFi Canvas

  1. InvokeHTTP

    • URL https://<portal>.bitrix24.ru/rest/1/KEY/crm.deal.list.json
    • Параметр FILTER[>DATE_MODIFY] = ${now():minusMinutes(10):format("yyyy-MM-dd'T'HH:mm:ss")}
  2. SplitJson по 100 записей.
  3. ConvertRecord (JsonTreeReader → Avro).
  4. UpdateAttribute route to PG + CH.
  5. PutDatabaseRecord

    • DBCPService → Postgres
    • Таблица stage.crm_deal, disposition = UPSERT.
  6. PutClickHouseBatch

    • HTTP-Insert INSERT INTO raw.crm_deal FORMAT JSONEachRow.
    • Чанк 50 000 строк.

Вся схема укладывается в один процесс-группу, SLA — < 5 мин.

4.2 Скелет таблиц

PostgreSQL

CREATE SCHEMA stage;

CREATE TABLE stage.crm_deal (
  id          bigint PRIMARY KEY,
  title       text,
  stage_id    text,
  amount      numeric(14,2),
  updated_at  timestamptz,
  payload     jsonb
);
CREATE INDEX ON stage.crm_deal (updated_at DESC);

ClickHouse

CREATE DATABASE raw;

CREATE TABLE raw.crm_deal
(
  id UInt64,
  title String,
  stage_id LowCardinality(String),
  amount Decimal(18,2),
  updated_at DateTime64,
  payload JSON
)
ENGINE = MergeTree
ORDER BY (toYYYYMM(updated_at), stage_id)
PARTITION BY toYYYYMM(updated_at);

5. Трансформации и моделирование

Слой Где Что лежит
Stage stage PG «горячие» сделки (7–30 дней)
Raw raw CH вся история без DELETE
Mart mart PG & CH агрегаты, одинаковые имена

5.1 dbt-модель для ClickHouse (опция)

models_ch/fct_deal_monthly.sql

{{ config(
    materialized='table',
    engine='MergeTree',
    order_by='(month, stage_id)',
    partition_by='month'
) }}

WITH src AS (
  SELECT
    toStartOfMonth(updated_at) AS month,
    stage_id,
    count()  AS deals_cnt,
    sum(amount) AS pipeline
  FROM raw.crm_deal
  GROUP BY 1,2
)
SELECT * FROM src;

В Postgres создаём аналогичный fct_deal_monthly из stage.crm_deal для последних 6 месяцев.


6. Визуализация в Superset

  1. Add Database

    • Postgrespostgresql://superset:pwd@postgres:5432/datamart
    • ClickHouseclickhousedb://ch:ch_pwd@clickhouse:9000/datamart
  2. Dataset → +

    • mart.fct_deal_monthly (PG)
    • mart.fct_deal_monthly (CH)
  3. Chart «Time Series Bar»

    • Data source switcher: dev «PG», prod «CH».
  4. Dashboard filter: календарь, мультиселект stage.
  5. SQL Lab — одну и ту же строку SQL можно отправить в оба движка (CH диалект почти совместим).

Фишка Superset 5.1: в Advanced → “Dynamic Datasource” можно задать правило — «если интервал > 3 месяцев, используй ClickHouse».


7. Мониторинг и автоматизация


8. Типичные ошибки и лайфхаки

Проблема Решение
NiFi ловит 429 от Bitrix24 ControlRate: 1 req / 500 ms + BackPressure.
ClickHouse таблица пухнет ALTER ... MODIFY TTL updated_at + INTERVAL 18 MONTH DELETE + OPTIMIZE.
Superset дублирует столбцы После изменения схемы делайте “Sync columns from source”.
JOIN в CH → “Not enough memory” SET join_algorithm = 'partial_merge' или используйте Aggregate-projection.
Утренний дашборд пуст Проверьте: NiFi flow не в «stopped», Postgres not in recovery, CH system.mutations пуст.

9. Заключение

Плюсы Минусы
Полностью open-source; ставится on-prem, в облако или даже на ноут Два движка → двойной DevOps
Оперативные UPDATE/DELETE остаются в Postgres ClickHouse MergeTree не знает UPDATE — только “INSERT + TTL”
Исторические запросы ускоряются ×50 без лицензий Нужно думать о схеме sync: NiFi, TTL, партиции

Когда масштабировать?

  • 10 М строк/день → Clustering ClickHouse (ReplicatedMergeTree).

  • Realtime < 30 с → Kafka Producer + NiFi KafkaConsumer вместо REST.
  • CI/CD — dbt Core + Airflow для вечерних Refresh MV.

Полезные ссылки

  • NiFi Docs 2.4 — nifi.apache.org/docs
  • ClickHouse 25.5 — clickhouse.com/docs
  • Superset 5.1 Install — superset.apache.org
  • Postgres 16 — postgresql.org/docs/16
  • Bitrix24 API Limits — apidocs.bitrix24.com

Шаг влево — Postgres, шаг вправо — ClickHouse, а Superset танцует между ними. Данные летят, графики сияют, лицензий ноль — отличный повод сварить ещё один раф.