<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Data</title>
<link>https://gavrilov.info/tags/data/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>StarRocks: Архитектура, Практика и место в современном Data Stack</title>
<guid isPermaLink="false">323</guid>
<link>https://gavrilov.info/all/starrocks-arhitektura-praktika-i-mesto-v-sovremennom-data-stack/</link>
<pubDate>Sun, 15 Mar 2026 19:06:01 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/starrocks-arhitektura-praktika-i-mesto-v-sovremennom-data-stack/</comments>
<description>
&lt;p&gt;&lt;b&gt;StarRocks&lt;/b&gt; — это аналитическая MPP-база данных нового поколения.&lt;br /&gt;
Если коротко, она пытается решить трилемму аналитики: объединить скорость &lt;b&gt;ClickHouse&lt;/b&gt; (за счет векторизации и C++), гибкость &lt;b&gt;Trino&lt;/b&gt; (поддержка сложных JOIN-ов) и простоту использования &lt;b&gt;MySQL&lt;/b&gt; (совместимый протокол).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/logo_starr.svg" width="54" height="62" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Это короткое руководство проведет вас от понимания архитектуры до построения простого конвейера загрузки данных (ETL) в домашнем продакшене.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 1. Архитектура: FE и BE&lt;/h3&gt;
&lt;p&gt;В отличие от PostgreSQL (монолит) или ClickHouse (где узлы часто одноранговые), StarRocks имеет четкое разделение ролей. Это критически важно для понимания масштабирования и эксплуатации.&lt;/p&gt;
&lt;h4&gt;1. FE (Frontend) — “Мозг”&lt;/h4&gt;
&lt;p&gt;Написан на Java.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Роль:&lt;/b&gt; Управляющий слой.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Функции:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Принимает подключения клиентов (по протоколу MySQL).&lt;/li&gt;
  &lt;li&gt;Хранит метаданные (схемы таблиц, права доступа).&lt;/li&gt;
  &lt;li&gt;Парсит SQL и строит план выполнения запроса (Query Plan).&lt;/li&gt;
  &lt;li&gt;Управляет транзакциями загрузки данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Масштабирование:&lt;/b&gt; Обычно запускают 1 или 3 узла для обеспечения высокой доступности (HA).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Важно:&lt;/b&gt; Клиенты (DBeaver, BI, сurl) подключаются &lt;b&gt;только&lt;/b&gt; к FE.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. BE (Backend) — “Мускулы”&lt;/h4&gt;
&lt;p&gt;Написан на C++ (использует SIMD-инструкции процессора).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Роль:&lt;/b&gt; Слой хранения и вычислений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Функции:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Физически хранит данные (в колоночном формате).&lt;/li&gt;
  &lt;li&gt;Выполняет “тяжелую” работу: фильтрацию, агрегацию, JOIN-ы.&lt;/li&gt;
  &lt;li&gt;Управляет репликацией данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Масштабирование:&lt;/b&gt; Можно добавлять узлы линейно. Чем больше BE, тем быстрее выполняются запросы и тем больше данных можно хранить.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;В Docker All-in-One:&lt;/b&gt; Оба компонента упакованы в один контейнер для удобства, но слушают разные порты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;`9030`: FE (SQL интерфейс, сюда идет DBeaver).&lt;/li&gt;
&lt;li&gt;`8030`: FE (HTTP API для загрузки Stream Load, сюда идет curl).&lt;/li&gt;
&lt;li&gt;`8040`: BE (HTTP API метрик и логов).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 2. Быстрый старт (Docker Compose)&lt;/h3&gt;
&lt;p&gt;Мы поднимем стек StarRocks и MinIO (S3-совместимое хранилище), используя bridge-сеть для связности.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Файл `docker-compose.yml`&lt;/b&gt; (Полностью рабочий пример):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;version: &amp;quot;3.9&amp;quot;

networks:
  starrocks-stack-network:
    driver: bridge

services:
  starrocks:
    image: starrocks/allin1-ubuntu:4.0-latest
    container_name: starrocks
    hostname: starrocks.local.com
    platform: &amp;quot;linux/amd64&amp;quot;
    restart: unless-stopped
    ports:
      - &amp;quot;9030:9030&amp;quot; # MySQL Protocol (SQL клиенты)
      - &amp;quot;8030:8030&amp;quot; # FE HTTP (Stream Load)
      - &amp;quot;8040:8040&amp;quot; # BE HTTP (Logs/Metrics)
    environment:
      - TZ=UTC
    networks:
      starrocks-stack-network:
    volumes:
      # Персистентность данных (чтобы данные не исчезли после рестарта)
      - ${HOME}/dv/starrocks/be/storage:/data/deploy/starrocks/be/storage
      - ${HOME}/dv/starrocks/be/log:/data/deploy/starrocks/be/log
      - ${HOME}/dv/starrocks/fe/meta:/data/deploy/starrocks/fe/meta
      - ${HOME}/dv/starrocks/fe/log:/data/deploy/starrocks/fe/log

  minio:
    image: quay.io/minio/minio
    container_name: minio
    platform: &amp;quot;linux/amd64&amp;quot;
    hostname: minio.local.com
    restart: unless-stopped
    ports:
      - &amp;quot;9000:9000&amp;quot; # S3 API
      - &amp;quot;9001:9001&amp;quot; # Web UI
    networks:
      starrocks-stack-network:
    environment:
      MINIO_ROOT_USER: root
      MINIO_ROOT_PASSWORD: rootroot
    volumes:
      - ${HOME}/dv/minio/data:/data
    command: server /data --console-address &amp;quot;:9001&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Запуск:&lt;br /&gt;
`docker-compose up -d`&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 3. Моделирование данных (Table Design)&lt;/h3&gt;
&lt;p&gt;В StarRocks нельзя просто “создать таблицу”. Нужно выбрать тип ключа (&lt;b&gt;Key Model&lt;/b&gt;), который определит, как база будет хранить и обновлять данные.&lt;/p&gt;
&lt;p&gt;Подключение (DBeaver): `localhost:9030`, User: `root`, Password: (пусто).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE DATABASE IF NOT EXISTS demo_db;
USE demo_db;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;1. Primary Key Model (Для изменяемых данных)&lt;/h4&gt;
&lt;p&gt;Это “флагманская” возможность StarRocks. Она поддерживает быстрые &lt;b&gt;Upsert&lt;/b&gt; (вставка новых или обновление старых записей по ID) в реальном времени.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE TABLE IF NOT EXISTS users (
    user_id INT NOT NULL,
    username VARCHAR(50),
    email VARCHAR(100),
    register_date DATE, 
    city VARCHAR(50)
)
PRIMARY KEY (user_id) -- Уникальный ключ
DISTRIBUTED BY HASH(user_id) -- Распределение данных
PROPERTIES (
    &amp;quot;replication_num&amp;quot; = &amp;quot;1&amp;quot; -- Для локального теста ставим 1 реплику
);&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;2. Aggregate Key Model (Для витрин данных)&lt;/h4&gt;
&lt;p&gt;База автоматически агрегирует данные при вставке. Если вы вставите новую продажу с *существующими* датой и категорией, StarRocks не создаст новую строку, а прибавит суммы к уже существующей строке. Это экономит место и ускоряет `GROUP BY`.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;CREATE TABLE IF NOT EXISTS daily_sales (
    report_date DATE NOT NULL,
    category VARCHAR(50) NOT NULL,
    
    -- Метрики с функцией агрегации:
    total_amount BIGINT SUM DEFAULT &amp;quot;0&amp;quot;, 
    items_sold INT SUM DEFAULT &amp;quot;0&amp;quot;       
)
AGGREGATE KEY (report_date, category)
DISTRIBUTED BY HASH(report_date) BUCKETS 3
PROPERTIES (
    &amp;quot;replication_num&amp;quot; = &amp;quot;1&amp;quot;
);&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;h3&gt;Часть 4. загрузка данных users (Stream Load)&lt;/h3&gt;
&lt;p&gt;Для загрузки данных в продакшене мы используем &lt;b&gt;Service Account&lt;/b&gt; (Техническую учетную запись). Это стандарт безопасности: мы не используем `root` и не используем токены в конфигах (так как они требуют перезагрузки кластера для смены).&lt;/p&gt;
&lt;h4&gt;Шаг 1. Создание сервисного пользователя (SQL)&lt;/h4&gt;
&lt;p&gt;Выполнять под `root`:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;-- 1. Создаем пользователя-бота
CREATE USER IF NOT EXISTS 'etl_loader'@'%' IDENTIFIED BY 'SecretPass123!';

-- 2. Даем права ТОЛЬКО на вставку и чтение в базе demo_db
GRANT INSERT, SELECT ON demo_db.* TO 'etl_loader'@'%';

-- Права применяются мгновенно.&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Шаг 2. Загрузка сложного JSON через CURL&lt;/h4&gt;
&lt;p&gt;Stream Load — это самый быстрый способ загрузки (до 100 МБ/сек на узел). Он поддерживает транзакционность (ACID).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример файла `users.json`:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{
  &amp;quot;users&amp;quot;: [
    {&amp;quot;user_id&amp;quot;: 101, &amp;quot;username&amp;quot;: &amp;quot;alex&amp;quot;, &amp;quot;email&amp;quot;: &amp;quot;a@test.com&amp;quot;, &amp;quot;city&amp;quot;: &amp;quot;NY&amp;quot;},
    {&amp;quot;user_id&amp;quot;: 102, &amp;quot;username&amp;quot;: &amp;quot;bob&amp;quot;, &amp;quot;email&amp;quot;: &amp;quot;b@test.com&amp;quot;, &amp;quot;city&amp;quot;: &amp;quot;LA&amp;quot;}
  ]
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Команда загрузки (Terminal):&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;curl --location-trusted \
    -u etl_loader:SecretPass123! \
    -H &amp;quot;Expect: 100-continue&amp;quot; \
    -H &amp;quot;format: json&amp;quot; \
    -H &amp;quot;strip_outer_array: true&amp;quot; \
    -H &amp;quot;json_root: $.users&amp;quot; \
    -H &amp;quot;jsonpaths: [\&amp;quot;$.user_id\&amp;quot;, \&amp;quot;$.username\&amp;quot;, \&amp;quot;$.email\&amp;quot;, \&amp;quot;$.city\&amp;quot;]&amp;quot; \
    -H &amp;quot;columns: user_id, username, email, city&amp;quot; \
    -T &amp;quot;users.json&amp;quot; \
    -XPUT http://localhost:8030/api/demo_db/users/_stream_load&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ответ&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{
    &amp;quot;TxnId&amp;quot;: 9596,
    &amp;quot;Label&amp;quot;: &amp;quot;a9a37ab6-3678-4c08-95b7-2fd8b6ae973e&amp;quot;,
    &amp;quot;Db&amp;quot;: &amp;quot;demo_db&amp;quot;,
    &amp;quot;Table&amp;quot;: &amp;quot;users&amp;quot;,
    &amp;quot;Status&amp;quot;: &amp;quot;Success&amp;quot;,
    &amp;quot;Message&amp;quot;: &amp;quot;OK&amp;quot;,
    &amp;quot;NumberTotalRows&amp;quot;: 2,
    &amp;quot;NumberLoadedRows&amp;quot;: 2,
    &amp;quot;NumberFilteredRows&amp;quot;: 0,
    &amp;quot;NumberUnselectedRows&amp;quot;: 0,
    &amp;quot;LoadBytes&amp;quot;: 177,
    &amp;quot;LoadTimeMs&amp;quot;: 153,
    &amp;quot;BeginTxnTimeMs&amp;quot;: 2,
    &amp;quot;StreamLoadPlanTimeMs&amp;quot;: 2,
    &amp;quot;ReadDataTimeMs&amp;quot;: 0,
    &amp;quot;WriteDataTimeMs&amp;quot;: 26,
    &amp;quot;CommitAndPublishTimeMs&amp;quot;: 121
}%&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Шаг 3. Загрузка в Aggregate Table (Example)&lt;/h4&gt;
&lt;p&gt;Давайте “дольем” данные в таблицу продаж. Агрегация произойдет на лету.&lt;br /&gt;
Файл sales.json (простой список):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[
    {&amp;quot;dt&amp;quot;: &amp;quot;2023-11-01&amp;quot;, &amp;quot;cat&amp;quot;: &amp;quot;Electronics&amp;quot;, &amp;quot;amt&amp;quot;: 100, &amp;quot;qty&amp;quot;: 1},
    {&amp;quot;dt&amp;quot;: &amp;quot;2023-11-01&amp;quot;, &amp;quot;cat&amp;quot;: &amp;quot;Electronics&amp;quot;, &amp;quot;amt&amp;quot;: 50,  &amp;quot;qty&amp;quot;: 1}
]

curl --location-trusted \
    -u etl_loader:SecretPass123! \
    -H &amp;quot;format: json&amp;quot; \
    -H &amp;quot;Expect: 100-continue&amp;quot; \
    -H &amp;quot;strip_outer_array: true&amp;quot; \
    -H &amp;quot;jsonpaths: [\&amp;quot;$.dt\&amp;quot;, \&amp;quot;$.cat\&amp;quot;, \&amp;quot;$.amt\&amp;quot;, \&amp;quot;$.qty\&amp;quot;]&amp;quot; \
    -H &amp;quot;columns: report_date, category, total_amount, items_sold&amp;quot; \
    -T &amp;quot;sales.json&amp;quot; \
    -XPUT http://localhost:8030/api/demo_db/daily_sales/_stream_load&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ответ:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{
    &amp;quot;TxnId&amp;quot;: 9613,
    &amp;quot;Label&amp;quot;: &amp;quot;bce0721a-dc2d-4927-be93-e0979a57873d&amp;quot;,
    &amp;quot;Db&amp;quot;: &amp;quot;demo_db&amp;quot;,
    &amp;quot;Table&amp;quot;: &amp;quot;daily_sales&amp;quot;,
    &amp;quot;Status&amp;quot;: &amp;quot;Success&amp;quot;,
    &amp;quot;Message&amp;quot;: &amp;quot;OK&amp;quot;,
    &amp;quot;NumberTotalRows&amp;quot;: 2,
    &amp;quot;NumberLoadedRows&amp;quot;: 2,
    &amp;quot;NumberFilteredRows&amp;quot;: 0,
    &amp;quot;NumberUnselectedRows&amp;quot;: 0,
    &amp;quot;LoadBytes&amp;quot;: 143,
    &amp;quot;LoadTimeMs&amp;quot;: 52,
    &amp;quot;BeginTxnTimeMs&amp;quot;: 3,
    &amp;quot;StreamLoadPlanTimeMs&amp;quot;: 2,
    &amp;quot;ReadDataTimeMs&amp;quot;: 0,
    &amp;quot;WriteDataTimeMs&amp;quot;: 24,
    &amp;quot;CommitAndPublishTimeMs&amp;quot;: 20
}%&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Разбор заголовков:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;`-u ...`: Авторизация сервисным пользователем.&lt;/li&gt;
&lt;li&gt;`Expect: 100-continue`: Критически важно для надежности передачи больших файлов.&lt;/li&gt;
&lt;li&gt;`json_root: $.users`: Указывает базе, что данные лежат внутри ключа `users`.&lt;/li&gt;
&lt;li&gt;`strip_outer_array: true`: Говорит базе, что внутри лежит массив `[...]` и его нужно “развернуть” в отдельные строки.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 5. Совместимость и Trino Dialect&lt;/h3&gt;
&lt;p&gt;Одна из сильных сторон StarRocks — способность “притворяться” другими базами данных для облегчения миграции.&lt;/p&gt;
&lt;p&gt;Если у вас есть дашборды, написанные на диалекте &lt;b&gt;Trino (Presto)&lt;/b&gt;, вам не нужно переписывать все SQL-запросы.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример трансляции функций:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;-- Функция Trino, которой нет в StarRocks
SELECT doy(date '2022-03-06'); 
-- Ошибка: No matching function...

-- Проверяем, как StarRocks переведет этот запрос
TRANSLATE TRINO select doy(date '2022-03-06');
-- Результат: SELECT dayofyear('2022-03-06')

-- Включаем режим автоматической трансляции в сессии
SET sql_dialect = 'trino'; 

-- Теперь запрос выполняется корректно, но это не правда. а вот так SELECT dayofyear('2022-03-06') работает. Может бага или у меня версия не та. 
SELECT doy(date '2022-03-06');   

-- Возвращаем нативный режим
SET sql_dialect = 'starrocks';&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;*(Примечание: Поддержка диалекта постоянно расширяется, но некоторые специфические функции могут требовать ручной замены).*&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Итог: Сравнение и Выбор решения ( грубо )&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Характеристика&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;StarRocks&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;ClickHouse&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Trino (Presto)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Основной сценарий&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;OLAP-витрины с JOIN-ами и обновлениями данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Сбор логов, событий, метрик (Append-only)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Федерация данных (запрос к S3 + Postgres + Kafka одновременно)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;JOIN производительность&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐ (Excellent, CBO оптимизатор)&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐ (Слабо, требует денормализации)&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐ (Excellent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Обновление (UPDATE)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐ (Работает как в OLTP, Primary Key)&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐ (Тяжелые асинхронные ALTER)&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌ (Обычно только полная перезапись партиций), iceberg не в счёт :)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Язык Engine&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;C++ (SIMD Vectorized)&lt;/td&gt;
&lt;td style="text-align: center"&gt;C++ (SIMD Vectorized)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Java (JVM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Место в стеке&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Serving Layer&lt;/b&gt; (Быстрый доступ для BI)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Storage Layer&lt;/b&gt; (Хранение логов)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Query Engine&lt;/b&gt; (Ad-hoc запросы к Data Lake)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Выбирайте StarRocks, если:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Вам нужна “витрина” для BI (Superset/Tableau), где данные должны быть всегда свежими (Real-time updates).&lt;/li&gt;
&lt;li&gt;Ваш бизнес требует сложных аналитических запросов с множеством JOIN-ов, и ClickHouse не справляется/падает по памяти.&lt;/li&gt;
&lt;li&gt;Вы хотите использовать стандартный протокол MySQL без установки проприетарных драйверов.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Действительно ли данные готовы к ИИ</title>
<guid isPermaLink="false">321</guid>
<link>https://gavrilov.info/all/deystvitelno-li-dannye-gotovy-k-ii/</link>
<pubDate>Sat, 14 Mar 2026 00:19:28 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/deystvitelno-li-dannye-gotovy-k-ii/</comments>
<description>
&lt;p&gt;&lt;b&gt;Автор: Джейкоб Мэтсон&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://motherduck.com/blog/bird-bench-and-data-models"&gt;https://motherduck.com/blog/bird-bench-and-data-models&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Несколько месяцев назад я писал о том, почему нам может &lt;a href="https://motherduck.com/blog/who-needs-a-semantic-layer-anyway"&gt;не понадобиться семантический слой&lt;/a&gt;. Аргумент заключался в том, что ИИ может обнаруживать бизнес-логику из истории запросов, вместо того чтобы заставлять людей заранее определять каждую метрику. Я верил в это. Но у меня не было данных, чтобы это доказать.&lt;/p&gt;
&lt;p&gt;Теперь они у меня есть.&lt;/p&gt;
&lt;p&gt;Все началось с вопроса одного из наших инвесторов: *“Как различные модели справляются с BIRD при использовании MotherDuck MCP?”* Поэтому я провел эксперимент. Три передовые LLM модели (`Claude Opus 4.5`, `GPT-5.2` и `Gemini 3 Flash`), каждая из которых подключена к базе данных через сервер `MotherDuck MCP`, были запущены на наборе данных `BIRD Mini-Dev`.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Пояснение:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MCP (Model Context Protocol):** Стандарт, позволяющий ИИ-моделям безопасно и стандартизировано подключаться к внешним источникам данных и инструментам.&lt;/li&gt;
&lt;li&gt;BIRD (BIg Bench for Large-scale Database Grounded Text-to-SQL):** Популярный и сложный бенчмарк (набор тестов) для оценки того, насколько хорошо нейросети умеют переводить естественный язык в SQL-запросы.&lt;/li&gt;
&lt;li&gt;Mini-Dev:** Это официальная выборка из 500 вопросов для разработки из бенчмарка BIRD. Она охватывает 11 баз данных в сферах финансов, спорта, образования и здравоохранения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Модели данных здесь простые. В среднем 7 таблиц на базу данных. Ни в одной нет больше 13 таблиц. Объединения (joins) в основном «один-ко-многим», максимальная глубина — два или три перехода, ноль отношений «многие-ко-многим». Это тот тип схемы, который можно понять за пять минут, прочитав `DDL`.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Пояснение:&lt;/b&gt; `DDL` (Data Definition Language) — это часть SQL, используемая для описания структуры базы данных (создание таблиц, колонок, связей).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Результат? &lt;b&gt;95% точности.&lt;/b&gt; Никакого семантического слоя. Никакой истории запросов. Никакого специального контекста. Только схема базы данных.&lt;/p&gt;
&lt;p&gt;Но это число требует «звездочки» (примечания), и, честно говоря, эта звездочка — самая интересная часть.&lt;/p&gt;
&lt;h3&gt;Что на самом деле означают 95%&lt;/h3&gt;
&lt;p&gt;Вот что я измерял на самом деле.&lt;/p&gt;
&lt;p&gt;Бенчмарк BIRD оценивает точность, используя &lt;b&gt;Execution Accuracy (EX)&lt;/b&gt;: запускается предсказанный SQL и «золотой» (эталонный) SQL, сравниваются наборы результатов, и ставится бинарная оценка «сдал/не сдал». При этих строгих правилах текущий уровень развития технологий (SOTA) составляет около 76. Мои модели набрали 64 на тренировочной выборке и 58 на тестовой.&lt;/p&gt;
&lt;p&gt;Звучит плохо. Но у строгой оценки BIRD есть хорошо задокументированная проблема. В статье 2025 года, представляющей метрику `FLEX`, было обнаружено, что точность выполнения (execution accuracy) BIRD совпадает с оценками экспертов-людей только в 62% случаев. Почти 4 из 10 суждений ошибочны, в основном это ложноотрицательные результаты, когда бенчмарк отвергает ответы, которые люди бы приняли.&lt;/p&gt;
&lt;p&gt;Эти 62 бросились мне в глаза, потому что они почти точно совпадают с моей смешанной точностью при строгой оценке в 60.5 (64 обучение / 58 тест). То же наблюдение, но с другой стороны. Метрика `FLEX` пришла к этому с помощью проверяющих людей. Я пришел к этому, ослабив условия тестирования.&lt;/p&gt;
&lt;p&gt;Подумайте, что это значит для таблицы лидеров. Если бенчмарк согласен с людьми только в 62 случаев, то чтобы набрать выше 62 по строгим правилам, вы должны начать воспроизводить ошибки бенчмарка. Вы перестаете учиться писать правильный SQL. Вы начинаете учиться соответствовать специфической, иногда ошибочной интерпретации каждого вопроса в BIRD. Системы с рейтингом 76 закрепили эти ошибки суждения в своем обучении. Они получают более высокие баллы, становясь *хуже* в выполнении реальной задачи.&lt;/p&gt;
&lt;p&gt;Поэтому я построил более реалистичную оценку. Я разделил 500 вопросов на тренировочный набор (151 вопрос) и тестовый набор (349 вопросов).&lt;/p&gt;
&lt;p&gt;Я использовал &lt;b&gt;тренировочный набор (train)&lt;/b&gt; для калибровки оценки: вручную пересматривал ошибки, создавал исправленные «платиновые» ответы там, где «золотой» SQL BIRD был ошибочным, и настраивал правила частичного совпадения. &lt;b&gt;Тестовый набор (test)&lt;/b&gt; был контрольным.&lt;/p&gt;
&lt;p&gt;Вот как выглядит точность, если смягчать критерии оценки уровень за уровнем:&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Уровень оценки (Scoring Tier)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Train&lt;/td&gt;
&lt;td style="text-align: center"&gt;Test&lt;/td&gt;
&lt;td style="text-align: center"&gt;Что добавляется&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Только совпадение с Gold&lt;/b&gt; (≈ офиц. BIRD)&lt;/td&gt;
&lt;td style="text-align: center"&gt;64.0&lt;/td&gt;
&lt;td style="text-align: center"&gt;58.2&lt;/td&gt;
&lt;td style="text-align: center"&gt;Строгое равенство наборов результатов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;+ Платиновые ответы&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;73.1&lt;/td&gt;
&lt;td style="text-align: center"&gt;58.5&lt;/td&gt;
&lt;td style="text-align: center"&gt;Исправляет известные ошибки в «золотом» SQL BIRD (см. примечание ниже)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;+ Допуск форматирования&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;78.8&lt;/td&gt;
&lt;td style="text-align: center"&gt;65.5&lt;/td&gt;
&lt;td style="text-align: center"&gt;Различия в `DISTINCT`, лишние колонки, округление&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;+ Судья LLM&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.9&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.4&lt;/td&gt;
&lt;td style="text-align: center"&gt;“Принял бы человек этот ответ?”&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Примечание:&lt;/b&gt; «Платиновые» исправления существуют только для тренировочного набора, так как я вручную проверил эти 151 вопрос. Вот почему уровень «Платина» почти не меняется на тесте +0.3 pp против +9.1 pp на тренировке). Но посмотрите на уровень с судьей: 94.9 на тренировке и 94.4 на тесте. Разница всего в половину процентного пункта. Оценка держится на контрольной выборке даже без моих исправлений вручную.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Результаты тренировочной выборки (151 вопрос, все 3 модели):&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Модель&lt;/td&gt;
&lt;td style="text-align: center"&gt;STRICT (≈ BIRD EX)&lt;/td&gt;
&lt;td style="text-align: center"&gt;REALISTIC&lt;/td&gt;
&lt;td style="text-align: center"&gt;Общая стоимость&lt;/td&gt;
&lt;td style="text-align: center"&gt;Вызовы инструментов (P5 / Median / P95)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`Gemini 3 Flash`&lt;/td&gt;
&lt;td style="text-align: center"&gt;68.2&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.0&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.80&lt;/td&gt;
&lt;td style="text-align: center"&gt;3 / 6 / 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`Claude Opus 4.5`&lt;/td&gt;
&lt;td style="text-align: center"&gt;64.9&lt;/td&gt;
&lt;td style="text-align: center"&gt;95.4&lt;/td&gt;
&lt;td style="text-align: center"&gt;26.37&lt;/td&gt;
&lt;td style="text-align: center"&gt;4 / 6 / 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`GPT-5.2`&lt;/td&gt;
&lt;td style="text-align: center"&gt;58.9&lt;/td&gt;
&lt;td style="text-align: center"&gt;95.4&lt;/td&gt;
&lt;td style="text-align: center"&gt;6.87&lt;/td&gt;
&lt;td style="text-align: center"&gt;4 / 7 / 12&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Результаты тестовой выборки (349 вопросов, 2 модели):&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Модель&lt;/td&gt;
&lt;td style="text-align: center"&gt;STRICT (≈ BIRD EX)&lt;/td&gt;
&lt;td style="text-align: center"&gt;REALISTIC&lt;/td&gt;
&lt;td style="text-align: center"&gt;Общая стоимость&lt;/td&gt;
&lt;td style="text-align: center"&gt;Вызовы инструментов (P5 / Median / P95)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`Gemini 3 Flash`&lt;/td&gt;
&lt;td style="text-align: center"&gt;60.7&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.6&lt;/td&gt;
&lt;td style="text-align: center"&gt;3.96&lt;/td&gt;
&lt;td style="text-align: center"&gt;4 / 6 / 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`GPT-5.2`&lt;/td&gt;
&lt;td style="text-align: center"&gt;55.6&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.3&lt;/td&gt;
&lt;td style="text-align: center"&gt;15.32&lt;/td&gt;
&lt;td style="text-align: center"&gt;4 / 7 / 11&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;*Примечание: `Claude Opus` не запускался на тестовом наборе. После того как все три модели сошлись на ~95% на тренировке, тратить еще 60+, чтобы доказать то же самое на 349 вопросах, показалось нецелесообразным.*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Медианная модель делает 6-7 вызовов инструментов MCP на вопрос при лимите в 10 итераций. Типичный вопрос выглядит так: изучить схему, просмотреть некоторые колонки, набросать запрос, проверить результаты, уточнить, готово. Некоторые модели, такие как `GPT-5.2`, делают несколько вызовов инструментов за итерацию, поэтому его показатель P95, равный 12, превышает лимит итераций.&lt;/p&gt;
&lt;p&gt;Все три модели достигают &lt;b&gt;94-95% при реалистичной оценке&lt;/b&gt;, независимо от того, где они начинают при строгой оценке. На тренировочной выборке разрыв между «лучшим» и «худшим» сокращается с 12.6 процентных пунктов до 1.4. На тесте — с 5.1 до 0.3. Берите любую передовую модель.&lt;/p&gt;
&lt;h3&gt;Бенчмарк иногда ошибается&lt;/h3&gt;
&lt;p&gt;BIRD — хороший бенчмарк. Но в нем есть баги. Только в тренировочном наборе (151 вопрос) я нашел 49 случаев, где «золотой» SQL явно неверен. Я не проверял вручную тестовый набор, поэтому реальное число для всех 500 вопросов, вероятно, выше.&lt;/p&gt;
&lt;p&gt;Вот пример, который мне запомнился. Вопрос просит список школ, чей совокупный балл превышает 1500. «Золотой» SQL проверяет `count` (количество) студентов, набравших более 1500 баллов. Совершенно другой запрос, совершенно другой ответ. Вы читаете вопрос, читаете «правильный» ответ и думаете: подождите, но спрашивали-то не об этом.&lt;/p&gt;
&lt;p&gt;Я создал исправленные «платиновые» ответы для этих случаев. В среднем около 14 из 151 вопроса тренировочной выборки для каждой модели совпали с платиновым ответом вместо золотого, добавив 9.1 процентных пунктов.&lt;/p&gt;
&lt;h3&gt;Людей не волнует форматирование&lt;/h3&gt;
&lt;p&gt;На тренировочной выборке еще +5.7 pp получается за счет принятия результатов, которые верны по существу, но не проходят проверку на строгое равенство:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Лишние колонки (30 случаев):&lt;/b&gt; Модель вернула запрошенные данные плюс дополнительный контекст. Человек сказал бы «спасибо, это полезно». Бенчмарк говорит «провал».&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Несовпадения `DISTINCT` (41 случай):&lt;/b&gt; Модель использовала `SELECT DISTINCT`, когда в золотом ответе этого не было, или наоборот. Уникальные значения совпадают идеально. Человек бы даже не заметил.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Различия в округлении (3 случая):&lt;/b&gt; Золотой ответ 24.67, ответ модели 24.6667. То же число, разная точность.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ни один из этих ответов не является неверным. Это различия в форматировании, которые важны только для функции сравнения строк.&lt;/p&gt;
&lt;h3&gt;Человек (LLM)-в-петле (The LLM-in-the-Loop)&lt;/h3&gt;
&lt;p&gt;Оставшийся разрыв (16 pp на тренировке, 29 pp на тесте) закрывается &lt;b&gt;судьей LLM&lt;/b&gt;. Я использовал `Gemini 3 Flash` для проверки каждого «проваленного» ответа с вопросом: *действительно ли этот SQL отвечает на вопрос?*&lt;/p&gt;
&lt;p&gt;На тестовой выборке судья выполняет больше тяжелой работы, потому что там нет «платиновых» исправлений для предварительного отлова багов бенчмарка. Что именно он спасал?&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Причина&lt;/td&gt;
&lt;td style="text-align: center"&gt;Кол-во&lt;/td&gt;
&lt;td style="text-align: center"&gt;Что произошло&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Больше отфильтровано&lt;/b&gt; (Missing rows)&lt;/td&gt;
&lt;td style="text-align: center"&gt;57&lt;/td&gt;
&lt;td style="text-align: center"&gt;Модель отфильтровала строже, чем золотой стандарт, но это обоснованно.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Лишние строки&lt;/b&gt; (Extra rows)&lt;/td&gt;
&lt;td style="text-align: center"&gt;33&lt;/td&gt;
&lt;td style="text-align: center"&gt;Модель интерпретировала вопрос более широко.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Близкие значения&lt;/b&gt; (Values close)&lt;/td&gt;
&lt;td style="text-align: center"&gt;19&lt;/td&gt;
&lt;td style="text-align: center"&gt;Числовые результаты в пределах допуска.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Пустой результат&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;14&lt;/td&gt;
&lt;td style="text-align: center"&gt;Модель ничего не вернула, но логика была верной (данных нет).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Пропущенные колонки&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;11&lt;/td&gt;
&lt;td style="text-align: center"&gt;Возвращено меньше колонок, но ответ на вопрос дан.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Это оценочные суждения. Должен ли запрос «перечислите все школы в районе» включать чартерные школы? Разумные люди могут не согласиться. Строгий бенчмарк выбирает одну интерпретацию и наказывает за все остальные. Судья просто спрашивает, можно ли обосновать интерпретацию модели.&lt;/p&gt;
&lt;p&gt;Если вы создаете ИИ-аналитику, это важно. Никто не выпускает продукт text-to-SQL, где пользователь видит сырые результаты без этапа проверки. Всегда есть человек или LLM, проверяющий выходные данные. Эти 94-95% отражают то, как эти продукты работают на самом деле. 58-64% отражают то, как работают бенчмарки.&lt;/p&gt;
&lt;h3&gt;А как насчет контекста?&lt;/h3&gt;
&lt;p&gt;Вы могли бы ожидать, что дополнительный контекст поможет. Комментарии к колонкам, описания, подсказки о значении данных. Это интуиция, лежащая в основе семантических слоев и механизмов контекста.&lt;/p&gt;
&lt;p&gt;Я протестировал это. Те же 500 вопросов, все модели, с комментариями к колонкам каждой таблицы и без них.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Схема&lt;/td&gt;
&lt;td style="text-align: center"&gt;Train&lt;/td&gt;
&lt;td style="text-align: center"&gt;Test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Без комментариев&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.9&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;С комментариями&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;96.0&lt;/td&gt;
&lt;td style="text-align: center"&gt;94.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Дельта&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.1 pp&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.2 pp&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Один процентный пункт на тренировке, почти ничего на тесте. В большинстве вопросов правильность не изменилась.&lt;/p&gt;
&lt;p&gt;Если разбить по базам данных, становится интересно. Чем сложнее схема, тем больше помогают комментарии (усредненно по train и test):&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;База данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Базовая точность&lt;/td&gt;
&lt;td style="text-align: center"&gt;Эффект комментариев&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`debit_card_specializing`&lt;/td&gt;
&lt;td style="text-align: center"&gt;85.5 (самая сложная)&lt;/td&gt;
&lt;td style="text-align: center"&gt;8.7 pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`european_football_2`&lt;/td&gt;
&lt;td style="text-align: center"&gt;93.2&lt;/td&gt;
&lt;td style="text-align: center"&gt;3.4 pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`california_schools`&lt;/td&gt;
&lt;td style="text-align: center"&gt;95.7 (самая легкая)&lt;/td&gt;
&lt;td style="text-align: center"&gt;2.9 pp&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Комментарии помогают, когда схема действительно запутанная. Таблица `debit_card_specializing` (попробуйте угадать, как выглядит эта схема) получила самый большой прирост. Но схемы с интуитивными названиями и очевидными связями? Там комментарии сделали только хуже. У моделей уже сформировалась правильная ментальная модель, а комментарии внесли шум.&lt;/p&gt;
&lt;p&gt;Каждый разработчик знает это о комментариях в коде. Полезны при реальной неоднозначности. Вредны, когда констатируют очевидное. `// увеличить i на 1` еще никому не помогло.&lt;/p&gt;
&lt;h3&gt;Почему простые модели данных работают&lt;/h3&gt;
&lt;p&gt;Базы данных BIRD — это не корпоративные хранилища данных. Они простые:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7 таблиц в среднем.&lt;/li&gt;
&lt;li&gt;9 внешних ключей в среднем, в основном «один-ко-многим».&lt;/li&gt;
&lt;li&gt;Ноль связей «многие-ко-многим».&lt;/li&gt;
&lt;li&gt;Глубина join макс. 2-3 перехода, нет глубоких иерархий.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LLM читают эти схемы так же, как опытный аналитик читает DDL. Они видят таблицу `schools` с колонками `school_name`, `district` и `enrollment`, и они знают, что делать. Внешний ключ от `schools` к `scores`? Они знают, как их соединить (join). Никому не нужен семантический слой, чтобы объяснить, что “enrollment” означает «количество студентов».&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Хорошее моделирование данных — это и есть семантический слой.&lt;/b&gt; Когда ваши таблицы названы хорошо, а объединения прямолинейны, у LLM есть всё необходимое.&lt;/p&gt;
&lt;h3&gt;Во что я бы инвестировал в первую очередь&lt;/h3&gt;
&lt;p&gt;Каждая среда уникальна, но вот как бы я расставил приоритеты, основываясь на том, что увидел:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Начните с модели данных.&lt;/b&gt; Чистые таблицы, понятные названия, простые объединения. Если опытный аналитик может посмотреть на вашу схему и понять ее за несколько минут, то и LLM сможет.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Затем добавьте целевой контекст.&lt;/b&gt; Комментарии к колонкам и метаданные, но только там, где действительно существует путаница. Документируйте таблицы типа `debit_card_specializing`, а не `schools`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;История запросов идет следом.&lt;/b&gt; Она становится важнее по мере усложнения предметной области, особенно для обнаружения недокументированных бизнес-правил (вроде “abnormal GOT &gt; 60”). Базы данных BIRD имеют простые правила. Но я работаю над (проектом) `DABstep`, у которого простая модель данных, но очень сложные правила предметной области. Тот вид знаний, который живет в головах людей, а не в названиях колонок. Там история запросов и подобранный контекст будут значить гораздо больше. Но даже тогда чистая модель данных стоит на первом месте.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Наконец, не беспокойтесь о формальном семантическом слое. Если ваша модель данных чиста, а контекст целенаправлен, это почти ничего не добавляет для сценариев использования ИИ. На самом деле, кажется, что это даже мешает, так как ИИ отлично пишет SQL, но менее хорош в работе с другими инструментами.&lt;/p&gt;
&lt;h3&gt;Начните сейчас&lt;/h3&gt;
&lt;p&gt;Планка для «данных, готовых к ИИ», ниже, чем вам говорит индустрия.&lt;/p&gt;
&lt;p&gt;Вам не нужен “движок контекста”, семантический слой, годы истории запросов или специализированная платформа метаданных. Вам нужна &lt;b&gt;чистая модель данных и LLM&lt;/b&gt;. Найдите домен, который готов к этому, и начните там.&lt;/p&gt;
&lt;p&gt;Разрыв между «точностью бенчмарка» и «примет ли это человек?» составил 31 pp на тренировочной выборке и 36 pp на тестовой. Это огромный разрыв, и он закрывается в тот момент, когда вы включаете человека или LLM в цикл проверки. Именно так и работает любой продукт ИИ-аналитики.&lt;/p&gt;
&lt;p&gt;Если ваша модель данных чиста, начните сегодня. Направьте LLM на вашу схему и задавайте вопросы. Если ваша модель данных не чиста, теперь вы знаете, с чего начать.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;h4&gt;Итоги статьи&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Проблема:&lt;/b&gt; Принято считать, что для работы ИИ с базами данных (Text-to-SQL) нужны сложные семантические слои, история запросов и контекст.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Эксперимент:&lt;/b&gt; Автор протестировал работу современных LLM (Claude, Gemini, GPT) на известном наборе данных BIRD.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Открытие 1:&lt;/b&gt; Формальные бенчмарки занижают качество работы ИИ. Они требуют строгого совпадения SQL-запросов, хотя люди принимают ответы с правильными данными, но другим форматированием (лишние колонки, другой порядок сортировки). Истинная (“реалистичная”) точность моделей достигает &lt;b&gt;95%&lt;/b&gt;, тогда как бенчмарк показывает около 60%.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Открытие 2:&lt;/b&gt; “Готовность данных к ИИ” сводится к понятной структуре базы данных. Чистые таблицы, внятные названия колонок и простые связи работают лучше, чем нагромождение комментариев.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Открытие 3:&lt;/b&gt; Дополнительные комментарии (контекст) нужны только для реально запутанных схем. В простых случаях они даже мешают, создавая шум.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Вывод:&lt;/b&gt; Не тратьте ресурсы на сложные семантические надстройки. Инвестируйте в &lt;b&gt;чистоту модели данных&lt;/b&gt; (понятные имена таблиц и полей). Хорошая модель данных — это и есть лучший семантический слой для ИИ.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Битва титанов аналитики реального времени: StarRocks против ClickHouse</title>
<guid isPermaLink="false">320</guid>
<link>https://gavrilov.info/all/bitva-titanov-analitiki-realnogo-vremeni-starrocks-protiv-clickh/</link>
<pubDate>Fri, 06 Mar 2026 01:26:35 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/bitva-titanov-analitiki-realnogo-vremeni-starrocks-protiv-clickh/</comments>
<description>
&lt;p&gt;В мире больших данных, где счет идет на петабайты, а задержка измеряется миллисекундами, выбор правильного аналитического движка определяет успех продукта. Сегодня мы разберем восходящую звезду StarRocks и классического гиганта ClickHouse, а также посмотрим, как Netflix удалось укротить свои логи на экстремальных скоростях.&lt;/p&gt;
&lt;h3&gt;Часть 1: Обзор технологий и кейс Netflix&lt;/h3&gt;
&lt;h4&gt;StarRocks: Субсекундная аналитика нового поколения&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image.png-1.jpg" width="2560" height="1078" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;StarRocks&lt;/b&gt; — это высокопроизводительный аналитический движок (MPP database) нового поколения, разработанный для сценариев, где скорость имеет решающее значение. Будучи проектом Linux Foundation, он позиционирует себя как самый быстрый открытый движок запросов для субсекундной аналитики как внутри собственного хранилища, так и поверх архитектуры Data Lakehouse.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ключевые особенности StarRocks:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Универсальность:** Поддерживает почти любые сценарии — от многомерной OLAP-аналитики и realtime-дэшбордов до ad-hoc запросов аналитиков.&lt;/li&gt;
&lt;li&gt;Скорость:** Использует векторизованный движок исполнения, CBO (Cost-Based Optimizer) и пайплайновый параллелизм, что позволяет обгонять конкурентов на сложных запросах с JOIN-ами.&lt;/li&gt;
&lt;li&gt;Архитектура:** Native cloud-ready, легко масштабируется горизонтально. Умеет работать “on and off the lakehouse” — то есть быстро читать данные напрямую из S3/HDFS (форматы Parquet, ORC, Iceberg, Hudi) без необходимости их обязательной загрузки внутрь базы.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;Кейс Netflix: Как оптимизировать логирование петабайтного масштаба с ClickHouse&lt;/h4&gt;
&lt;p&gt;*( адаптация материала из блога ClickHouse)* &lt;a href="https://clickhouse.com/blog/netflix-petabyte-scale-logging"&gt;https://clickhouse.com/blog/netflix-petabyte-scale-logging&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Screenshot-from-2026-03-06-01-15-33.png" width="833" height="380" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В Netflix масштаб диктует всё. Инженер Дэниел Муино поделился инсайтами о том, как их система логирования справляется с &lt;b&gt;5 петабайтами логов ежедневно&lt;/b&gt;, обрабатывая в среднем 10.6 миллионов событий в секунду и отвечая на запросы быстрее, чем за секунду.&lt;/p&gt;
&lt;p&gt;Для достижения такой производительности потребовалось не просто выбрать правильную базу данных (ClickHouse), но и внедрить три критических инженерных оптимизации.&lt;/p&gt;
&lt;h5&gt;Архитектура: Горячее и холодное&lt;/h5&gt;
&lt;p&gt;Netflix использует гибридный подход:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Горячий слой (ClickHouse):** Хранит недавние логи, где критична скорость для интерактивной отладки. Данные поступают через Kafka/Kinesis в ClickHouse практически мгновенно.&lt;/li&gt;
&lt;li&gt;Холодный слой (Apache Iceberg):** Обеспечивает экономичное долговременное хранение исторических данных на S3.&lt;/li&gt;
&lt;li&gt;Единый API автоматически решает, к какому слою обращаться, скрывая сложность от инженеров.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image.png.jpg" width="2560" height="1403" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Результат: логи доступны для поиска через 20 секунд после генерации (при SLA в 5 минут), а сложные аналитические запросы выполняются почти мгновенно.&lt;/p&gt;
&lt;h5&gt;Три главные оптимизации&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;1. Ingestion: Свой лексер вместо Regex&lt;/b&gt;&lt;br /&gt;
Изначально Netflix использовал регулярные выражения для группировки похожих логов (fingerprinting). На скорости 10 млн событий/сек это стало узким местом.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Решение:* Команда переписала логику, создав &lt;b&gt;сгенерированный лексер&lt;/b&gt; с помощью JFlex.&lt;/li&gt;
&lt;li&gt;Результат:* Рост пропускной способности в 8-10 раз. Время обработки одного события упало с 216 до 23 микросекунд.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;2. Сериализация: Отказ от JDBC&lt;/b&gt;&lt;br /&gt;
Стандартные JDBC-вставки через Java-клиент создавали оверхед на согласование схем. Переход на низкоуровневый формат `RowBinary` помог, но потребление CPU оставалось высоким.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Решение:* Дэниел реверс-инжинирил протокол Go-клиента ClickHouse (который поддерживает нативный формат) и написал &lt;b&gt;собственный энкодер&lt;/b&gt;. Он генерирует LZ4-сжатые блоки в нативном протоколе ClickHouse.&lt;/li&gt;
&lt;li&gt;Результат:* Снижение нагрузки на CPU и памяти при той же пропускной способности.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;3. Запросы: Шардирование карт тегов (Tag Maps)&lt;/b&gt;&lt;br /&gt;
Инженеры Netflix активно используют кастомные теги (фильтры по microservice_id, request_id). Изначально они хранились как `Map(String, String)`. В ClickHouse это реализовано как два параллельных массива, что требует линейного сканирования при поиске. При 25 000 уникальных ключей в час запросы тормозили.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Решение:* Шардирование карты. Ключи тегов хешируются в 31 меньшую карту. Запрос сразу “прыгает” в нужный шард вместо перебора всех ключей.&lt;/li&gt;
&lt;li&gt;Результат:* Время фильтрующих запросов упало с 3 секунд до 1.3, а сложных проекций — с 3 секунд до &lt;b&gt;700 мс&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 2: ClickHouse vs StarRocks — Битва за Lakehouse&lt;/h3&gt;
&lt;p&gt;Обе системы являются лидерами в мире OLAP (On-Line Analytical Processing), используют MPP-архитектуру и колоночное хранение. Однако их философия и степень готовности к современной концепции &lt;b&gt;Lakehouse&lt;/b&gt; (аналитика данных непосредственно в озере данных без копирования) различаются.&lt;/p&gt;
&lt;h4&gt;1. Архитектурные корни и специализация&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ClickHouse:**
&lt;ul&gt;
  &lt;li&gt;ДНК:* Изначально создавался для Яндекс.Метрики. Король &lt;b&gt;единой широкой таблицы&lt;/b&gt;.&lt;/li&gt;
  &lt;li&gt;Сильная сторона:* Непревзойденная скорость записи и чтения на одной таблице. Идеален для логов (как у Netflix), телеметрии, событийных данных.&lt;/li&gt;
  &lt;li&gt;Слабая сторона:* JOIN-ы (соединения таблиц). ClickHouse умеет их делать, но исторически это не его конек. Оптимизатор запросов долгое время был рудиментарным, требуя от пользователя ручной оптимизации порядка таблиц.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;StarRocks:**
&lt;ul&gt;
  &lt;li&gt;ДНК:* Эволюционировал из Apache Doris. Создавался с прицелом на сложные сценарии аналитики.&lt;/li&gt;
  &lt;li&gt;Сильная сторона:* &lt;b&gt;CBO (Cost-Based Optimizer)&lt;/b&gt; уровня Oracle или Teradata. StarRocks блестяще справляется со сложными SQL-запросами, включая многотабличные JOIN-ы “звезда” и “снежинка”.&lt;/li&gt;
  &lt;li&gt;Специфика:* Ориентирован на обновление данных в реальном времени (Primary Key table engine) и векторизованную обработку сложных вычислений.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Степень готовности к Lakehouse (Работа с S3, HDFS, Iceberg)&lt;/h4&gt;
&lt;p&gt;Здесь наблюдается главное стратегическое расхождение.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;StarRocks: Native Lakehouse Engine&lt;/b&gt;&lt;br /&gt;
StarRocks позиционирует себя как движок, который может вообще &lt;b&gt;не хранить данные у себя&lt;/b&gt;, а выступать только быстрым вычислительным слоем поверх S3/MinIO.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Кэширование:** Имеет продвинутый локальный кэш данных (Local Data Cache), который подтягивает горячие данные из S3 на диски воркеров, обеспечивая скорость, сравнимую с нативным хранением.&lt;/li&gt;
&lt;li&gt;Каталоги:** Бесшовная интеграция с Hive Metastore, AWS Glue, Iceberg, Hudi, Delta Lake. Вы просто подключаете каталог и пишете `SELECT` к таблицам в S3 без `CREATE TABLE`.&lt;/li&gt;
&lt;li&gt;Вердикт:&lt;b&gt; StarRocks **полностью готов&lt;/b&gt; к Lakehouse. Это один из лучших выборов для сценария “данные лежат в S3 в формате Parquet/Iceberg, а нам нужен быстрый SQL поверх них”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;ClickHouse: Storage First, Lakehouse Second&lt;/b&gt;&lt;br /&gt;
ClickHouse исторически — это система хранения. Хотя поддержка S3 и Data Lakes активно развивается (особенно в 2024-2025 годах), подход отличается.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Интеграция:** ClickHouse может читать из S3 (`s3()` table function или S3 table engine). Поддерживает Iceberg и Hudi.&lt;/li&gt;
&lt;li&gt;Производительность:** Чтение “холодных” данных из S3 в ClickHouse часто медленнее, чем в StarRocks, из-за особенностей реализации сканирования и работы с метаданными внешних форматов.&lt;/li&gt;
&lt;li&gt;Кейс Netflix подтверждает:&lt;b&gt; Netflix использует ClickHouse **как горячее хранилище&lt;/b&gt;, копируя туда данные. А для лекхоуса (Iceberg) они используют отдельные движки (вероятно, Trino или Spark), а ClickHouse выступает именно как акселератор для свежих данных.&lt;/li&gt;
&lt;li&gt;Вердикт:&lt;b&gt; ClickHouse движется в сторону Lakehouse (разделение Storage и Compute, S3-backed MergeTree), но его главная суперсила по-прежнему раскрывается, когда данные **импортированы&lt;/b&gt; в его родной формат.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Пример использования ClickHouse (из статьи выше)&lt;/h4&gt;
&lt;p&gt;В примере Netflix мы видим классический паттерн использования ClickHouse, где он силен максимально:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;*“ClickHouse находится в сердце системы как горячий слой (hot tier). Он хранит недавние логи, где скорость критична... Для исторических данных Netflix использует Apache Iceberg.”*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Это подтверждает тезис: ClickHouse идеален, когда вы загружаете данные в него (Ingest heavy). StarRocks же часто выигрывает там, где данные уже лежат в озере, и вы не хотите их никуда копировать, либо, когда вам нужны сложные JOIN-ы поверх этих данных.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Итог и рекомендации&lt;/h4&gt;
&lt;p&gt;Выбор между StarRocks и ClickHouse больше не стоит в плоскости “кто быстрее сканирует одну колонку”. Обе системы феноменально быстры. Вопрос в архитектуре ваших данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Рекомендации:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Выбирайте ClickHouse, если:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Ваша главная задача — работа с логами, метриками, clickstream (как у Netflix).&lt;/li&gt;
  &lt;li&gt;У вас плоская структура данных (одна широкая таблица), и JOIN-ы редки.&lt;/li&gt;
  &lt;li&gt;Вам нужна максимальная скорость вставки (ingestion) и максимальное сжатие данных на диске.&lt;/li&gt;
  &lt;li&gt;У вас есть ресурсы на инженерию: ClickHouse гибок, но, как показал кейс Netflix, требует “прямых рук” для тонкой настройки (кастомные кодеки, шардирование тегов).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Выбирайте StarRocks, если:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Вы строите &lt;b&gt;Data Lakehouse&lt;/b&gt;: данные лежат в S3 (Iceberg/Parquet), и вы хотите анализировать их без ETL/копирования.&lt;/li&gt;
  &lt;li&gt;У вас сложная модель данных (схема “Звезда” или “Снежинка”) и много JOIN-ов в запросах.&lt;/li&gt;
  &lt;li&gt;Вам нужны обновления данных (UPSERT/DELETE) в реальном времени с использованием Primary Keys.&lt;/li&gt;
  &lt;li&gt;Вы хотите упростить поддержку и получить оптимизатор запросов, который многое сделает за вас “из коробки”.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Приложение:&lt;/p&gt;
&lt;p&gt;Ниже представлен анализ списка компаний, использующих &lt;b&gt;StarRocks&lt;/b&gt;. Они разделены по сферам деятельности, а также ранжированы по глубине использования технологии и вкладу в развитие проекта.&lt;/p&gt;
&lt;h4&gt;1. Сферы деятельности компаний&lt;/h4&gt;
&lt;p&gt;Вот краткое описание того, чем занимается каждая компания из вашего списка:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Технологии, Интернет и E-commerce:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alibaba:** Крупнейший китайский холдинг электронной коммерции и облачных вычислений.&lt;/li&gt;
&lt;li&gt;Shopee:** Ведущая платформа электронной коммерции в Юго-Восточной Азии и Тайване.&lt;/li&gt;
&lt;li&gt;Trip.com:** Одно из крупнейших в мире онлайн-турагентств.&lt;/li&gt;
&lt;li&gt;Airbnb:** Онлайн-площадка для размещения, поиска и краткосрочной аренды жилья.&lt;/li&gt;
&lt;li&gt;Xiaohongshu (RedNote):** Китайская социальная сеть и платформа электронной коммерции (аналог Instagram + Pinterest).&lt;/li&gt;
&lt;li&gt;Zepto:** Сервис быстрой доставки продуктов (quick commerce) из Индии.&lt;/li&gt;
&lt;li&gt;Naver:** Ведущая южнокорейская интернет-компания (поисковик, карты и др.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Социальные сети и Медиа:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pinterest:** Фотохостинг, социальная сеть для обмена идеями.&lt;/li&gt;
&lt;li&gt;Tencent (Games &amp; LLM):** Технологический гигант, владелец WeChat, крупнейший в мире издатель видеоигр.&lt;/li&gt;
&lt;li&gt;iQiyi:** Крупная китайская платформа онлайн-видео (аналог Netflix).&lt;/li&gt;
&lt;li&gt;SmartNews:** Агрегатор новостей (популярен в Японии и США).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Финтех и Криптовалюты:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coinbase:** Крупнейшая американская криптовалютная биржа.&lt;/li&gt;
&lt;li&gt;Intuit:** Американская компания, разработчик финансового ПО (QuickBooks, TurboTax).&lt;/li&gt;
&lt;li&gt;TRM Labs:** Блокчейн-аналитика, порядочность в криптосфере и compliance.&lt;/li&gt;
&lt;li&gt;Yuno:** Финтех-оркестратор платежей.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;B2B SaaS и Корпоративное ПО:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Airtable:** Облачный сервис для работы с базами данных и таблицами (no-code).&lt;/li&gt;
&lt;li&gt;Celonis:** Лидер в области Process Mining (анализ бизнес-процессов).&lt;/li&gt;
&lt;li&gt;Cisco:** Мировой лидер в области сетевых технологий и кибербезопасности.&lt;/li&gt;
&lt;li&gt;Demandbase:** Платформа для ABM-маркетинга (Account-Based Marketing).&lt;/li&gt;
&lt;li&gt;Eightfold.ai:** Платформа для управления талантами на базе ИИ.&lt;/li&gt;
&lt;li&gt;Freshа:** Платформа для бронирования услуг в сфере красоты и здоровья.&lt;/li&gt;
&lt;li&gt;SplitMetrics:** Платформа для A/B тестирования и оптимизации мобильных приложений.&lt;/li&gt;
&lt;li&gt;Verisoul:** Платформа для выявления фейковых пользователей и ботов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Транспорт и Логистика:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Didi:** Китайский агрегатор такси (аналог Uber).&lt;/li&gt;
&lt;li&gt;Grab:** Супер-приложение из Юго-Восточной Азии (такси, доставка еды, платежи).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Игры:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PlaySimple Games:** Разработчик мобильных словесных игр.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Сельское хозяйство:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HerdWatch:** ПО для управления фермерскими хозяйствами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Энергетика:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Haezoom:** Южнокорейская платформа в сфере солнечной энергетики (Energy AI).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ритейл (Merchandise):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fanatics:** Мировой лидер по продаже лицензионной спортивной атрибутики.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;2. Ранжирование по степени использования (Use Case Depth)&lt;/h4&gt;
&lt;p&gt;Это ранжирование основано на публично доступных кейсах (case studies), объемах данных и критичности систем, переведенных на StarRocks.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Уровень 1: Heavy Users / Mission Critical (Ключевые внедрения)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Эти компании заменили устаревшие хранилища данных (Snowflake, ClickHouse, Druid) на StarRocks для критически важных задач с огромными объемами данных.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Airbnb:&lt;/b&gt; Используют StarRocks для метрик реального времени и “умного” ценообразования (Minerva). Огромные объемы данных, строгие требования к задержке.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tencent (Games &amp; LLM):&lt;/b&gt; Один из самых масштабных пользователей. Унифицировали аналитику (заменив Hive/Spark/Druid), что позволило анализировать данные сотен игр в реальном времени.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Trip.com:&lt;/b&gt; Полностью отказались от ClickHouse и частично от Hive в пользу StarRocks для ускорения отчетов. Обрабатывают петабайты данных, высокая конкуренция запросов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Shopee:&lt;/b&gt; Используют StarRocks для Data Service (API), ускорив запросы в 3 раза по сравнению с Presto. Критически важно для работы их E-commerce платформы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Didi:&lt;/b&gt; Масштабное использование для логистики в реальном времени и анализа поездок.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fanatics:&lt;/b&gt; Сократили расходы на 90%, перейдя с Snowflake на связку StarRocks + Iceberg.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Coinbase:&lt;/b&gt; Заменили Snowflake для аналитики, обращенной к клиенту (customer-facing). Требовались быстрые JOIN-ы на терабайтных масштабах, чего не давали другие системы.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Уровень 2: Strategic Users (Важные продуктовые внедрения)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Компании, использующие StarRocks для конкретных, высоконагруженных продуктов или функций.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Pinterest:&lt;/b&gt; Используют для аналитики, но акцент сделан на Lakehouse-архитектуре и join-ах больших таблиц.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Xiaohongshu (RedNote):&lt;/b&gt; Аналитика поведения пользователей в реальном времени (user behavior analysis) с высочайшей кардинальностью данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fresha:&lt;/b&gt; Аналитика для партнеров (салонов красоты). Важна скорость отклика дэшбордов для тысяч внешних пользователей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Grab:&lt;/b&gt; Аналитика для супер-приложения. Замена Druid/Pinot для более гибких SQL-запросов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Celonis:&lt;/b&gt; Использование в движке Process Mining, где требуются сложные JOIN-операции, с которыми StarRocks справляется лучше колоночных аналогов.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Уровень 3: Adopters (Специфические сценарии)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Компании, использующие StarRocks для внутренних BI-систем, маркетинговой аналитики или замены медленных компонентов.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Airtable, Cisco, Intuit, Zepto, PlaySimple Games:** Вероятнее всего, использование для внутренней ускоренной аналитики и BI-отчетов, где традиционные DWH стали слишком медленными или дорогими.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;3. Ранжирование по степени влияния на проект (Contribution &amp; Influence)&lt;/h4&gt;
&lt;p&gt;StarRocks — это Open Source проект. Влияние оценивается по вкладу в код (Pull Requests), участию в техническом комитете (TSC) и архитектурном развитии.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. Лидеры (Архитекторы и основные контрибьюторы):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alibaba и Tencent:** Эти техногиганты не просто используют проект, они предоставляют огромное количество коммитов, тестируют его на экстремальных нагрузках и формируют roadmap развития. Многие фичи для “реального времени” и интеграции с Data Lake пришли благодаря требованиям и коду инженеров этих компаний.&lt;/li&gt;
&lt;li&gt;Didi:** Активные контрибьюторы в области стабильности и оптимизации планировщика запросов под высокие нагрузки.&lt;/li&gt;
&lt;li&gt;Airbnb:** Их вклад значителен в области интеграции с экосистемой данных (например, улучшения для Apache Iceberg и метрик), так как они строят сложные платформы данных (Minerva).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;2. Инноваторы (Драйверы конкретных фич):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trip.com:&lt;b&gt; Сильно повлияли на развитие функций для работы с **Data Lakehouse&lt;/b&gt; (прямые запросы к Hive/Iceberg без импорта данных), так как их основной кейс — отказ от миграции данных.&lt;/li&gt;
&lt;li&gt;Shopee:&lt;b&gt; Влияют на развитие функционала **Materialized Views&lt;/b&gt; (материализованных представлений), так как активно используют их для ускорения API.&lt;/li&gt;
&lt;li&gt;Pinterest и Coinbase:** Их кейсы (быстрые JOIN-ы на S3) подталкивают развитие кеширования и оптимизатора для “холодных” данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;3. Евангелисты (Популяризаторы):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Celonis, Fanatics, Grab:** Активно выступают на конференциях, пишут технические блоги о миграции с конкурентов (Snowflake, Druid), тем самым привлекая новых пользователей и валидируя технологию на западном рынке.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;b&gt;ClickHouse&lt;/b&gt; — это колоночная аналитическая СУБД с открытым кодом, позволяющая выполнять аналитические запросы в режиме реального времени на структурированных больших данных. Изначально разработанная в Яндексе для Яндекс.Метрики, она стала мировым стандартом для задач логирования, телеметрии и продуктовой аналитики благодаря феноменальной скорости вставки и сжатия данных.&lt;/p&gt;
&lt;h4&gt;1. Сферы деятельности компаний&lt;/h4&gt;
&lt;p&gt;Список компаний, использующих ClickHouse, охватывает почти все отрасли, где генерируются “Big Data”.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Технологии, Интернет и Облачные сервисы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yandex:** Родительская компания. Поисковик, такси, e-commerce, облачные сервисы.&lt;/li&gt;
&lt;li&gt;Cloudflare:** Глобальная сеть доставки контента (CDN) и защита от DDoS.&lt;/li&gt;
&lt;li&gt;Uber:** Мировой агрегатор такси и доставки.&lt;/li&gt;
&lt;li&gt;eBay:** Один из старейших и крупнейших аукционов и маркетплейсов в мире.&lt;/li&gt;
&lt;li&gt;VK (ВКонтакте):** Крупнейшая социальная сеть в СНГ.&lt;/li&gt;
&lt;li&gt;GitLab:** Платформа для DevOps и управления жизненным циклом ПО.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Стриминг, Медиа и Развлечения:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spotify:** Глобальный аудио-стриминговый сервис.&lt;/li&gt;
&lt;li&gt;Netflix:** Крупнейший в мире онлайн-кинотеатр (стриминг видео).&lt;/li&gt;
&lt;li&gt;Twitch:** Видеостриминговый сервис, специализирующийся на компьютерных играх.&lt;/li&gt;
&lt;li&gt;Disney+ (Disney Streaming):** Стриминговая платформа медиа-конгломерата Disney.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Финансы и Финтех:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloomberg:** Поставщик финансовой информации для профессиональных участников рынков.&lt;/li&gt;
&lt;li&gt;Deutsche Bank:** Крупнейший банковский концерн Германии.&lt;/li&gt;
&lt;li&gt;Revolut:** Британский финтех-стартап и необанк.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Мониторинг, Observability и SaaS:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Datadog:** Платформа мониторинга и безопасности для облачных приложений.&lt;/li&gt;
&lt;li&gt;Grafana Labs:** Разработчик популярнейшей платформы визуализации данных.&lt;/li&gt;
&lt;li&gt;Sentry:** Платформа для отслеживания ошибок в приложениях.&lt;/li&gt;
&lt;li&gt;Segment (Twilio):** Платформа клиентских данных (CDP).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Телеком:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comcast:** Крупнейшая телекоммуникационная компания США.&lt;/li&gt;
&lt;li&gt;Verizon:** Один из лидеров американского рынка мобильной связи.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;2. Ранжирование по степени использования (Use Case Depth)&lt;/h4&gt;
&lt;p&gt;Это ранжирование отражает масштаб данных, критичность системы для бизнеса и сложность архитектуры.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Уровень 1: Heavy Users / Hyper-scale (Экстремальные нагрузки)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Компании, обрабатывающие триллионы строк, где ClickHouse является ядром инфраструктуры.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Cloudflare:&lt;/b&gt; Пожалуй, один из самых впечатляющих кейсов в мире. Используют ClickHouse для аналитики HTTP-трафика и DNS-запросов. Обрабатывают &lt;b&gt;десятки миллионов событий в секунду&lt;/b&gt; (более 100 млрд строк в день) для предоставления аналитики клиентам в личном кабинете.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Yandex (Метрика):&lt;/b&gt; Исторический “reference implementation”. Крупнейшая система веб-аналитики в Европе, работающая на кластерах из сотен серверов. Именно для этой нагрузки (&gt;1 триллиона строк в базе) ClickHouse и был создан.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Uber:&lt;/b&gt; Используют ClickHouse для своей платформы логирования (более 4 петабайт данных), заменив Elasticsearch в ряде задач ради экономии ресурсов и скорости.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lyft:&lt;/b&gt; Используют для аналитики поездок и Geo-данных в реальном времени, обрабатывая огромные потоки телеметрии с автомобилей и приложений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bytedance (TikTok):&lt;/b&gt; (До миграции части нагрузок на другие системы) Один из крупнейших пользователей в Китае, использовавший ClickHouse для анализа поведения пользователей (User Behavior Analysis) на гигантских масштабах.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Уровень 2: Strategic Users (Ключевой компонент продукта)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Компании, которые строят свой основной продукт или критически важные внутренние сервисы на базе ClickHouse.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Sentry:&lt;/b&gt; Вся аналитика ошибок и производительности в их SaaS-продукте построена на ClickHouse. Они хранят миллиарды событий ошибок, позволяя разработчикам мгновенно фильтровать их.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitLab:&lt;/b&gt; Используют ClickHouse для feature “Observability” внутри своего продукта, предоставляя пользователям аналитику по их CI/CD пайплайнам.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spotify:&lt;/b&gt; Используют для внутренней аналитики экспериментов (A/B тесты) и логов воспроизведения треков.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;eBay:&lt;/b&gt; Используют для OLAP-аналитики логов приложений и мониторинга, добиваясь снижения затрат по сравнению с традиционными коммерческими решениями.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Segment:&lt;/b&gt; Платформа позволяет клиентам делать сложные выборки по аудитории, и ClickHouse здесь выступает в роли “движка” для мгновенной сегментации пользователей.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Уровень 3: Adopters (Специализированные задачи)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Использование для конкретных департаментов, внутренней бизнес-разведки (BI) или замены старых компонентов.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deutsche Bank:** Анализ рыночных тиков и высокочастотная финансовая аналитика.&lt;/li&gt;
&lt;li&gt;Comcast:** Мониторинг качества видеопотока и сети.&lt;/li&gt;
&lt;li&gt;Bloomberg:** Аналитика взаимодействия пользователей с терминалом Bloomberg.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;3. Ранжирование по степени влияния на проект (Contribution &amp; Influence)&lt;/h4&gt;
&lt;p&gt;ClickHouse имеет огромное сообщество. Влияние оценивается не только по использованию, но и по вкладу в кодовую базу (PR), разработке драйверов и организации митапов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. Создатели и Архитекторы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClickHouse Inc:** После выделения в отдельную компанию в 2021 году, основные разработчики (включая Алексея Миловидова) работают здесь. Именно они определяют roadmap, развивают ClickHouse Cloud и ядро системы.&lt;/li&gt;
&lt;li&gt;Yandex:** Исторический создатель. До сих пор вносят огромный вклад, поддерживают свои форки и используют систему на пределе возможностей, что помогает выявлять баги производительности.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;2. Технологические Партнеры и Контрибьюторы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare:** Внесли огромный вклад в оптимизацию работы с сетью, TLS и безопасность, так как их требования к защищенности и нагрузке экстремальны. Часто пишут глубокие технические статьи о внутренностях ClickHouse.&lt;/li&gt;
&lt;li&gt;Altinity:** Компания, оказывающая консалтинг и поддержку ClickHouse. Сделали огромный вклад в экосистему Kubernetes (ClickHouse Operator), драйверы и интеграцию с экосистемой Hadoop/MySQL.&lt;/li&gt;
&lt;li&gt;Contentsquare:** Активно участвуют в оптимизации ядра для специфических аналитических функций (session analysis).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;3. Евангелисты Экосистемы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uber и Lyft:** Публикуют детальные инженерные блоги о том, как переводить логирование с ELK стека на ClickHouse, чем вдохновили сотни других компаний на миграцию.&lt;/li&gt;
&lt;li&gt;Grafana Labs:** Разрабатывают и поддерживают официальный плагин ClickHouse для Grafana, делая СУБД доступной для визуализации миллионам пользователей.&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>R2 SQL: Глубокое погружение в наш новый движок для распределенных запросов</title>
<guid isPermaLink="false">319</guid>
<link>https://gavrilov.info/all/r2-sql-glubokoe-pogruzhenie-v-nash-novy-dvizhok-dlya-raspredelen/</link>
<pubDate>Wed, 18 Feb 2026 21:56:56 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/r2-sql-glubokoe-pogruzhenie-v-nash-novy-dvizhok-dlya-raspredelen/</comments>
<description>
&lt;h4&gt;Введение&lt;/h4&gt;
&lt;p&gt;В современном мире объемы данных растут экспоненциально, и хранение петабайтов информации в объектных хранилищах (как Amazon S3 или Cloudflare R2) стало стандартом. Однако просто хранить данные мало — их нужно анализировать. Традиционно для этого требовалось поднимать сложные кластеры (например, Spark или Trino), что долго и дорого.&lt;/p&gt;
&lt;p&gt;Компания Cloudflare представила &lt;b&gt;R2 SQL&lt;/b&gt; — бессерверный (serverless) движок, который позволяет выполнять SQL-запросы прямо к данным, лежащим в объектном хранилище R2, без необходимости управлять инфраструктурой. Эта статья подробно описывает архитектуру этого решения: как они добились высокой скорости, используя формат таблиц Apache Iceberg, умное планирование запросов и свою глобальную сеть.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.cloudflare.com/r2-sql-deep-dive/"&gt;Ссылка на оригинал статьи&lt;/a&gt; А ранее я уже писал про их анонс тут &lt;a href="https://gavrilov.info/all/cloudflare-anonsiruet-platformu-dannyh/"&gt;https://gavrilov.info/all/cloudflare-anonsiruet-platformu-dannyh/&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-18-v-21.51.06.png" width="1582" height="540" alt="" /&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h4&gt;R2 SQL: Глубокое погружение в наш новый движок для распределенных запросов&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Авторы:&lt;/b&gt; Yevgen Safronov, Nikita Lapkov, Jérôme Schneider. ( Привет Никита и Евген :)&lt;/p&gt;
&lt;p&gt;Как выполнить SQL-запросы над петабайтами данных… без сервера?&lt;br /&gt;
У нас есть ответ: &lt;b&gt;R2 SQL&lt;/b&gt;, бессерверный движок запросов, который может просеивать огромные наборы данных и возвращать результаты за секунды.&lt;/p&gt;
&lt;p&gt;В этом посте подробно описывается архитектура и методы, которые делают это возможным. Мы пройдемся по нашему &lt;b&gt;Планировщику запросов&lt;/b&gt; (Query Planner), который использует `R2 Data Catalog` для отсечения терабайтов данных еще до чтения первого байта, и объясним, как мы распределяем работу по глобальной сети Cloudflare, используя `Workers` и `R2` для массивного параллельного выполнения.&lt;/p&gt;
&lt;h5&gt;От каталога к запросу&lt;/h5&gt;
&lt;p&gt;Во время Developer Week 2025 мы запустили `R2 Data Catalog` — управляемый каталог `Apache Iceberg`, встроенный непосредственно в ваш бакет Cloudflare R2. Iceberg — это открытый формат таблиц, который предоставляет критически важные функции баз данных (такие как транзакции и эволюция схемы) для объектного хранилища петабайтного масштаба. Он дает вам надежный каталог ваших данных, но сам по себе не предоставляет способа их запрашивать.&lt;/p&gt;
&lt;p&gt;До сих пор чтение вашего каталога `R2 Data Catalog` требовало настройки отдельного сервиса, такого как `Apache Spark` или Trino. Эксплуатация этих движков в большом масштабе непроста: вам нужно создавать кластеры, управлять использованием ресурсов и отвечать за их доступность — ничто из этого не способствует главной цели: получению ценности из ваших данных.&lt;/p&gt;
&lt;p&gt;`R2 SQL` полностью устраняет этот этап. Это бессерверный движок запросов, который выполняет SQL-запросы на чтение (retrieval) к вашим таблицам Iceberg прямо там, где живут ваши данные.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;поясненИИе: Что такое Apache Iceberg?&lt;/b&gt;&lt;/summary&gt;&lt;/p&gt;
&lt;p&gt;Представьте, что у вас есть огромная куча файлов (CSV, Parquet, JSON) в облачном хранилище. Это “озеро данных”. Проблема в том, что если вы начнете менять один файл, пока кто-то другой его читает, все сломается. Трудно понять, какая версия данных актуальна.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Apache Iceberg&lt;/b&gt; — это слой управления поверх этих файлов. Он работает как библиотекарь: он не хранит сами книги (данные), но ведет идеальный учет (метаданные). Он точно знает: “Таблица ‘Пользователи’ сейчас состоит из вот этих 100 файлов”.&lt;br /&gt;
Это позволяет делать с обычными файлами в облаке то, что раньше умели только дорогие базы данных:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;ACID-транзакции:&lt;/b&gt; Гарантия того, что данные не запишутся “наполовину”.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Time Travel:&lt;/b&gt; Возможность сделать запрос “Как выглядела таблица вчера в 14:00?”.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ecosystem:&lt;/b&gt; Единый стандарт, который понимают разные инструменты аналитики.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Проектирование движка запросов для петабайтов&lt;/h5&gt;
&lt;p&gt;Объектное хранилище фундаментально отличается от хранилища традиционной базы данных. База данных структурирована по своей природе; `R2 `— это океан объектов, где одна логическая таблица может состоять из миллионов отдельных файлов, больших и маленьких, и новые поступают каждую секунду.&lt;/p&gt;
&lt;p&gt;Apache Iceberg предоставляет мощный слой логической организации поверх этой реальности. Он работает, управляя состоянием таблицы как неизменяемой серией мгновенных снимков (snapshots), создавая надежное, структурированное представление таблицы путем манипулирования “легкими” файлами метаданных вместо перезаписи самих файлов данных.&lt;/p&gt;
&lt;p&gt;Однако эта логическая структура не меняет физической проблемы, лежащей в основе: эффективный движок запросов всё равно должен найти конкретные данные, необходимые ему, в этой огромной коллекции файлов. Это требует преодоления двух основных технических барьеров:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Проблема ввода-вывода (I/O problem):&lt;/b&gt; Главная проблема эффективности запросов — минимизация объема данных, считываемых из хранилища. Подход “в лоб” с чтением каждого объекта просто нежизнеспособен. Основная цель — читать только те данные, которые абсолютно необходимы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Проблема вычислений (Compute problem):&lt;/b&gt; Объем данных, которые *действительно* нужно прочитать, все равно может быть огромным. Нам нужен способ выделить запросу, который может быть массивным, необходимое количество вычислительной мощности всего на несколько секунд, а затем мгновенно снизить его до нуля, чтобы избежать лишних трат.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Наша архитектура для `R2 SQL` разработана для решения этих двух проблем с помощью двухэтапного подхода: &lt;b&gt;Планировщик запросов&lt;/b&gt; (Query Planner), который использует метаданные для интеллектуального отсечения (pruning) пространства поиска, и система &lt;b&gt;Выполнения запросов&lt;/b&gt; (Query Execution), которая распределяет работу по глобальной сети Cloudflare для параллельной обработки данных.&lt;/p&gt;
&lt;h5&gt;Планировщик запросов (Query Planner)&lt;/h5&gt;
&lt;p&gt;Самый эффективный способ обработки данных — не читать их вовсе. Это ключевая стратегия планировщика `R2 SQL`. Вместо исчерпывающего сканирования каждого файла планировщик использует структуру метаданных, предоставляемую каталогом `R2 Data Catalog`, чтобы “подрезать” пространство поиска, то есть избежать чтения огромных массивов данных, не относящихся к запросу.&lt;/p&gt;
&lt;p&gt;Это расследование “сверху вниз”, где планировщик перемещается по иерархии слоев метаданных Iceberg, используя статистику (&lt;b&gt;stats&lt;/b&gt;) на каждом уровне для построения быстрого плана, точно указывающего, какие диапазоны байтов должен прочитать движок.&lt;/p&gt;
&lt;h6&gt;Что мы подразумеваем под “статистикой”?&lt;/h6&gt;
&lt;p&gt;Когда мы говорим, что планировщик использует “статы”, мы имеем в виду сводные метаданные, которые Iceberg хранит о содержимом файлов данных. Эта статистика создает грубую карту данных, позволяя планировщику принимать решения о том, какие файлы читать, а какие игнорировать, даже не открывая их.&lt;/p&gt;
&lt;p&gt;Есть два основных уровня статистики, которые планировщик использует для отсечения (pruning):&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Статистика уровня раздела (Partition-level stats):&lt;/b&gt; Хранится в списке манифестов (manifest list) Iceberg. Эти статы описывают диапазон значений разделов для всех данных в определенном файле манифеста Iceberg. Для раздела по `day(event_timestamp)` это будут самый ранний и самый поздний дни, присутствующие в файлах, отслеживаемых этим манифестом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Статистика уровня столбца (Column-level stats):&lt;/b&gt; Хранится в файлах манифестов. Это более детальная статистика о каждом отдельном файле данных. Файлы данных в `R2 Data Catalog` отформатированы с использованием `Apache Parquet`. Для каждого столбца файла Parquet манифест хранит ключевую информацию, такую как:
&lt;ul&gt;
  &lt;li&gt;Минимальное и максимальное значения. Если запрос запрашивает `http_status = 500`, а статистика файла показывает, что в столбце `http_status` минимум 200 и максимум 404, этот файл можно пропустить целиком.&lt;/li&gt;
  &lt;li&gt;Количество null-значений. Это позволяет планировщику пропускать файлы, когда запрос ищет конкретно non-null значения (например, `WHERE error_code IS NOT NULL`), а метаданные файла сообщают, что все значения для `error_code` являются null.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;Отсечение пространства поиска (Pruning)&lt;/h6&gt;
&lt;p&gt;Процесс отсечения — это расследование “сверху вниз”, которое происходит в три основных этапа:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Метаданные таблицы и текущий снимок (snapshot):&lt;/b&gt;  &lt;br /&gt;
Планировщик начинает с запроса к каталогу о местоположении текущих метаданных таблицы. Это JSON-файл, содержащий текущую схему таблицы, спецификации разделов и журнал всех исторических снимков. Затем планировщик выбирает последний снимок для работы.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Список манифестов и отсечение разделов:&lt;/b&gt;  &lt;br /&gt;
Текущий снимок указывает на единый *список манифестов* (manifest list) Iceberg. Планировщик читает этот файл и использует статистику уровня разделов для каждой записи, чтобы выполнить первый, самый мощный шаг отсечения, отбрасывая любые манифесты, чьи диапазоны значений разделов не удовлетворяют запросу. Например, для таблицы, партиционированной по дням, планировщик может отбросить манифесты за ненужные даты.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Манифесты и отсечение на уровне файлов:&lt;/b&gt;  &lt;br /&gt;
Для оставшихся манифестов планировщик читает каждый из них, чтобы получить список фактических файлов данных Parquet. Эти файлы манифестов содержат более детальную статистику уровня столбцов. Это позволяет выполнить второй шаг отсечения, отбрасывая целые файлы данных, которые не могут содержать строки, соответствующие фильтрам запроса.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Отсечение групп строк (Row-group pruning) внутри файла:&lt;/b&gt;  &lt;br /&gt;
Наконец, для конкретных файлов данных, которые всё еще являются кандидатами, Планировщик использует статистику, хранящуюся внутри *футеров* (footers) файлов Parquet, чтобы пропускать целые группы строк (row groups).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Результатом этого многослойного отсечения является точный список файлов Parquet и групп строк внутри этих файлов. Они становятся рабочими единицами (work units), которые отправляются в систему Выполнения запросов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;поясненИИе: Формат Parquet и Row Groups&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Apache Parquet&lt;/b&gt; — это колоночный формат хранения данных. В отличие от CSV, где данные хранятся строка за строкой, в Parquet данные хранятся столбец за столбцом. Это идеально для аналитики (когда вам нужно посчитать среднее по одной колонке, не читая остальные 50).&lt;/p&gt;
&lt;p&gt;Внутри себя файл Parquet делится на &lt;b&gt;Row Groups&lt;/b&gt; (группы строк). Представьте файл на 1 миллион строк. Он может быть разбит на 10 групп по 100,000 строк. У каждой группы есть свой мини-заголовок со статистикой (min/max значения).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример:&lt;/b&gt; Вы ищете `id = 950,000`.&lt;br /&gt;
Движок читает футер файла и видит:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Row Group 1: id 1-100,000 -&gt; Пропускаем.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;Row Group 10: id 900,001-1,000,000 -&gt; &lt;b&gt;Читаем только эту часть файла&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это называется “I/O skipping” и экономит огромное количество времени и денег на трафике.&lt;/p&gt;
&lt;h5&gt;Конвейер планирования (The Planning pipeline)&lt;/h5&gt;
&lt;p&gt;В `R2 SQL` описанное выше многослойное отсечение не является монолитным процессом. Для таблицы с миллионами файлов метаданные могут быть слишком большими, чтобы обработать их полностью до начала реальной работы. Ожидание полного плана внесет значительную задержку (latency).&lt;/p&gt;
&lt;p&gt;Вместо этого `R2 SQL` рассматривает планирование и выполнение как единый конкурентный конвейер (pipeline). Работа планировщика — производить поток рабочих единиц (work units), которые исполнитель (executor) потребляет, как только они становятся доступны.&lt;/p&gt;
&lt;h6&gt;Начало выполнения как можно раньше&lt;/h6&gt;
&lt;p&gt;С этого момента запрос обрабатывается в потоковом режиме. По мере того как Планировщик читает файлы манифестов (и, следовательно, файлы данных, на которые они указывают) и отсекает их, он немедленно отправляет любые подходящие файлы данных/группы строк как рабочие единицы в очередь выполнения.&lt;/p&gt;
&lt;p&gt;Такая конвейерная структура гарантирует, что вычислительные узлы могут начать дорогую работу по вводу-выводу данных практически мгновенно, задолго до того, как планировщик закончит свое полное расследование.&lt;/p&gt;
&lt;p&gt;На вершине этой модели конвейера планировщик добавляет критически важную оптимизацию: &lt;b&gt;преднамеренное упорядочивание&lt;/b&gt; (deliberate ordering). Файлы манифестов не стримятся в случайной последовательности. Вместо этого планировщик обрабатывает их в порядке, соответствующем условию `ORDER BY` вашего запроса, руководствуясь статистикой метаданных. Это гарантирует, что данные, которые с наибольшей вероятностью содержат желаемые результаты, обрабатываются первыми.&lt;/p&gt;
&lt;h6&gt;Ранняя остановка: как закончить, не читая всё&lt;/h6&gt;
&lt;p&gt;Благодаря тому, что Планировщик передает рабочие единицы в порядке, соответствующем `ORDER BY`, система выполнения сначала обрабатывает данные, которые с наибольшей вероятностью попадут в итоговый набор результатов.&lt;/p&gt;
&lt;p&gt;Например, для запроса типа `... ORDER BY timestamp DESC LIMIT 5`: по мере того как движок выполнения обрабатывает рабочие единицы и отправляет результаты обратно, планировщик одновременно делает две вещи:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Поддерживает ограниченную “кучу” (heap) из лучших 5 результатов, увиденных на данный момент.&lt;/li&gt;
&lt;li&gt;Следит за “ватерлинией” (high-water mark) самого потока. Благодаря метаданным он всегда знает абсолютно самый поздний `timestamp` любого файла данных, который *еще не был* обработан.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;В момент, когда самая старая временная метка в нашей “Топ-5 куче” оказывается новее, чем “ватерлиния” оставшегося потока (максимально возможная дата в еще не прочитанных файлах), &lt;b&gt;весь запрос может быть остановлен&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;В этот момент мы можем доказать, что ни одна оставшаяся рабочая единица не может содержать результат, который попал бы в топ-5. Конвейер останавливается, и пользователю возвращается полный, корректный результат, часто после чтения лишь крошечной доли потенциально подходящих данных.&lt;/p&gt;
&lt;hr /&gt;
&lt;h5&gt;Выполнение запросов (Query Execution)&lt;/h5&gt;
&lt;p&gt;Планировщик передает работу кусочками, называемыми &lt;b&gt;Row Groups&lt;/b&gt;. Сервер, который получает запрос пользователя, берет на себя роль &lt;b&gt;координатора запроса&lt;/b&gt;. Он распределяет работу между &lt;b&gt;воркерами&lt;/b&gt; (query workers) и агрегирует результаты.&lt;/p&gt;
&lt;p&gt;Сеть Cloudflare огромна. Координатор связывается с внутренним API Cloudflare, чтобы убедиться, что для выполнения выбираются только здоровые серверы. Соединения между координатором и воркерами проходят через `Cloudflare Argo Smart Routing` для обеспечения быстрой и надежной связи.&lt;/p&gt;
&lt;p&gt;Серверы, получающие задачи от координатора, становятся воркерами. Они служат точкой горизонтального масштабирования в `R2 SQL`. При большем количестве воркеров `R2 SQL` может обрабатывать запросы быстрее, распределяя работу между множеством серверов. Это особенно актуально для запросов, охватывающих большие объемы файлов.&lt;/p&gt;
&lt;h6&gt;Внутреннее устройство: Apache DataFusion&lt;/h6&gt;
&lt;p&gt;Внутри каждый воркер использует `Apache DataFusion` для выполнения SQL-запросов к группам строк. `DataFusion` — это аналитический движок запросов с открытым исходным кодом, написанный на &lt;b&gt;Rust&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Разделы (partitions) в `DataFusion` идеально ложатся на модель данных `R2 SQL`, поскольку каждая группа строк (row group) может рассматриваться как независимый раздел. Благодаря этому каждая группа строк обрабатывается параллельно.&lt;br /&gt;
Поскольку группы строк обычно содержат как минимум 1000 строк, `R2 SQL` выигрывает от &lt;b&gt;векторизованного выполнения&lt;/b&gt;. Каждый поток DataFusion может выполнять SQL-запрос сразу на множестве строк за один проход, амортизируя накладные расходы на интерпретацию запроса.&lt;/p&gt;
&lt;h6&gt;Поддержка Parquet и Arrow&lt;/h6&gt;
&lt;p&gt;`DataFusion` имеет первоклассную поддержку Parquet. Используя ranged reads (чтение диапазонов) в R2, он способен считывать только части файлов Parquet, содержащие запрошенные столбцы, пропуская остальные.&lt;/p&gt;
&lt;p&gt;Оптимизатор `DataFusion` также позволяет нам “проталкивать” фильтры (push down filters) на самые низкие уровни плана запроса. Другими словами, мы можем применять фильтры прямо в момент чтения значений из файлов Parquet.&lt;/p&gt;
&lt;p&gt;Когда воркер заканчивает вычисления, он возвращает результаты координатору через протокол &lt;b&gt;gRPC&lt;/b&gt;. `R2 SQL` использует `Apache Arrow` для внутреннего представления результатов. Это формат в оперативной памяти (in-memory), который эффективно представляет массивы структурированных данных. Arrow также определяет формат сериализации `Arrow IPC`, который идеально подходит для передачи данных между процессами по сети.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;поясненИИе: Векторизация и Apache Arrow&lt;/b&gt;&lt;/summary&gt;&lt;br /&gt;
&lt;b&gt;Векторизованное выполнение (Vectorized execution):&lt;/b&gt; Традиционные базы данных обрабатывали одну строку за раз (Row-at-a-time). Это медленно, потому что процессор постоянно переключается. Векторизация означает обработку данных “пачками” (например, сложить сразу 1000 чисел из колонки А с 1000 чисел из колонки Б). Это использует современные возможности CPU (SIMD инструкции) и работает в разы быстрее.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Apache Arrow:&lt;/b&gt; Это стандарт того, как хранить эти “пачки” данных в оперативной памяти, чтобы процессору было максимально удобно их читать.&lt;br /&gt;
Главный плюс Arrow: &lt;b&gt;Zero-copy&lt;/b&gt;. Если один инструмент (DataFusion) передает данные другому (по сети координатору), и оба понимают Arrow, им не нужно тратить время на перекодирование (сериализацию/десериализацию) данных. Они просто “передают указатель” или копируют сырые байты как есть.&lt;/p&gt;
&lt;h5&gt;Будущие планы&lt;/h5&gt;
&lt;p&gt;Хотя `R2 SQL` и так хорош в фильтрации, мы планируем быстро добавлять новые возможности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Поддержка сложных агрегаций (GROUP BY) в распределенном и масштабируемом виде.&lt;/li&gt;
&lt;li&gt;Инструменты для визуализации выполнения запросов (explain analyze), чтобы помочь разработчикам улучшать производительность.&lt;/li&gt;
&lt;li&gt;Поддержка многих конфигурационных опций Apache Iceberg.&lt;/li&gt;
&lt;li&gt;Возможность запрашивать каталоги прямо из панели управления Cloudflare (Dashboard).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Мы также исследуем различные виды индексов, чтобы сделать запросы еще быстрее, и планируем добавить полнотекстовый поиск, геопространственные запросы и многое другое.&lt;/p&gt;
&lt;h5&gt;Попробуйте сейчас!&lt;/h5&gt;
&lt;p&gt;Это ранние дни для `R2 SQL`, но он уже доступен в открытой бете! Переходите к нашему руководству по началу работы, чтобы создать сквозной конвейер данных. Мы ждем вашей обратной связи в нашем Discord для разработчиков.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;h4&gt;Итог и СоображенИИя&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Итог:&lt;/b&gt; Cloudflare выпустила мощный инструмент, который превращает их объектное хранилище (R2) в полноценную аналитическую базу данных. Используя открытые стандарты (Iceberg, Parquet, Arrow, DataFusion) и свою глобальную сеть периферийных вычислений (Edge), они решили главную проблему Big Data — необходимость платить за простой серверов. Здесь вы платите только за время выполнения конкретного SQL-запроса.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;СоображенИИя:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Коммодитизация аналитики:&lt;/b&gt; Cloudflare делает с Big Data то же, что ранее сделала с CDN и защитой от DDoS — делает сложные энтерпрайз-технологии доступными “по кнопке”. Использование открытого стека (Rust + Arrow + DataFusion) — это сейчас золотой стандарт построения современных СУБД (по этому пути идут такие гиганты как InfluxDB 3.0, LanceDB и др.). Cloudflare не изобретает велосипед, а собирает очень быструю ракету из лучших деталей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Убийца Snowflake/Databricks для “бедных”?&lt;/b&gt; Для огромных корпораций Snowflake и Databricks останутся стандартом из-за богатого функционала. Но для стартапов и среднего бизнеса, у которых данные лежат в R2 (чтобы не платить за egress трафик AWS), появление R2 SQL делает переезд на сторонние аналитические платформы бессмысленным. Зачем гонять данные туда-сюда, если можно выполнить SQL прямо “на месте”?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Синергия с ИИ:&lt;/b&gt; Упоминание планов на “индексы” и “геопространственные запросы” намекает на векторный поиск в будущем. Если Cloudflare добавит возможность делать векторный поиск по данным в R2 так же нативно, это станет киллер-фичей для всех, кто строит RAG (Retrieval-Augmented Generation) приложения на базе LLM. Хранишь документы в R2 -&gt; R2 SQL ищет контекст -&gt; Workers AI генерируют ответ. Весь цикл внутри одной экосистемы с минимальными задержками.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Еще можно почитать про &lt;a href="https://vegafusion.io"&gt;https://vegafusion.io&lt;/a&gt; и про формат &lt;a href="https://lance.org"&gt;https://lance.org&lt;/a&gt; – он как раз и добавит векторочков.&lt;/p&gt;
</description>
</item>

<item>
<title>Data Stack 2.0: Закат Lambda-архитектуры и восход Fluss с Lance</title>
<guid isPermaLink="false">317</guid>
<link>https://gavrilov.info/all/data-stack-2-0-zakat-lambda-arhitektury-i-voshod-fluss-s-lance/</link>
<pubDate>Fri, 13 Feb 2026 01:59:35 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/data-stack-2-0-zakat-lambda-arhitektury-i-voshod-fluss-s-lance/</comments>
<description>
&lt;h2&gt;Data Stack 2.0: Закат Lambda-архитектуры и восход Fluss с Lance&lt;/h2&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-13-v-01.58.40.png" width="1796" height="340" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В мире инфраструктуры данных происходит “тектонический сдвиг”, описанный в отчетах &lt;a href="https://a16z.com/emerging-architectures-for-modern-data-infrastructure/"&gt;a16z.com&lt;/a&gt;. Индустрия отходит от сложной Lambda-архитектуры (где batch и streaming живут отдельно) к унифицированным решениям, которые называют &lt;b&gt;Streamhouse&lt;/b&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-13-v-01.59.13.png" width="1476" height="412" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Два ключевых игрока, меняющих правила игры в этом переходе:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Apache Fluss&lt;/b&gt; — управляемое хранилище для потоковой обработки (Streaming Storage).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lance&lt;/b&gt; — формат данных нового поколения для AI и Data Lake.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1. Проблема: Почему одной Kafka больше недостаточно?&lt;/h3&gt;
&lt;p&gt;Долгое время Apache Kafka была стандартом де-факто для передачи данных. Однако, как отмечают эксперты Ververica в статье &lt;a href="https://www.ververica.com/blog/a-world-without-kafka"&gt;Мир без Kafka&lt;/a&gt;, Kafka была спроектирована как *распределенный лог*, а не как база данных.&lt;/p&gt;
&lt;p&gt;Перевод есть тут, у меня: &lt;a href="https://gavrilov.info/all/mir-bez-kafka-pochemu-kafka-ne-podhodit-dlya-analitiki-realnogo/"&gt;https://gavrilov.info/all/mir-bez-kafka-pochemu-kafka-ne-podhodit-dlya-analitiki-realnogo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Фундаментальные ограничения брокеров сообщений (Kafka/Pulsar) для аналитики:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Слабая работа с обновлениями (Updates):&lt;/b&gt; Kafka — это `append-only` система. Реализация `UPDATE` или `DELETE` требует использования *Compact Topics*, что не дает гарантий мгновенной консистентности и сложно в эксплуатации.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Медленное чтение истории:&lt;/b&gt; Чтобы найти запись годичной давности, вам часто нужно прочитать весь лог последовательно (Scan). Сложность операции — $O(N)$.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Row-based природа:&lt;/b&gt; Данные хранятся строками (Message bytes). Для аналитики (OLAP), где нам нужен средний чек по столбцу `price`, системе приходится распаковывать и читать *все* поля сообщения, что неэффективно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Apache Fluss: Недостающее звено для Flink&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://fluss.apache.org"&gt;Apache Fluss&lt;/a&gt; создан, чтобы решить проблему “разделения” между потоком и таблицей. Это нативное хранилище для Apache Flink, которое поддерживает &lt;a href="https://www.ververica.com/blog/introducing-fluss"&gt;концепцию Fluss&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Архитектурные прорывы:&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Гибридная модель чтения (Stream-Table Duality):&lt;/b&gt; Fluss позволяет читать данные и как бесконечный поток (Log), и как изменяемую таблицу с первичными ключами (Primary Key Table). Это делает реализацию &lt;b&gt;CDC (Change Data Capture)&lt;/b&gt; тривиальной: обновления перезаписывают старые значения по ключу.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Колоночная проекция (Columnar Projection):&lt;/b&gt; В отличие от Kafka, Fluss может отдавать аналитическому движку (Flink) только нужные колонки. Это снижает нагрузку на сеть (`I/O`) в разы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Real-Time Lookups:&lt;/b&gt; Fluss поддерживает точечные запросы (Point Lookup) по первичному ключу с задержкой порядка миллисекунд.  &lt;br /&gt;
$$Latency_{Fluss} \ll Latency_{Kafka Scan}$$  &lt;br /&gt;
Это позволяет использовать его как *Serverless State* для приложений, избавляясь от необходимости ставить рядом Redis или RocksDB.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tiered Storage в Data Lake:&lt;/b&gt; Fluss работает в паре с &lt;b&gt;Apache Paimon&lt;/b&gt; (ранее Flink Table Store). Горячие данные живут в Fluss (на быстрых дисках/RAM), а по мере устаревания автоматически конвертируются в формат Lakehouse (Paimon/Parquet/ ну или Iceberg) и уходят в S3.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. Lance: Новый стандарт для AI в Data Lake&lt;/h3&gt;
&lt;p&gt;Если Fluss отвечает за доставку и горячее состояние, то &lt;b&gt;Lance&lt;/b&gt; меняет подход к хранению холодных данных для задач машинного обучения (ML).&lt;/p&gt;
&lt;p&gt;Традиционный формат &lt;b&gt;Parquet&lt;/b&gt; великолепен для аналитики (сканирование больших диапазонов), но ужасен для AI, где требуется &lt;b&gt;случайный доступ (Random Access)&lt;/b&gt; для формирования батчей обучения.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lance.org"&gt;Lance&lt;/a&gt; решает эти проблемы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Случайный доступ:** Lance позволяет извлекать строки по индексу в ~100 раз быстрее Parquet.&lt;/li&gt;
&lt;li&gt;Векторный поиск:** Это формат со встроенным векторным индексом (IVF-PQ). Вы можете хранить эмбеддинги прямо в файлах на S3 и выполнять поиск ближайших соседей (ANN) без отдельной VectorDB (вроде Pinecone или Milvus).&lt;/li&gt;
&lt;li&gt;Zero-Copy версионирование:** Эффективное управление версиями датасетов без дублирования данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Сборка пазла: Как это работает вместе&lt;/h3&gt;
&lt;p&gt;Современный &lt;b&gt;Streamhouse&lt;/b&gt; (см. &lt;a href="https://bigdataschool.ru/blog/news/flink/fluss-for-flink/"&gt;примеры архитектуры]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;выглядит как-то так:&lt;/p&gt;
&lt;p&gt;Схема потока данных (Workflow):&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Ingestion:&lt;/b&gt;  &lt;br /&gt;
Приложения (на Go, Java, Python) пишут данные.&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;Важно:* Поскольку Fluss совместим с протоколом Kafka, можно использовать существующие &lt;b&gt;Kafka-клиенты&lt;/b&gt; в Go-сервисах для записи в Fluss, не дожидаясь нативных библиотек. Но это пока только теория. Сходу я не нашел примеров быстро, но можно использовать GO и Arrow Flight SQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Streaming Storage (Fluss):&lt;/b&gt;  &lt;br /&gt;
Fluss принимает данные, индексирует первичные ключи и хранит “горячее” окно (например, 24 часа).&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;Flink* выполняет `JOIN` и агрегации прямо поверх Fluss, используя `Lookup Join` (обогащение данных без сохранения большого стейта внутри Flink).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Archiving &amp; AI (Paimon/Lance):&lt;/b&gt;  &lt;br /&gt;
Исторические данные сбрасываются в S3.&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;Для классической BI-аналитики используется формат &lt;b&gt;Apache Paimon&lt;/b&gt; или Iceberg.&lt;/li&gt;
  &lt;li&gt;Для ML-задач данные конвертируются или хранятся в &lt;b&gt;Lance&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Unified Analytics (Trino):&lt;/b&gt;  &lt;br /&gt;
Движок &lt;a href="https://lance.org/integrations/trino/config/"&gt;Trino&lt;/a&gt; позволяет делать SQL-запросы ко всем слоям одновременно. Аналитик пишет один `SELECT`, а Trino забирает свежие данные из Fluss, а исторические — из S3 (Lance/Parquet/iceberg).&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Пример интеграции (концептуальный)&lt;/h4&gt;
&lt;p&gt;Поскольку прямого клиента Go для Fluss нет, использование в микросервисах чаще всего выглядит как работа через Kafka-протокол или HTTP-прокси, а основная логика ложится на Flink (Java/Python/ или еще чего):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Flink SQL example: Создание таблицы, управляемой Fluss
CREATE TABLE user_behavior (
    user_id BIGINT,
    item_id BIGINT,
    action STRING,
    ts TIMESTAMP(3),
    PRIMARY KEY (user_id) NOT ENFORCED
) WITH (
    'connector' = 'fluss',
    'bootstrap.servers' = '...:9092', // Fluss совместим с Kafka-адресацией
    'table.log.consistency' = 'eventual' // Оптимизация под высокую пропускную способность
);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Надо пробовать и тестировать... все таки еще инкубационный и это только теория.&lt;/p&gt;
&lt;h3&gt;5. Выводы и рекомендации&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Не используйте Kafka как базу данных.&lt;/b&gt; Если вашей архитектуре требуются частые обновления (`UPSERT`) и точечные запросы (`Lookup`), &lt;a href="https://fluss.apache.org"&gt;Apache Fluss&lt;/a&gt; — это более подходящий инструмент в экосистеме Flink.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lance для AI.&lt;/b&gt; Если вы строите RAG (Retrieval-Augmented Generation) или RecSys, рассмотрите формат Lance вместо связки “Parquet + внешняя VectorDB”. Это упростит инфраструктуру.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Следите за совместимостью.&lt;/b&gt; Интеграции Lance с Trino и Fluss с не-JVM языками (например, Go, Rust или еще чего) находятся в активной разработке. Используйте проверенные пути (Kafka Protocol для Ingestion, DataFusion/Java/Python для Querying).&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Полезные ресурсы для изучения:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://a16z.com/emerging-architectures-for-modern-data-infrastructure/"&gt;Emerging Architectures for Modern Data Infrastructure (a16z&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ververica.com/blog/introducing-fluss"&gt;Introducing Fluss (Ververica&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bigdataschool.ru/blog/news/flink/fluss-for-flink/"&gt;Fluss for Flink (BigDataSchool&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lance-format/lance-trino/issues/29#issuecomment-3893178604"&gt;Lance &amp; Trino Integration Issue (GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Мир без Kafka: Почему Kafka не подходит для аналитики реального времени, что идет на смену)</title>
<guid isPermaLink="false">318</guid>
<link>https://gavrilov.info/all/mir-bez-kafka-pochemu-kafka-ne-podhodit-dlya-analitiki-realnogo/</link>
<pubDate>Thu, 12 Feb 2026 13:50:00 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/mir-bez-kafka-pochemu-kafka-ne-podhodit-dlya-analitiki-realnogo/</comments>
<description>
&lt;p&gt;Статья описывает переход от традиционных систем обмена сообщениями, таких как Apache Kafka, к специализированным решениям для потоковой аналитики, таким как &lt;b&gt;Apache Fluss&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Основные тезисы:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Проблема Kafka:&lt;/b&gt; Kafka — это система хранения на основе *записей* (record-based), не имеющая нативной поддержки схем и аналитических возможностей. Это приводит к избыточному чтению данных и перегрузке сети при аналитических запросах, когда нужны только конкретные колонки, а не всё сообщение целиком.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Эволюция требований:&lt;/b&gt; Рынок перешел от простого перемещения данных (ingestion) к сложной аналитике реального времени и AI, что требует более эффективного хранения и доступа к данным.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Решение (Apache Fluss):&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Табличная структура:** Данные хранятся как таблицы (Log Tables для логов и PK Tables для изменяемых данных), что обеспечивает строгую типизацию.&lt;/li&gt;
  &lt;li&gt;Колоночное хранение:** Использование формата Apache Arrow позволяет читать только нужные колонки (projection pushdown) и эффективнее сжимать данные, что снижает нагрузку на диск и сеть.&lt;/li&gt;
  &lt;li&gt;Интеграция с Lakehouse:** Fluss нативно поддерживает многоуровневое хранение (горячие данные в Fluss, теплые/холодные в S3/Iceberg/Paimon) без лишнего копирования, обеспечивая прозрачный доступ к историческим и оперативным данным.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Вывод:&lt;/b&gt; Fluss в связке с Flink предлагает более дешевую, быструю и удобную архитектуру для современной аналитики реального времени, устраняя недостатки Kafka в этой области.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Ссылка на оригинал:&lt;/b&gt;&lt;br /&gt;
&lt;a href="https://www.ververica.com/blog/a-world-without-kafka"&gt;Why Kafka Falls Short for Real-Time Analytics (and What Comes Next&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;У Apache Kafka был замечательный период: она обеспечивала работу событийно-ориентированных архитектур более десяти лет. Но ландшафт изменился, обнажив явные &lt;b&gt;ограничения Kafka для аналитики в реальном времени&lt;/b&gt; по мере того, как сценарии использования современной &lt;b&gt;потоковой аналитики&lt;/b&gt; и принятия решений становятся всё более требовательными. Kafka все чаще пытаются заставить выполнять функции в &lt;b&gt;архитектуре аналитики реального времени&lt;/b&gt;, для поддержки которых она никогда не проектировалась. Чтобы решить сегодняшние проблемы конвейеров потоковой передачи данных и аналитические требования, необходимы новые возможности. Пришло время для «новичка на районе».&lt;/p&gt;
&lt;p&gt;Во время перехода от пакетной обработки к &lt;b&gt;потоковой передаче данных в реальном времени&lt;/b&gt; значительное внимание и импульс получил проект с открытым исходным кодом, разработанный внутри LinkedIn: &lt;b&gt;Apache Kafka&lt;/b&gt;. Цель состояла в том, чтобы упростить перемещение данных из точки А в точку Б масштабируемым и устойчивым способом, используя модель издатель/подписчик. Kafka позволила компаниям создавать ранние &lt;b&gt;конвейеры потоковой передачи данных&lt;/b&gt; и открыть новый класс событийно-ориентированных сценариев использования. Постоянно растущая экосистема коннекторов и интеграций ускорила внедрение и утвердила Kafka в качестве предпочтительного &lt;b&gt;слоя потокового хранения&lt;/b&gt;. Однако, по мере того как &lt;b&gt;архитектуры аналитики реального времени&lt;/b&gt; эволюционировали за пределы простого приема данных (ingestion), ограничения Kafka для аналитических нагрузок становились всё более очевидными.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-233.png" width="1200" height="674" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;С архитектурной точки зрения Kafka — это не аналитический движок. Это устойчивая и масштабируемая &lt;b&gt;система хранения на основе записей (record-based storage system)&lt;/b&gt; для свежих данных в реальном времени — часто называемая «горячим слоем». Следовательно, аналитические нагрузки должны выполняться за пределами кластера Kafka, постоянно перемещая данные между системами хранения и обработки, что увеличивает сетевой трафик и накладные операционные расходы. Кроме того, Kafka нативно не обеспечивает соблюдение схем для данных, публикуемых в топиках.&lt;/p&gt;
&lt;p&gt;Хотя эта гибкость была приемлема для ранних сценариев использования потоковой передачи, современные &lt;b&gt;платформы аналитики реального времени&lt;/b&gt; требуют схем для обеспечения согласованности, управления и качества данных. В качестве компенсации появились реестры схем (Schema Registries) для обеспечения контрактов между издателями и подписчиками, добавляя сложности аналитическим архитектурам на основе Kafka.&lt;/p&gt;
&lt;p&gt;И последнее, но не менее важное (и, возможно, самый важный аспект): Kafka — это система хранения на основе записей. Это хорошо подходит для использования в качестве очереди сообщений, например, для приема данных в реальном времени или событийно-ориентированных архитектур, но имеет значительные ограничения при решении текущих и будущих задач проектов реального времени. Движки обработки, такие как Spark и Flink, должны потреблять все данные топика, даже если требуется только часть данных события (столбцы). Результатом является ненужный сетевой трафик, снижение производительности обработки и чрезмерные требования к хранилищу.&lt;/p&gt;
&lt;p&gt;Компоненты потокового хранения на основе записей по-прежнему будут занимать свое место в архитектуре данных. Такие решения, как Kafka и Pulsar, хорошо подходят для случаев, требующих чтения полных записей. Архитектурные паттерны, основанные на микросервисах, могут использовать вышеуказанные решения для обмена данными, отделяя функции от транспортировки сообщений для повышения производительности, надежности и масштабируемости. Чтение полных записей также полезно для конвейеров приема данных (ingestion pipelines), в которых данные будут храниться в системах долгосрочного хранения, таких как объектное хранилище (Object Storage), для исторических и архивных целей. Узкие места и ограничения возникают, когда они используются для аналитических нагрузок, требующих возможностей, выходящих за рамки простого слоя транспорта данных.&lt;/p&gt;
&lt;h3&gt;Эволюция потоковых данных&lt;/h3&gt;
&lt;p&gt;Сегодняшний разговор движим единственным аспектом: Эволюция. Другими словами, новые потребности требуют новых подходов к управлению данными. Kafka удовлетворила первоначальные потребности в потоковой передаче данных. В этой первой волне в основном доминировали конвейеры приема данных в реальном времени и дискретная (SEP, Simple Event Processing) аналитика. По сути, способность перемещать данные из точки А в точку Б и, в некоторых случаях, выполнять простую подготовку и обработку данных между ними. Kafka, в сочетании со Spark Streaming или специальными коннекторами, справлялась с этими ранними сценариями использования.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-234.png" width="1200" height="674" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Перенесемся вперед: вторая волна привнесла сложность в потоковый конвейер. Помимо дискретной подготовки данных, сценарии использования на этом этапе требовали расширенных аналитических функций, таких как агрегация, обогащение и сложная обработка событий (CEP). Микро-батчинг (micro-batching) оказался недостаточным. Требуется новый архитектурный подход, основанный на колоночном хранении с эффективным проталкиванием проекций (projection pushdown) и прозрачным многоуровневым хранением данных (data tiering), в сочетании с движками обработки с задержкой менее секунды. `Apache Fluss` и `Apache Flink` могут выполнить это обещание и вместе составляют будущее и третью волну по шкале зрелости.&lt;/p&gt;
&lt;p&gt;Каждая техническая статья сегодня упоминает AI/ML. Эта эволюция «третьей волны» позволяет компаниям создавать AI-конвейеры реального времени, которые внедряют передовые аналитические методы (такие как Generative AI) в потоковые данные. Это увеличивает потребность в современных системах хранения данных в реальном времени с расширенными функциями, которые распределяют данные как по быстрым потоковым, так и по историческим слоям, обеспечивая интегрированный, унифицированный доступ к бизнес-данным.&lt;/p&gt;
&lt;h3&gt;Новичок на районе&lt;/h3&gt;
&lt;p&gt;`Apache Fluss` — это современная система хранения потоковых данных в реальном времени для аналитики. Она консолидирует многолетний опыт и уроки, извлеченные из предшественников, отвечая текущим и будущим потребностям организаций. Fluss родился в эпоху, когда для питания моделей машинного обучения требуется больше данных, Лейкхаусы (Lakehouses) являются частью корпоративной экосистемы, а облачная инфраструктура является предпочтительной стратегией для компаний.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-15-v-13.48.31.png" width="696" height="382" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Но хранение данных — это лишь часть архитектурной головоломки. `Apache Flink` предоставляет возможности и устойчивость для обработки огромных объемов данных в реальном времени с задержкой менее секунды, обеспечивая скорость, необходимую для будущих потоковых приложений. Не ограничиваясь Flink, дополнительные движки обработки и библиотеки разрабатывают интеграции с Fluss, тем самым укрепляя экосистему.&lt;/p&gt;
&lt;p&gt;Ниже приведены основные функции современной аналитики реального времени.&lt;/p&gt;
&lt;h4&gt;Поток как таблица (Stream as Table)&lt;/h4&gt;
&lt;p&gt;Fluss хранит данные как схематизированные таблицы. Этот подход подходит для большинства сценариев использования в реальном времени, включая те, которые опираются как на структурированные, так и на полуструктурированные данные. Структурируя потоковые данные, компании могут улучшить управление, повысить качество данных и гарантировать, что издатели и потребители используют общий язык. Fluss определяет два типа таблиц:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log Tables (Лог-таблицы)** работают только на добавление (append-only), аналогично топикам Kafka. Такие сценарии использования, как мониторинг логов, кликстримы (clickstreams), показания датчиков, журналы транзакций и другие, являются хорошими примерами данных только для добавления. События неизменяемы и не должны изменяться или обновляться.&lt;/li&gt;
&lt;li&gt;Primary Key (PK) Tables (Таблицы с первичным ключом)** — это изменяемые таблицы, определенные ключом. Записи сначала вставляются, а затем обновляются или удаляются с течением времени в соответствии с журналом изменений (changelog), который они представляют. Таблица PK хранит последние изменения всей таблицы, обеспечивая паттерн доступа «поиск записи» (record lookup). Сценарии использования журнала изменений, такие как балансы счетов, корзина покупок и управление запасами, могут извлечь выгоду из этого подхода. Kafka не может выполнять такое поведение, требуя внешних баз данных типа «ключ-значение» или NoSQL для отслеживания текущего статуса записи, что приводит к сложным и трудным в обслуживании решениям.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-235.png" width="1200" height="556" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Вкратце, PK Tables обеспечивают уникальность записей на основе первичного ключа, операций `INSERT`, `UPDATE` и `DELETE`, а также предоставляют широкие возможности изменения записей. С другой стороны, Log Tables работают только на добавление; обновления записей не требуются.&lt;/p&gt;
&lt;h4&gt;Колоночное хранение (Columnar Storage)&lt;/h4&gt;
&lt;p&gt;То, как Fluss хранит данные на диске, возможно, является наиболее фундаментальным архитектурным сдвигом по сравнению с другими решениями. В отличие от Kafka, Fluss использует формат `Apache Arrow` для хранения данных в колоночном формате, что дает следующие преимущества:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Улучшенное использование хранилища**, так как хранение данных в колоночном формате требует меньше дискового пространства. Степень сжатия зависит от множества характеристик данных, но первоначальные тесты показывают многообещающее улучшение в 5 раз при использовании Apache Arrow в качестве базового формата хранения. Меньше хранилища = меньше затрат. Kafka предоставляет лишь несколько вариантов сжатия данных, которые не сравнимы с теми, что доступны в Apache Arrow «из коробки».&lt;/li&gt;
&lt;li&gt;Эффективные запросы с использованием обрезки столбцов (column pruning).** В общем случае запрашивается или доступно менее половины атрибутов данного бизнес-события, т.е. только те имена столбцов, которые вы добавляете в ваше выражение `SELECT FROM`. Проталкивание проекции (projection pushdown) — это метод, который удаляет ненужные атрибуты (также известный как column pruning) при извлечении данных из системы хранения. Kafka работает по принципу «все или ничего» из-за своего формата хранения на основе записей.&lt;/li&gt;
&lt;li&gt;И колоночное сжатие, и проталкивание проекции улучшат сетевой трафик — перемещение меньшего количества данных приведет к тому, что сетевые администраторы станут счастливее. С Kafka компании постоянно сталкиваются с перегрузкой сети и потенциально высокими расходами на исходящий трафик (egress costs).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-236.png" width="1200" height="674" alt="" /&gt;
&lt;/div&gt;
&lt;h4&gt;Унификация с Lakehouse&lt;/h4&gt;
&lt;p&gt;Kafka была создана в эпоху Data Lake (Озер данных). С самого начала проектирования Fluss создавался для Lakehouse. Это создает большую разницу. Компании поняли, что Озера данных (или во многих случаях «Болота данных» — Data Swamps) трудно поддерживать в рабочем состоянии и окупать инвестиции в лицензии, оборудование и персонал для создания решений больших данных. К счастью, Лейкхаусы преодолевают эти проблемы. Лейкхаусы утверждают, что данные должны быть широко и легко доступны независимо от их возраста. Пакетные события и события реального времени перекрываются, и движки обработки должны иметь возможность прозрачно обращаться к обоим слоям.&lt;/p&gt;
&lt;p&gt;Вот возможности тиринга данных (распределения по уровням) и унифицированного просмотра, которые может предоставить Fluss, в дополнение к слою горячих/свежих данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Теплый слой (Warm layer):** для данных возрастом от минут до часов, в основном хранящихся в решениях объектного хранения (Object Storage).&lt;/li&gt;
&lt;li&gt;Холодный слой (Cold layer):** для данных возрастом от дней до лет. Решения Lakehouse, такие как `Apache Paimon` и `Iceberg`, являются предпочтительными платформами для этих исторических данных, питающих модели ML, ретроспективную аналитику и комплаенс.&lt;/li&gt;
&lt;li&gt;Zero-copy data tiering (Тиринг данных без копирования):** старение данных из горячего слоя (таблицы Fluss) в теплые/холодные слои (Object Storage и Lakehouse). Это означает, что доступна единственная копия единицы данных, либо в слое реального времени, либо в историческом слое. Fluss управляет переключением между слоями, облегчая запросы и доступ. Подход Kafka опирается на дублирование данных с помощью задания потребителя/издателя, что приводит к увеличению затрат на хранение и необходимости конвертировать топики Kafka в табличный формат Lakehouse.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-237.png" width="1200" height="674" alt="" /&gt;
&lt;/div&gt;
&lt;h3&gt;Светлое будущее впереди&lt;/h3&gt;
&lt;p&gt;Аналитика данных в реальном времени становится краеугольным камнем современных компаний. Цифровые бизнес-модели должны обеспечивать лучший пользовательский опыт и своевременные ответы на взаимодействия с клиентами, что заставляет компании создавать системы для использования и управления данными в реальном времени, создавая увлекательный и впечатляющий («wow») опыт. Действовать сейчас — это не просто вопрос технической осуществимости; для большинства предприятий это становится уникальным преимуществом для выживания в высококонкурентной глобальной рыночной среде.&lt;/p&gt;
&lt;p&gt;Fluss помогает компаниям преодолеть разрыв между мирами реального времени и аналитики, предлагая унифицированный доступ как к свежим данным в реальном времени, так и к историческим, холодным данным. Вкратце, Fluss обеспечивает беспрепятственный доступ к данным независимо от возраста набора данных и упрощает сложные архитектуры аналитики данных, которые тянулись годами, в основном из-за отсутствия наиболее подходящих компонентов и фреймворков.&lt;/p&gt;
&lt;p&gt;В то время как Fluss служит слоем хранения в реальном времени для аналитики, Лейкхаусу предоставляется управление, простота и масштабируемость, которые защищают современные архитектуры в будущем.&lt;/p&gt;
&lt;p&gt;С операционной стороны он предлагает значительные преимущества за счет снижения сложности управления, хранения и обслуживания как данных реального времени, так и пакетных данных. Эта эффективность трансформируется в прямую экономию средств, достигаемую в первую очередь за счет оптимизированного формата таблиц Fluss, двухуровневой системы хранения, основанной на температуре данных, и, наконец, минимизации общего использования ЦП конвейера с помощью проталкивания предикатов (predicate pushdown) и обрезки столбцов. В совокупности эти архитектурные элементы снижают накладные операционные расходы, связанные с обслуживанием платформы, ускоряют внедрение новых сценариев использования и облегчают бесшовную интеграцию с существующей ИТ-инфраструктурой предприятия.&lt;/p&gt;
</description>
</item>

<item>
<title>Data Contracts — соглашение между производителями и потребителями данных</title>
<guid isPermaLink="false">316</guid>
<link>https://gavrilov.info/all/data-contracts-soglashenie-mezhdu-proizvoditelyami-i-potrebitely/</link>
<pubDate>Sun, 08 Feb 2026 00:29:11 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/data-contracts-soglashenie-mezhdu-proizvoditelyami-i-potrebitely/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-08-v-00.24.54.png" width="912" height="504" alt="" /&gt;
&lt;/div&gt;
&lt;h4&gt;&lt;b&gt; о книге «Data Contracts»&lt;/b&gt; или как договориться о данных в эпоху хаоса и вернуть им ценность&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Введение: Кризис доверия в мире данных&lt;/b&gt;&lt;br /&gt;
Книга Чада Сандерсона и Марка Фримена «Data Contracts» выходит в момент глубокого кризиса в индустрии данных. Несмотря на триллионы долларов инвестиций в Modern Data Stack, облака и ИИ, компании всё чаще сталкиваются с парадоксом: данных больше, чем когда-либо, а извлекаемая ценность — под вопросом. Дашборды врут, модели ML ошибаются, а инженеры данных погребены под лавиной инцидентов. Авторы дают диагноз этой болезни: &lt;b&gt;«данные долг» (data debt)&lt;/b&gt;, и предлагают радикальное лечение: &lt;b&gt;«данные контракты» (data contracts)&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Часть 1: Диагноз — Эпидемия данных долга&lt;/b&gt;&lt;br /&gt;
Авторы проводят читателя через историческую эволюцию, объясняя, как мы пришли к текущему хаосу.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Золотой век и падение Хранилищ Данных:&lt;/b&gt; Раньше централизованные хранилища данных, созданные архитекторами, обеспечивали «единый источник истины». Это было медленно, дорого, но надежно.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Agile, микросервисы и «дамп данных»:&lt;/b&gt; Софтверные компании, движимые скоростью, убили роль архитектора данных. Данные перестали проектировать — их начали «сливать» в data lakes. Разрыв между командами, создающими данные (продуктовые разработчики, OLTP) и использующими их (аналитики, дата-сайентисты, OLAP), стал пропастью.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Иллюзия Modern Data Stack:&lt;/b&gt; Такие инструменты как Snowflake, Fivetran и dbt решили проблему «как» работать с данными, но усугубили проблему «что» и «почему». Они упростили перемещение и трансформацию беспорядочных данных, легализовав отсутствие дисциплины. Результат — взрывные затраты, непонятные SQL-запросы-монстры и полная потеря доверия.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Ключевой вывод:&lt;/b&gt; &lt;b&gt;Данные долг&lt;/b&gt; — это не техническая проблема, а организационная и коммуникационная. Он накапливается, когда команды, меняющие данные, не знают, кто и как их использует, а потребители данных не могут доверять их стабильности.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Часть 2: Новый императив — Data-Centric AI&lt;/b&gt;&lt;br /&gt;
Авторы блестяще связывают кризис данных с новой парадигмой в машинном обучении. Эндрю Нг провозгласил сдвиг от &lt;b&gt;model-centric AI&lt;/b&gt; (бесконечная настройка алгоритмов) к &lt;b&gt;data-centric AI&lt;/b&gt; (систематическое улучшение качества данных для обучения).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно?&lt;/b&gt; Модели, особенно с появлением больших языковых моделей (LLM), становятся товаром. Любой может вызвать мощнейшую модель через API. Конкурентное преимущество теперь создается не алгоритмом, а &lt;b&gt;качественными, уникальными данными&lt;/b&gt;, на которых он обучается и работает.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Парадокс:&lt;/b&gt; В момент, когда бизнесу как никогда нужны чистые, надежные данные для ИИ, его инфраструктура данных наименее к этому готова. Data-Centric AI требует фундамента, которого нет — управляемого, контрактного подхода к данным.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Часть 3: Лечение — Data Contracts как API для доверия&lt;/b&gt;&lt;br /&gt;
Data Contracts — это ядро предлагаемого решения. Это не юридические документы, а &lt;b&gt;машиночитаемые соглашения&lt;/b&gt;, оформленные как код.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Что это такое?&lt;/b&gt; Контракт между &lt;b&gt;производителем данных&lt;/b&gt; (например, сервис, который генерирует события о покупках) и &lt;b&gt;потребителем данных&lt;/b&gt; (например, команда аналитики, строящая отчет по выручке).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Что в него входит?&lt;/b&gt; Схема данных (типы, имена полей), семантика (что означает каждое поле, бизнес-правила), соглашения об уровне обслуживания (SLAs — частота обновления, задержка), правила обработки конфиденциальных данных (PII).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Как работает?&lt;/b&gt; Контракт устанавливается через API. При попытке изменить источник данных (удалить поле, изменить тип) система проверяет все зависимые контракты и либо блокирует изменение, либо требует скоординированной миграции. Это автоматизирует коммуникацию и создает «защитные ограждения».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Часть 4: Практика — Качество данных как измеримый процесс&lt;/b&gt;&lt;br /&gt;
Авторы уходят от утопии «идеальных данных» к прагматичному управлению качеством. Они предлагают измерять его через:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Опережающие индикаторы:&lt;/b&gt; Наличие владельцев у источников данных, уровень &lt;b&gt;доверия&lt;/b&gt; команд к данным (измеряется через опросы), объем данных долга (сложность запросов, количество backfill-задач).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Запаздывающие индикаторы:&lt;/b&gt; &lt;b&gt;Время простоя данных&lt;/b&gt; (data downtime), количество инцидентов с реальным бизнес-влиянием (например, ошибочный отзыв товара).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Главная мысль: нужно говорить с бизнесом не о «качестве», а о &lt;b&gt;рисках и потерях денег&lt;/b&gt; из-за его отсутствия.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Заключение: Возвращение к дисциплине через инновации&lt;/b&gt;&lt;br /&gt;
«Data Contracts» — это манифест за возвращение инженерной дисциплины в мир данных, но на новом уровне. Это не призыв вернуться к медленным централизованным хранилищам. Это предложение создать &lt;b&gt;децентрализованную, но управляемую экосистему данных&lt;/b&gt;, где скорость микросервисов сочетается с надежностью контрактов.&lt;/p&gt;
&lt;p&gt;Книга является обязательным чтением для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Руководителей данных (CDO, Head of Data)&lt;/b&gt;, чтобы понять стратегический ответ на вызовы data debt и Data-Centric AI.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инженеров данных и архитекторов&lt;/b&gt;, ищущих практические методы наведения порядка.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Продуктовых менеджеров и разработчиков&lt;/b&gt;, которые должны осознать, что их данные — это продукт для внутренних клиентов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Дата-сайентистов и аналитиков&lt;/b&gt;, уставших от нестабильных данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Data Contracts — это больше, чем технология. Это философия сотрудничества, которая превращает данные из источника постоянных проблем в настоящий актив, способный обеспечить конкурентное преимущество в эпоху ИИ.&lt;/p&gt;
&lt;h3&gt;Приложение пример полей и контракта данных&lt;/h3&gt;
&lt;p&gt;Атрибуты контракта (обязательные и опциональные)&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Атрибут&lt;/td&gt;
&lt;td&gt;Тип&lt;/td&gt;
&lt;td&gt;Обязательный&lt;/td&gt;
&lt;td&gt;Описание&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;domain&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Домен Data Mesh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_product&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Название дата-продукта&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Контакт команды-владельца&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;schema&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Схема данных (Avro/JSON/Parquet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;slas&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Требования к свежести, доступности&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;security&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;td&gt;Поля ПДн, политики доступа&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;quality_checks&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;td&gt;Список проверок качества&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;consumers&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;td&gt;Список команд-потребителей&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lifecycle&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;td&gt;Правила хранения, архивации&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;version: 1.0
domain: sales
owner: team-sales@company.com
data_product: customer_events
schema:
  type: avro/json
  definition: { ... }
slas:
  freshness: &amp;quot;5m&amp;quot;
  completeness: &amp;quot;99.9%&amp;quot;
security:
  pii_fields: [&amp;quot;email&amp;quot;, &amp;quot;phone&amp;quot;]
  masking: dynamic
quality_checks:
  - type: null_check
    columns: [&amp;quot;user_id&amp;quot;]
  - type: range_check
    column: &amp;quot;amount&amp;quot;
    min: 0
consumers:
  - analytics_team
  - ml_team
lifecycle:
  retention_days: 365
  archive_after: 90&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>Еще один дата каталожик – Marmot</title>
<guid isPermaLink="false">315</guid>
<link>https://gavrilov.info/all/esche-odin-data-katalozhik-marmot/</link>
<pubDate>Sun, 08 Feb 2026 00:06:32 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/esche-odin-data-katalozhik-marmot/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-02-08-v-00.05.35.png" width="434" height="364" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/marmotdata/marmot"&gt;https://github.com/marmotdata/marmot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Marmot is an open-source data catalog designed for teams who want powerful data discovery without enterprise complexity. Built with a focus on simplicity and speed, Marmot helps you catalog assets across your entire data stack – from databases and APIs to message queues and data pipelines.&lt;/p&gt;
&lt;p&gt;Unlike traditional catalogs that require extensive infrastructure and configuration, Marmot ships as a single binary with an intuitive UI, making it easy to deploy and start cataloging in minutes.&lt;/p&gt;
&lt;p&gt;Built for Modern Data Teams&lt;/p&gt;
&lt;p&gt;Deploy in Minutes: Single binary, Docker, or Kubernetes – no complex setup required&lt;br /&gt;
Powerful Search: Powerful query language with full-text, metadata, and boolean operators&lt;br /&gt;
Track Lineage: Interactive dependency graphs to understand data flows and impact&lt;br /&gt;
Flexible Integrations: CLI, REST API, Terraform, and Pulumi – catalog assets your way&lt;br /&gt;
Lightweight: PostgreSQL-backed with minimal resource requirements&lt;/p&gt;
</description>
</item>

<item>
<title>Анатомия невидимости: гид по рекламным идентификаторам (2025+)</title>
<guid isPermaLink="false">312</guid>
<link>https://gavrilov.info/all/anatomiya-nevidimosti-gid-po-reklamnym-identifikatoram-2025/</link>
<pubDate>Tue, 20 Jan 2026 22:16:15 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/anatomiya-nevidimosti-gid-po-reklamnym-identifikatoram-2025/</comments>
<description>
&lt;p&gt;В современном маркетинге данные — это новая нефть, а &lt;b&gt;рекламный идентификатор (Advertising ID)&lt;/b&gt; — это трубопровод, по которому эта нефть течет. От смартфона в кармане до умного телевизора в гостиной: каждое устройство имеет свой цифровой паспорт.&lt;/p&gt;
&lt;p&gt;В этой статье мы разберем не только скрытую механику «рекламной слежки», но и юридические риски для бизнеса в РФ, новые технологии обхода блокировок и то, как клиентский опыт (CX) меняется в эпоху тотальной приватности.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1. Зоопарк идентификаторов: Кто есть кто&lt;/h3&gt;
&lt;p&gt;Рынок рекламных ID фрагментирован. Каждый сегмент решает одну задачу — узнать пользователя, — но делает это разными способами.&lt;/p&gt;
&lt;h4&gt;📱 Мобильные устройства (MAID — Mobile Advertising IDs)&lt;/h4&gt;
&lt;p&gt;Это самые ценные идентификаторы, так как смартфон является наиболее персональным (“интимным”) устройством.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;IDFA (Identifier for Advertisers):&lt;/b&gt; Стандарт Apple (iOS). После внедрения *App Tracking Transparency (ATT)* в iOS 14.5 доступ к нему закрыт по умолчанию.  &lt;br /&gt;
&gt; &lt;b&gt;Важно:&lt;/b&gt; Лишь 20-30% пользователей в мире нажимают «Разрешить» (Allow Tracking). Это создало огромную «слепую зону» в аналитике.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GAID (Google Advertising ID) / AAID:&lt;/b&gt; Аналог для Android. Позволяет связывать активность пользователя между разными приложениями. Google также движется в сторону ограничения доступа через инициативу Privacy Sandbox on Android.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;📺 Телевизоры и Set-Top Box (CTV IDs)&lt;/h4&gt;
&lt;p&gt;С ростом Smart TV и стримингов маркетологи теперь трекают пользователей «на диване».&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Примеры:&lt;/b&gt; TIFA (Samsung), Roku ID, Amazon Fire TV ID.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Логика Household (Домохозяйство):&lt;/b&gt; В отличие от личных смартфонов, эти ID часто привязаны к семье.
&lt;ul&gt;
  &lt;li&gt;*Инсайт эксперта по данным:* Это создает проблему «шумных данных». Если вы рекламируете женские духи, а телевизор смотрит муж или ребенок, атрибуция будет ошибочной. Для очистки данных используются Cross-Device графы, связывающие TV ID с мобильными телефонами, находящимися в той же Wi-Fi сети.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;🌐 Веб-идентификаторы&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Third-Party Cookies:&lt;/b&gt; Старейший и умирающий стандарт. Текстовые файлы, оставляемые рекламными сетями (не владельцем сайта) в браузере.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stable IDs / Hashed Emails:&lt;/b&gt; Новая валюта рынка. Это зашифрованные (хэшированные) адреса электронной почты или номера телефонов. Используются в таких решениях, как *Unified ID 2.0*.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;details&gt;&lt;br /&gt;
&lt;summary&gt;&lt;b&gt;🔍 Юридический комментарий: Персональные данные в РФ&lt;/b&gt;&lt;/summary&gt;&lt;/p&gt;
&lt;p&gt;Согласно &lt;b&gt;152-ФЗ «О персональных данных»&lt;/b&gt; &lt;a href="https://normativ.kontur.ru/document?moduleId=1&amp;documentId=501173"&gt;normativ.kontur.ru&lt;/a&gt; и позиции Роскомнадзора, любые данные, которые позволяют (даже косвенно) идентифицировать личность, могут считаться персональными данными (ПДн).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Является ли IDFA/GAID персональными данными?&lt;/b&gt; Формально — нет, это псевдонимизированные данные. &lt;b&gt;НО:&lt;/b&gt; Как только вы обогащаете этот ID номером телефона из вашей CRM или связываете его с профилем конкретного клиента, он становится ПДн.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Риски:&lt;/b&gt; Хранение баз с “просто ID” безопаснее, но как только происходит «склейка» (matching) с реальным человеком, вы обязаны иметь согласие на обработку (и часто — на передачу третьим лицам, т.е. рекламным сетям).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Штрафы:&lt;/b&gt; За нарушение правил обработки ПДн штрафы для юрлиц могут достигать 18 млн рублей (при повторном нарушении при локализации), а за утечки — вплоть до оборотных штрафов (обсуждаемые поправки). Подробнее о сборе данных &lt;a href="https://adesk.ru/blog/kak-biznesu-sobirat-i-khranit-personalnye-dannye-chtoby-ne-poluchit-shtraf/"&gt;adesk.ru&lt;/a&gt;.&lt;br /&gt;
&lt;/details&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Механика: Как они строятся и живут&lt;/h3&gt;
&lt;h4&gt;Формула генерации&lt;/h4&gt;
&lt;p&gt;Большинство мобильных ID (GAID, IDFA) представляют собой &lt;b&gt;UUID (Universally Unique Identifier) версии 4&lt;/b&gt;. Это 128-битное число.&lt;/p&gt;
&lt;p&gt;$$ P(collision) \approx \frac{n^2}{2 \times 2^{128}} $$&lt;/p&gt;
&lt;p&gt;Вероятность совпадения двух таких ID астрономически мала.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Пример:&lt;/b&gt; `123e4567-e89b-12d3-a456-426614174000`&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Генерация:&lt;/b&gt; Алгоритм использует криптографически стойкий генератор случайных чисел (CSPRNG) + энтропию системы (время запуска, «шум» железа).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Жизненный цикл и безопасность&lt;/h4&gt;
&lt;p&gt;Главное отличие рекламного ID от аппаратного (IMEI) — возможность сброса (&lt;b&gt;Resettability&lt;/b&gt;).&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Действие пользователя:&lt;/b&gt; В настройках конфиденциальности нажимается «Сбросить рекламный ID».&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Реакция ОС:&lt;/b&gt; Генерируется новый UUID.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Результат:&lt;/b&gt; Для рекламных сетей устройство становится «чистым листом». История интересов разрывается.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;3. E-commerce: Сквозь экраны к покупке&lt;/h3&gt;
&lt;p&gt;В интернет-коммерции ID — это клей, собирающий разрозненные клики в путь покупателя (Customer Journey Map).&lt;/p&gt;
&lt;h4&gt;Сквозная аналитика (Cross-Device)&lt;/h4&gt;
&lt;p&gt;Как понять, что телефон `User_A` и ноутбук `Cookie_B` — это один человек?&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Deterministic (Точный метод):&lt;/b&gt; «Золотой стандарт». Пользователь залогинился в магазине под своим Email на обоих устройствах. Связка 100% достоверна.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Probabilistic (Вероятностный метод):&lt;/b&gt; Система видит, что телефон и ноутбук ежедневно выходят в сеть с одного IP-адреса Wi-Fi в одно время, имеют похожие паттерны посещения сайтов. Алгоритмы с вероятностью 90%+ «склеивают» профили в один Household.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Механика таргетинга (RTB – Real Time Bidding)&lt;/h4&gt;
&lt;p&gt;Процесс показа рекламы занимает &lt;b&gt;менее 100 миллисекунд&lt;/b&gt;:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Вы смотрите кроссовки в приложении (система фиксирует ваш `GAID`).&lt;/li&gt;
&lt;li&gt;Вы открываете новостной сайт. Сайт отправляет ваш `GAID` на рекламную биржу.&lt;/li&gt;
&lt;li&gt;DSP (платформа закупки) узнает ваш ID в базе сегментов: *«Это тот же, кто смотрел Nike 5 минут назад!»*.&lt;/li&gt;
&lt;li&gt;Происходит мгновенный аукцион, ставка выигрывает, и вам показывается баннер.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;4. Феномен Amazon Ads и Retail Media&lt;/h3&gt;
&lt;p&gt;Amazon (и его аналоги в РФ) стоит особняком. Это закрытая экосистема (&lt;b&gt;Walled Garden&lt;/b&gt;), чья сила не в технологиях трекинга, а в транзакционных данных. Им не нужно *угадывать*, что вы хотите купить, они *знают*, что вы покупаете.&lt;/p&gt;
&lt;h4&gt;Идентификатор Amazon&lt;/h4&gt;
&lt;p&gt;В основе лежит не «летучий» UUID устройства, а &lt;b&gt;Internal Customer ID&lt;/b&gt;, жестко привязанный к аккаунту.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Формула матчинга:&lt;/b&gt; Для обмена данными с внешним миром используется &lt;b&gt;Hashed Email (HEM)&lt;/b&gt;. Ваш email превращается в необратимую строку (обычно SHA-256).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Clean Rooms (AMC):&lt;/b&gt; Amazon Marketing Cloud позволяет крупным брендам загружать свои CRM-данные в защищенную среду, где они пересекаются с данными Amazon. Рекламодатель получает инсайты (например, “Клиенты, купившие кофемашину у нас на сайте, покупают капсулы на Amazon”), но не видит персональных данных конкретных людей.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;5. Война за приватность и обходные пути&lt;/h3&gt;
&lt;p&gt;Индустрия находится в состоянии холодной войны между запросом на приватность и эффективностью.&lt;/p&gt;
&lt;h4&gt;Главные сложности&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Apple ATT:&lt;/b&gt; Обрушение эффективности рекламы Facebook на iOS. Стоимость привлечения клиента (CAC) выросла на 40-60%.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Смерть Cookies:&lt;/b&gt; Google Chrome (хоть и откладывает полное отключение) внедряет Privacy Sandbox, заменяя индивидуальные куки на FLoC/Topics API (группировку по интересам).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Блокировщики:&lt;/b&gt; AdBlock режет запросы к доменам трекеров. (на уровне DNS, например AdGuard)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Как рынок обходит блокировки? Технический Deep Dive&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Server-Side Tracking (S2S / CAPI):&lt;/b&gt;  &lt;br /&gt;
Вместо отправки данных пикселем из браузера (JS), данные о покупке отправляются напрямую с бэкенда магазина на сервер рекламной системы (например, через Facebook Conversions API).&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;Плюс:* Не блокируется AdBlock и браузерами. Точность данных выше.&lt;/li&gt;
  &lt;li&gt;Минус:* Сложная техническая реализация. Требует согласия пользователя на передачу данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Fingerprinting (Серый метод):&lt;/b&gt;  &lt;br /&gt;
Сбор уникальных параметров устройства без использования cookie:&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;`Screen Resolution` + `User Agent` + `Battery Level` + `System Fonts` + `AudioContext`&lt;/li&gt;
  &lt;li&gt;Такой “цифровой отпечаток” уникален для 95% пользователей. Apple и Google активно борются с этим методом, считая его нарушением приватности.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Итог: Тренды 2025+ и рекомендации&lt;/h3&gt;
&lt;p&gt;Эра «дикого запада», когда можно было незаметно следить за каждым шагом, заканчивается. Мы переходим в эру агрегированных данных и доверительного маркетинга (Zero-Party Data).&lt;/p&gt;
&lt;h4&gt;Ключевые тренды:&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;First-Party Data — король:&lt;/b&gt; Компании, владеющие собственными данными и прямым контактом с клиентом (Email, App), выигрывают. Зависимость от Facebook становится токсичной.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Retail Media Networks:&lt;/b&gt; Бум рекламных сетей маркетплейсов. Они обладают данными о деньгах, а не о кликах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI вместо Cookies:&lt;/b&gt; Алгоритмы машинного обучения будут «достраивать» потерянные данные. Например, Google GA4 уже использует моделирование конверсий для пользователей, отказавшихся от трекинга.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;✅ Рекомендация&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Инвестируйте в CDP (Customer Data Platform):&lt;/b&gt; Собирайте все данные (CRM, сайт, приложение) в одном месте.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Внедряйте Server-Side трекинг:&lt;/b&gt; Это единственный способ сохранить точность аналитики в будущем.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Тестируйте новые каналы:&lt;/b&gt; Telegram Ads (работает без кук, на контексте каналов) или Retail Media.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Аудит согласий:&lt;/b&gt; Проверьте формы сбора данных на сайте. Галочка «Согласен на рекламную рассылку» должна быть отделена от «Согласен на обработку ПДн». Но мне, если честно, не нравится такой подход. Я бы сделал так – Типа Посмотри 10 рекламных роликов, и спи спокойно сегодня до 12, больше показывать сегодня не буду типа)))&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обезличивание:&lt;/b&gt; Используйте методы обезличивания (деперсонализации) при передаче данных партнерам, как того требуют новые правила &lt;a href="https://www.consultant.ru/document/cons_doc_LAW_511607/d3d38cd263a833779d35b1d4892762b85632b1b4/"&gt;consultant.ru&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Цели обработки:&lt;/b&gt; Четко прописывайте цели в политике конфиденциальности (например, не просто “маркетинг”, а “таргетирование рекламы в сетях Яндекса”) &lt;a href="https://rppa.pro/analitika/celi_obrabotki_pdn"&gt;rppa.pro&lt;/a&gt;. Кстати, хороший справочник.&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Apache Iceberg V3: Готов ли он?</title>
<guid isPermaLink="false">306</guid>
<link>https://gavrilov.info/all/apache-iceberg-v3-gotov-li-on/</link>
<pubDate>Thu, 18 Dec 2025 22:06:36 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/apache-iceberg-v3-gotov-li-on/</comments>
<description>
&lt;h2&gt;Apache Iceberg V3: Готов ли он?&lt;/h2&gt;
&lt;p&gt;Автор: Guy Yasoor (Ryft Blog)&lt;br /&gt;
Перевод и дополнения: Gemini 3 Pro Preview и я кофе носил&lt;/p&gt;
&lt;p&gt;Оригинал: &lt;a href="https://www.ryft.io/blog/apache-iceberg-v3-is-it-ready"&gt;https://www.ryft.io/blog/apache-iceberg-v3-is-it-ready&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Выход Apache Iceberg V3 — это огромный шаг вперед для экосистемы лейкхаусов (lakehouse). Спецификация V3 была финализирована и ратифицирована в начале этого года, привнеся в ядро формата несколько долгожданных возможностей: эффективные удаления на уровне строк (row-level deletes), встроенное отслеживание происхождения строк (row lineage), улучшенная обработка полуструктурированных данных и зачатки нативного шифрования.&lt;/p&gt;
&lt;p&gt;Этим новым возможностям уделяется много внимания, но в разговорах часто упускают вопрос, который важен не меньше: &lt;b&gt;Насколько V3 готов на практике?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Честный ответ: это полностью зависит от ваших движков обработки данных (engines). Некоторые среды, такие как Spark и Flink, уже хорошо поддерживают V3. Другие — пока отстают.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Основные возможности V3&lt;/h3&gt;
&lt;h4&gt;Deletion Vectors (Векторы удаления)&lt;/h4&gt;
&lt;p&gt;Векторы удаления прикрепляют информацию об удалении строк непосредственно к файлам данных в виде битовых карт, избегая накопления позиционных файлов удалений (positional delete files).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;gt;**поИИснение:**
&amp;gt;В предыдущих версиях (V2) использовались **Positional Delete Files** — это отдельные Parquet-файлы, содержащие пути и позиции удаленных строк. При чтении (Merge-on-Read) движку приходилось считывать файл данных, считывать файл удалений и делать между ними `JOIN`, чтобы отфильтровать ненужное. Это требует много памяти и ввода-вывода (IO).
&amp;gt;
&amp;gt;**Deletion Vector (V3)** — это, по сути, компактная битовая карта (bitmap), хранящаяся внутри или рядом с файлом данных. Движку достаточно прочитать этот маленький массив битов пропустить удаленные строки &amp;quot;на лету&amp;quot;, без дорогостоящих операций слияния. Это критически ускоряет чтение активно изменяемых таблиц.&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Статус:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Принято в большинстве движков, реализующих V3.&lt;/li&gt;
  &lt;li&gt;Стабильное чтение/запись в `Apache Spark`, `Apache Flink`.&lt;/li&gt;
  &lt;li&gt;Вероятно, самая готовая к продакшену функция.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Row Lineage (Происхождение строк)&lt;/h4&gt;
&lt;p&gt;Row lineage вводит стабильные идентификаторы строк и метаданные версий. Это упрощает инкрементальную обработку, CDC, аудит и отладку.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;gt;**поИИснение:**
&amp;gt;Без Row Lineage, если вы обновляете таблицу, строки часто физически перезаписываются, и их &amp;quot;личность&amp;quot; теряется. Чтобы понять, что изменилось, приходилось сравнивать полные копии данных (expensive diff).
&amp;gt;V3 присваивает строкам суррогатные ID. Это позволяет реализовать дешевый CDC (Change Data Capture): вы точно знаете, что &amp;quot;Строка #123&amp;quot; была обновлена, и можете каскадно обновить только связанные с ней агрегаты в витринах данных, вместо пересчета всей витрины.&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Статус:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Принято в большинстве движков V3.&lt;/li&gt;
  &lt;li&gt;Достаточно зрелая технология для V3-совместимых стеков.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Тип данных VARIANT&lt;/h4&gt;
&lt;p&gt;`VARIANT` — это нативный тип для полуструктурированных данных, замена хранению JSON в виде простых строк. Однако текущая поддержка частичная: не хватает “шреддинга” (shredding).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;gt;**поИИснение:**
&amp;gt;В чем суть **Shredding (измельчения)**? Если вы храните JSON как строку (String), базе данных нужно парсить весь JSON для каждого запроса, чтобы достать одно поле `{&amp;quot;user&amp;quot;: &amp;quot;Ivan&amp;quot;, ...}`. Это медленно.
&amp;gt;Тип `VARIANT` хранит данные в бинарном формате. А **Shredding** — это оптимизация, когда движок замечает, что поле `user` встречается в 95% записей. Он автоматически вытаскивает это поле в отдельную физическую колонку Parquet, сохраняя при этом логическую структуру JSON. Это позволяет читать поле `user` так же быстро, как обычную колонку, но сохранять гибкость схемы (schema evolution), не делая `ALTER TABLE` при добавлении новых полей в JSON.&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Статус:**
&lt;ul&gt;
  &lt;li&gt;Поддерживается в Spark, Flink, Databricks SQL.&lt;/li&gt;
  &lt;li&gt;Parquet стандартизирует кодировки, что даст общее представление для оптимизации.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Геопространственные типы и Шифрование&lt;/h4&gt;
&lt;p&gt;V3 вводит типы для гео-данных и блоки для шифрования на уровне таблицы.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Статус:&lt;/b&gt; Гео-типы доступны через расширения (`Apache Sedona`), шифрование находится на ранней стадии (только Spark/Flink).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Поддержка движками: Где V3 реально работает?&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Движок&lt;/td&gt;
&lt;td style="text-align: center"&gt;Статус V3&lt;/td&gt;
&lt;td style="text-align: center"&gt;Комментарий&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Apache Spark&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Отличный&lt;/td&gt;
&lt;td style="text-align: center"&gt;Начиная с v4.0 — самая надежная платформа для V3.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Apache Flink&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Хороший&lt;/td&gt;
&lt;td style="text-align: center"&gt;Идеален для стриминга, поддерживает основные фичи.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Databricks&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;⚠️ Beta&lt;/td&gt;
&lt;td style="text-align: center"&gt;Работает, но есть ограничения по типам данных.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;AWS (Glue/EMR)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;⚠️ Частичный&lt;/td&gt;
&lt;td style="text-align: center"&gt;Зависит от версии движка под капотом.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Amazon Athena&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌ Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Главный блокер&lt;/b&gt; для пользователей AWS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Trino / Starburst&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;🔸 Смешанный&lt;/td&gt;
&lt;td style="text-align: center"&gt;Starburst (коммерческий) поддерживает, OSS Trino — нет.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Snowflake&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;⏳ Ожидание&lt;/td&gt;
&lt;td style="text-align: center"&gt;Активно разрабатывали спецификацию, но публичной поддержки V3 в Managed Iceberg пока нет.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Итог: Переходить ли на V3?&lt;/h3&gt;
&lt;p&gt;Для большинства: &lt;b&gt;пока нет&lt;/b&gt;.&lt;br /&gt;
Ключевые игроки (Athena, Trino OSS, Snowflake) не готовы. Переходите, только если ваш стек состоит исключительно из &lt;b&gt;Spark&lt;/b&gt; или &lt;b&gt;Flink&lt;/b&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🔮 МненИИе и гаданИИе на кофейной гуще&lt;/h3&gt;
&lt;h4&gt;Прогноз на год вперед&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Аспект&lt;/td&gt;
&lt;td style="text-align: center"&gt;Прагматичный прогноз (Реализм)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Супер-прогноз (Оптимизм/Хайп)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Принятие&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Крупный энтерпрайз начнет пилоты к концу года. Основная масса ждет Athena/BigQuery.&lt;/td&gt;
&lt;td style="text-align: center"&gt;V3 станет стандартом для всех greenfield проектов весной. Утилиты миграции ускорят отказ от Hive/Delta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Каталоги&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;REST Catalog&lt;/b&gt; убивает Hive Metastore. Появление managed REST сервисов.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Universal Catalog Protocol&lt;/b&gt;: один каталог для Iceberg, Delta и Hudi. Формат станет прозрачным для пользователя.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Скорость&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;+30-50% к скорости MERGE операций благодаря векторам удаления.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нейросетевые оптимизаторы запросов и p2p кэширование сделают “холодный” Iceberg по скорости равным in-memory СУБД.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;`PyIceberg` получит полную поддержку записи (Write).&lt;/td&gt;
&lt;td style="text-align: center"&gt;Python-стек (DuckDB + PyIceberg) начнет вытеснять Spark в задачах малого/среднего объема.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Roadmap: 10 шагов развития&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Аудит совместимости:&lt;/b&gt; Проверить всех потребителей данных. Если есть Athena — V3 откладывается.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Переход на REST Catalog:&lt;/b&gt; Отказ от Hive Metastore.  &lt;br /&gt;
&gt;&lt;b&gt;поИИснение:&lt;/b&gt;  &lt;br /&gt;
&gt;REST Catalog отвязывает клиента (Spark/Trino) от прямого доступа к файловой системе (S3/HDFS). Это безопаснее (можно выдавать временные креды “Vended Credentials”) и позволяет менять физическое расположение данных, не ломая настройки клиентов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Апгрейд Spark/Flink:&lt;/b&gt; Только свежие версии (Spark 3.5+/4.0) умеют работать с V3 корректно.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Внедрение “Puffin” статистики:&lt;/b&gt;  &lt;br /&gt;
&gt;&lt;b&gt;поИИснение:&lt;/b&gt;  &lt;br /&gt;
&gt;Puffin — это формат файлов-спутников для Iceberg, которые хранят продвинутую статистику, например, эскизы (sketches) для оценки уникальных значений (`count distinct`) без чтения данных. Внедрение этого шага ускоряет планирование запросов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Изолированный пилот:&lt;/b&gt; Запуск V3 на одной стриминговой джобе для проверки Deletion Vectors.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Оптимизация CDC:&lt;/b&gt; Использование Row Lineage для дедупликации потоков.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PyIceberg для легких ETL:&lt;/b&gt; Замена тяжелых JVM-джоб на Python там, где объемы небольшие.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Миграция JSON в VARIANT:&lt;/b&gt; Как только движки поддержат шреддинг, это сэкономит гигабайты и часы CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Отказ от позиционных удалений:&lt;/b&gt; Полное переключение write-конфигурации на векторы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Масштабирование:&lt;/b&gt; Перевод основных витрин на V3.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;💡 Было бы круто, если бы еще сделали...&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Нативную поддержку самоорганизации данных (Z-Order / Clustering) без внешних компакторов.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Почему:&lt;/b&gt; Сейчас, чтобы запросы “летали” и пропускали ненужные файлы (data skipping), данные нужно сортировать (Z-Order). Это делают отдельные тяжелые джобы (`maintenance jobs`).&lt;br /&gt;
Было бы круто, если бы спецификация позволяла &lt;b&gt;писателям (writers)&lt;/b&gt; автоматически поддерживать приближенную кластеризацию при вставке данных (opportunistic clustering), либо если бы формат поддерживал &lt;b&gt;Secondary Indexes&lt;/b&gt; (вторичные индексы на основе B-деревьев или Bitmap), хранящиеся прямо в слое метаданных. Это позволило бы Iceberg конкурировать с ClickHouse и Druid в сценариях интерактивной аналитики (sub-second latency), убрав необходимость в постоянном “обслуживании” таблиц.&lt;/p&gt;
</description>
</item>

<item>
<title>Рейтинг Open Source Графовых СУБД для AdTech</title>
<guid isPermaLink="false">305</guid>
<link>https://gavrilov.info/all/reyting-open-source-grafovyh-subd-dlya-adtech/</link>
<pubDate>Sun, 14 Dec 2025 14:24:45 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/reyting-open-source-grafovyh-subd-dlya-adtech/</comments>
<description>
&lt;p&gt;Для задач &lt;b&gt;AdTech сегментации&lt;/b&gt; (профилирование пользователей, identity resolution, поиск look-alike аудиторий) набор требований к графовой базе данных специфичен: нужна высокая скорость операций чтения/записи (real-time bidding/serving) и горизонтальная масштабируемость (миллиарды событий и связей).&lt;/p&gt;
&lt;p&gt;Учитывая популярность текущего стека (&lt;b&gt;ClickHouse, Trino, Qdrant&lt;/b&gt;), идеальная графовая база должна уметь интегрироваться в аналитический контур (через Trino или прямые коннекторы) и дополнять ClickHouse (который хранит логи событий), взяв на себя хранение топологии связей.&lt;/p&gt;
&lt;p&gt;Ниже представлен небольшой обзор и рейтинг Open Source решений на 2024-2025 год с фокусом на масштабируемость.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Рейтинг Open Source Графовых СУБД для AdTech&lt;/h4&gt;
&lt;p&gt;Разделим 12 решений на 3 эшелона по пригодности для высоконагруженной сегментации.&lt;/p&gt;
&lt;h5&gt;1 эшелон: Лидеры производительности и масштабирования (Native Distributed)&lt;/h5&gt;
&lt;p&gt;Эти базы изначально создавались для кластеров и больших объемов данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. NebulaGraph&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Native Distributed Graph Database.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Язык запросов:&lt;/b&gt; nGQL (SQL-подобный).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; Разделение Compute (GraphD) и Storage (StorageD). Shared-nothing.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы для вас:&lt;/b&gt; Это топ-1 выбор для AdTech масштаба Tencent или Meituan. Спокойно переваривает сотни миллиардов вершин и триллионы ребер. Обеспечивает миллисекундный отклик при обходе графа (hops) на большую глубину.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Более крутая кривая обучения, чем у Neo4j. Сообщество меньше, но растет.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Связь со стеком:&lt;/b&gt; Отлично дополнит ClickHouse (CH хранит атрибуты, Nebula — связи). Есть коннекторы для Spark/Flink. А через Spark можно дойти до Trino.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;2. Dgraph&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Native Distributed Graph.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Язык запросов:&lt;/b&gt; GraphQL (модифицированный DQL).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; Распределенная, использует BadgerDB (KV store) под капотом. Поддерживает шардинг и репликацию “из коробки” в open source версии.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Горизонтальное масштабирование. Очень удобна для фронтенд-разработчиков благодаря GraphQL. Высокая пропускная способность.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Специфичный язык запросов, если вы привыкли к SQL/Cypher. В последние годы темпы разработки ядра немного снизились относительно конкурентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;3. Memgraph&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; In-Memory Graph Database (написана на C++).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Язык запросов:&lt;/b&gt; Cypher (совместим с Neo4j).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; Работает в оперативной памяти (с возможностью сброса на диск).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; &lt;b&gt;Самая быстрая&lt;/b&gt; для задач реального времени (вычисление фичей для RTB). Полная совместимость с экосистемой Neo4j (драйверы, протокол Bolt). Поддерживает Python/Rust процедуры. Отличная работа с Streaming данными (Kafka).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Ограничена объемом RAM (хотя есть disk-spill, это снижает скорость).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Связь со стеком:&lt;/b&gt; Отлично стыкуется с моделями AI (Qdrant), так как позиционируется для “Graph AI”.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;2 эшелон: Классика и Универсалы&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;4. Neo4j (Community Edition)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Native Graph.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Язык:&lt;/b&gt; Cypher (стандарт индустрии).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Огромное сообщество, лучшая документация, куча плагинов (APOC).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Главный минус для AdTech:&lt;/b&gt; Open Source версия (Community) ограничена &lt;b&gt;одним узлом&lt;/b&gt;. Нет встроенного кластеризации и шардинга (доступно только в Enterprise за большие деньги). Для “технического задела на вырост” в Open Source варианте — это бутылочное горлышко.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;5. ArangoDB&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Multi-model (Graph, Document, Key/Value).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Язык:&lt;/b&gt; AQL (похож на SQL).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Гибкость. Можно хранить сложные JSON-документы (как в Mongo) и связывать их.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; При глубоких обходах графа (“друзья друзей друзей”) проигрывает специализированным Native Graph базам по скорости. Это компромиссное решение.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;6. JanusGraph&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Layered Graph Database.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Работает поверх мощных бэкендов (Cassandra, HBase, ScyllaDB) и использует Elasticsearch для индексации. Масштабируемость ограничена только бэкендом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Очень “тяжелая” инфраструктура (JVM based). Сложна в настройке и эксплуатации. Медленнее на простых запросах из-за сетевых хопов между слоями. Часто считается “устаревающей” архитектурой по сравнению с Nebula/Dgraph.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;7. Apache AGE (PostgreSQL Extension)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Тип:&lt;/b&gt; Extension.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Суть:&lt;/b&gt; Превращает PostgreSQL в графовую БД с поддержкой Cypher.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Если вы знаете Postgres, вы знаете AGE. Не нужно новой инфраструктуры.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Производительность ограничена движком Postgres. Сложно масштабировать горизонтально на запись (проблема шардинга PG).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;3 эшелон: Нишевые и Новые игроки&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;8. HugeGraph&lt;/b&gt; (Baidu) — аналог JanusGraph, популярен в Китае, очень мощный, но документация местами страдает.&lt;br /&gt;
&lt;b&gt;9. OrientDB&lt;/b&gt; — мультимодельная, была популярна, но сейчас развитие замедлилось.&lt;br /&gt;
&lt;b&gt;10. FalkorDB&lt;/b&gt; — форк закрывшегося RedisGraph (Redis module). Очень быстрый, использует разреженные матрицы. Интересен, если уже есть Redis.&lt;br /&gt;
&lt;b&gt;11. Cayley&lt;/b&gt; — написана на Go (Google), простая, работает с триплетами (Linked Data), но для сложной AdTech логики может не хватить функционала.&lt;br /&gt;
&lt;b&gt;12. TerminusDB&lt;/b&gt; — интересная база с концепцией “Git для данных”, но специфична для версионирования знаний, а не высоконагруженной сегментации.&lt;/p&gt;
&lt;h4&gt;Сравнительная таблица (ТОП-7 для выбора)&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;СУБД&lt;/td&gt;
&lt;td style="text-align: center"&gt;Язык запросов&lt;/td&gt;
&lt;td style="text-align: center"&gt;Архитектура&lt;/td&gt;
&lt;td style="text-align: center"&gt;Масштабирование (Open Source)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Скорость (Read/Traverse)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Сложность эксплуатации&lt;/td&gt;
&lt;td style="text-align: center"&gt;Идеально для&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;NebulaGraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;nGQL (SQL-like)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Distributed Native&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Отличное&lt;/b&gt; (Sharding+Replication)&lt;/td&gt;
&lt;td style="text-align: center"&gt;🔥 Очень высокая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средняя/Высокая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Big Data, AdTech, Fraud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Memgraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Cypher&lt;/td&gt;
&lt;td style="text-align: center"&gt;In-Memory (C++)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Вертикальное / Репликация&lt;/td&gt;
&lt;td style="text-align: center"&gt;🚀 &lt;b&gt;Топ-1 (Low Latency)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая (как Docker)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Real-time features, Streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Dgraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;GraphQL&lt;/td&gt;
&lt;td style="text-align: center"&gt;Distributed Native&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Отличное&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высокая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средняя&lt;/td&gt;
&lt;td style="text-align: center"&gt;App Backend, 360 Customer View&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Neo4j (CE)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Cypher&lt;/td&gt;
&lt;td style="text-align: center"&gt;Native&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Нет&lt;/b&gt; (только 1 нода)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высокая (локально)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая&lt;/td&gt;
&lt;td style="text-align: center"&gt;R&amp;D, малые проекты&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;ArangoDB&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;AQL&lt;/td&gt;
&lt;td style="text-align: center"&gt;Multi-model&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорошее (Cluster mode)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средняя&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средняя&lt;/td&gt;
&lt;td style="text-align: center"&gt;Гибридные данные (Docs+Graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;JanusGraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Gremlin&lt;/td&gt;
&lt;td style="text-align: center"&gt;Layered (over NoSQL)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Бесконечное (зависит от Backend)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая/Средняя&lt;/td&gt;
&lt;td style="text-align: center"&gt;☠️ Высокая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Если уже есть HBase/Cassandra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Apache AGE&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Cypher&lt;/td&gt;
&lt;td style="text-align: center"&gt;Postgres Ext&lt;/td&gt;
&lt;td style="text-align: center"&gt;Только Read Replicas&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средняя&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая (если знают PG)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Гибрид SQL + Graph&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Интеграция с текущим стеком (Qdrant, Trino или ClickHouse)&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Qdrant + Graph DB = GraphRAG / Semantic Search:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Сегментация пользователей часто требует поиска не только по связям (“кто кликал то же, что и я”), но и по похожести векторов (“чей профиль похож на мой”).&lt;/li&gt;
  &lt;li&gt;Memgraph&lt;b&gt; и **Neo4j&lt;/b&gt; имеют встроенные модули для работы с векторами, но так как у вас уже есть &lt;b&gt;Qdrant&lt;/b&gt;, вам нужна база, которая *не пытается заменить Qdrant*, а позволяет хранить ID векторов в узлах графа.&lt;/li&gt;
  &lt;li&gt;NebulaGraph** позволяет хранить embedding в свойствах узла, но поиск лучше делегировать Qdrant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Trino:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Вам захочется делать SQL-запросы сразу к ClickHouse (события) и Графу (профиль).&lt;/li&gt;
  &lt;li&gt;У &lt;b&gt;Neo4j&lt;/b&gt; и &lt;b&gt;NebulaGraph&lt;/b&gt; есть коннекторы, позволяющие Trino (через JDBC или нативные коннекторы) запрашивать данные. Это мощнейшая связка для аналитиков. Отдельно нативного конектора к Trino пока не найти, но скоро может появится поддержка iceberg &lt;a href="https://github.com/vesoft-inc/nebula/discussions/5902"&gt;https://github.com/vesoft-inc/nebula/discussions/5902&lt;/a&gt; или пока можно использоваться связку через Spark.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;ClickHouse:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Паттерн: ClickHouse хранит “сырые” логи (миллиарды строк). Агрегаты и связи (User Graph) пересчитываются и заливаются в Графовую БД для быстрого lookup.&lt;/li&gt;
  &lt;li&gt;NebulaGraph** имеет Exchange (инструмент на основе Spark) для массовой заливки данных из Warehouse.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;Итоговая рекомендация&lt;/h4&gt;
&lt;p&gt;Учитывая, что вы хотите &lt;b&gt;Open Source&lt;/b&gt; и вам нужен &lt;b&gt;технический задел (масштабирование)&lt;/b&gt; для AdTech:&lt;/p&gt;
&lt;h5&gt;🏆 Выбор №1: NebulaGraph&lt;/h5&gt;
&lt;p&gt;Это наиболее близкий аналог “ClickHouse в мире графов”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Почему:** Он создан для хранения миллиардов вершин (пользователей/устройств) и работы в кластере. У него shared-nothing архитектура, которая необходима для роста. Язык nGQL будет понятен вашим аналитикам, знающим SQL (ClickHouse/Trino).&lt;/li&gt;
&lt;li&gt;Для AdTech:** Идеально решает проблемы *Identity Resolution* (склеивание cookie, device_id, user_id и других атрибутов в единый граф) на больших объемах.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;🥈 Выбор №2: Memgraph&lt;/h5&gt;
&lt;p&gt;Если ваши графы помещаются в память (сотни миллионов узлов, но не десятки миллиардов) и критична задержка (latency) менее 10 мс для *real-time* принятия решений.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Почему:** Он безумно быстр. Он совместим с Cypher (легко нанимать людей или переезжать с Neo4j). Написан на C++, очень эффективен.&lt;/li&gt;
&lt;li&gt;Интеграция:** Идеально, если вы планируете стримить данные из Kafka, обновлять граф и сразу выдавать сегменты.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;🥉 Выбор №3: Apache AGE (или ArangoDB)&lt;/h5&gt;
&lt;p&gt;Только если объем графа невелик, и вы хотите минимизировать зоопарк технологий, оставаясь в рамках “почти SQL” решений. Но для серьезного AdTech они не рекомендуется как *основное* хранилище графа пользователей.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Совет:&lt;/b&gt; Начните пилот (PoC) с &lt;b&gt;NebulaGraph&lt;/b&gt;. Попробуйте загрузить туда выгрузку из ClickHouse и сравнить скорость выполнения запросов “найти всех пользователей, связанных через устройство X на глубину 3 шага” с тем, как это делается сейчас (вероятно, через JOINs в реляционке или CH). Если сложность эксплуатации Nebula покажется высокой, можно посмотреть в сторону &lt;b&gt;Memgraph&lt;/b&gt; как более легкой альтернативы и применять их не на одном большом графе например, а на нескольких малых в реальном времени, а готовые расчеты уже хранить в привычных местах.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Еще можно почитать:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bigdataschool.ru/blog/memgraph-vs-neo4j/"&gt;Сравнение Memgraph и Neo4j bigdataschool.ru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bigdataschool.ru/blog/neo4j-vs-tigergraph-what-to-choose.html"&gt;Сравнение Neo4j и TigerGraph (для понимания коммерческого рынка bigdataschool.ru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.merionet.ru/articles/10-lucsix-resenii-dlia-raboty-s-grafovymi-bazami-dannyx"&gt;Обзор графовых БД wiki.merionet.ru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вот еще мысль и про языки немного. Если проект большой с единым графом для разных нужд, то NebulaGraph выглядит лучшим решением, но архитектурно можно выбрать много средних и малых графов. Для второго подхода хорошо Memgraph с его языком Cypher&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;1. Семейство Cypher (OpenCypher / ISO GQL)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Базы:&lt;/b&gt; *Neo4j, Memgraph, FalkorDB, Apache AGE.*&lt;/p&gt;
&lt;p&gt;Cypher — это «SQL для графов». Это декларативный язык, использующий ASCII-арт для визуализации связей в коде (например, `(User)-[:CLICKS]-&gt;(Ad)`).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Функциональность:&lt;/b&gt; Очень богатая. Поддерживает сложные паттерны (Pattern Matching), агрегации, пути переменной длины. В апреле 2024 года ISO утвердила стандарт &lt;b&gt;GQL&lt;/b&gt; (Graph Query Language), который во многом основан на Cypher.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Интуитивность:&lt;/b&gt; Код читается как предложение на английском. Самая низкая кривая входа.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Экосистема:&lt;/b&gt; Стандарт де-факто. Если вы знаете Cypher, вы можете переключаться между Neo4j, Memgraph и AGE без переобучения.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Выразительность:&lt;/b&gt; Идеален для глубокой аналитики и поиска сложных паттернов (Fraud Detection).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Изначально создавался для одноузловых систем. В распределенных системах (шардинг) некоторые конструкции Cypher могут быть сложны для оптимизации движком.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Оценка для стека:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Memgraph/Neo4j:&lt;/b&gt; Работает идеально.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Apache AGE:&lt;/b&gt; Cypher оборачивается внутри SQL запросов Postgres, что немного громоздко, но функционально.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;FalkorDB:&lt;/b&gt; Реализует подмножество Cypher, очень быстро благодаря Redis, но функционал беднее, чем у Neo4j.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Семейство Gremlin (Apache TinkerPop)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Базы:&lt;/b&gt; *JanusGraph, HugeGraph, OrientDB (частично), Azure CosmosDB.*&lt;/p&gt;
&lt;p&gt;Gremlin — это императивный язык обхода графа (Traversals). Вы пишете не «что найти» (как в SQL/Cypher), а «куда идти» шаг за шагом.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Функциональность:&lt;/b&gt; Тьюринговская полнота. Можно написать алгоритм любой сложности прямо внутри запроса. Это скорее язык программирования потоков данных, чем язык запросов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Контроль:&lt;/b&gt; Вы точно указываете базе, как обходить граф. Это важно для сверхбольших графов (как в JanusGraph/HugeGraph), где неверный план запроса может “положить” кластер.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Абстракция:&lt;/b&gt; Работает поверх любой БД, поддерживающей TinkerPop.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Сложность:&lt;/b&gt; Кривая обучения очень крутая. Код получается вербозным и сложным для отладки («write once, read never»).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Устаревание:&lt;/b&gt; С появлением стандарта ISO GQL популярность Gremlin падает. Для новых проектов в 2025 году его выбирают редко, если только не привязаны к JanusGraph.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Пример AdTech:&lt;/b&gt; «Найти всех пользователей, кликнувших на этот баннер» на Gremlin будет длинной цепочкой вызовов методов (`g.V().has(‘Banner’...).out(‘CLICKS’)...`).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. nGQL (NebulaGraph Query Language)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Базы:&lt;/b&gt; *NebulaGraph.*&lt;/p&gt;
&lt;p&gt;Собственный язык Nebula, который синтаксически мимикрирует под SQL, но логически работает с графами.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Функциональность:&lt;/b&gt; Заточена под распределенный Massive Parallel Processing (MPP).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;SQL-подход:&lt;/b&gt; Разработчикам, привыкшим к MySQL/ClickHouse, синтаксис `GO FROM ... OVER ...` будет понятнее, чем Gremlin.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Скорость:&lt;/b&gt; Спроектирован так, чтобы не позволять писать «плохие» запросы, которые убивают распределенный кластер. Вынуждает думать о том, где лежат данные (VID).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Пайпы:&lt;/b&gt; Удобный синтаксис передачи результата одного шага в другой через `|` (как в Bash).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Vendor Lock-in:&lt;/b&gt; Это не стандарт. Переехать с Nebula на другую базу потребует переписывания всех запросов.&lt;/li&gt;
  &lt;li&gt;Не поддерживает полную гибкость Pattern Matching, как Cypher (хотя добавили поддержку `MATCH`, она менее производительна, чем нативный `GO`).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. DQL (ранее GraphQL+-)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Базы:&lt;/b&gt; *Dgraph.*&lt;/p&gt;
&lt;p&gt;Это модифицированный GraphQL.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Функциональность:&lt;/b&gt; Идеальна для API. Вы запрашиваете данные в формате JSON-дерева, и база возвращает JSON.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Frontend-first:&lt;/b&gt; Фронтендерам не нужен бэкенд-прослойка, они могут (теоретически) ходить в базу почти напрямую.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Работа с атрибутами:&lt;/b&gt; Поскольку Dgraph — это по сути распределенный Key-Value, DQL очень быстро достает атрибуты нод.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Слабая аналитика:&lt;/b&gt; Графовые алгоритмы и сложные обходы (traversals) на DQL писать сложнее и менее эффективно, чем на Cypher/nGQL. Это язык выборки данных, а не язык аналитики графов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5. AQL (ArangoDB Query Language)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Базы:&lt;/b&gt; *ArangoDB.*&lt;/p&gt;
&lt;p&gt;Гибридный язык, объединяющий возможности SQL (JOINs), работы с JSON (как в Mongo) и графовых обходов.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Функциональность:&lt;/b&gt; Одна из самых мощных среди “универсалов”. Позволяет в одном запросе сделать JOIN трех коллекций, отфильтровать JSON и пройтись по графу друзей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плюсы:&lt;/b&gt; Гибкость.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Минусы:&lt;/b&gt; Синтаксис `FOR u IN users FILTER ...` специфичен и многословен. Для чистых графовых задач (deep hopping) он медленнее нативных решений [ArangoDB vs Native Graph].&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6. Другие / Устаревающие&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;OrientDB (SQL-extended):&lt;/b&gt; Пытались расширить SQL для графов. Сейчас проект стагнирует, язык считается тупиковой ветвью эволюции по сравнению с Cypher/GQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL Graph (MS SQL / PG SQL):&lt;/b&gt; В [статье про SQL Server](&lt;a href="https://learn.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-sample?view=sql-server-ver17)"&gt;https://learn.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-sample?view=sql-server-ver17)&lt;/a&gt; показан синтаксис `MATCH`, который Microsoft внедрила в T-SQL. Это попытка “догнать” Cypher, оставаясь в рамках реляционной модели. Удобно, если вы намертво привязаны к MS SQL, но неудобно для сложной аналитики.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cayley (Gizmo/MQL):&lt;/b&gt; Очень нишевый язык на базе Go или JS. Для AdTech продакшена слишком экзотичен.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;Сводная таблица сравнения&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Язык&lt;/td&gt;
&lt;td style="text-align: center"&gt;Базы данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;Порог входа&lt;/td&gt;
&lt;td style="text-align: center"&gt;Для AdTech/High-load&lt;/td&gt;
&lt;td style="text-align: center"&gt;Стандартность (2025)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Примечание&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;nGQL&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;NebulaGraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средний&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Идеально&lt;/b&gt; (Tencent scale)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая (Vendor specific)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Топ для сотен млрд связей и кластерной архитектуры.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Cypher&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Memgraph&lt;/b&gt;, Neo4j, AGE&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Низкий&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорошо (Memgraph) / Средне (Neo4j)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Высокая&lt;/b&gt; (основа ISO GQL)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Самый удобный для аналитиков и Data Science.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;DQL&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Dgraph&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкий (для Web-dev)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорошо (для OLTP)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Лучший выбор, если граф — это бэкенд для UI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Gremlin&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;JanusGraph, HugeGraph&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высокий&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отлично (если настроить)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Падает (Legacy)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Слишком сложен в поддержке, проигрывает современным языкам.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;AQL&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;ArangoDB&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средний&lt;/td&gt;
&lt;td style="text-align: center"&gt;Средне&lt;/td&gt;
&lt;td style="text-align: center"&gt;Низкая&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорош, если нужна “Document Store + Graph” в одном.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Итоговая рекомендация&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Если приоритет — производительность на масштабе (AdTech, сегментация 100M+ пользователей):&lt;/b&gt;  &lt;br /&gt;
Вам нужен &lt;b&gt;NebulaGraph&lt;/b&gt; и его &lt;b&gt;nGQL&lt;/b&gt;.&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;*Почему:* В AdTech сценариях (как у Meituan/Tencent) критичны latency на “хопах” (hops). nGQL архитектурно заставляет писать запросы так, чтобы они эффективно параллелились. Он менее удобен, чем Cypher, но более предсказуем в нагрузке.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Если приоритет — Real-time аналитика, ML-фичи и скорость разработки:&lt;/b&gt;  &lt;br /&gt;
Вам нужен &lt;b&gt;Memgraph&lt;/b&gt; на &lt;b&gt;Cypher&lt;/b&gt;.&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;*Почему:* Вы получаете совместимость с самой популярной экосистемой (Neo4j), стандартный язык Cypher (легко найти специалистов) и скорость C++ in-memory движка.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Если приоритет — дешевое горизонтальное масштабирование “для бедных” (в хорошем смысле):&lt;/b&gt;  &lt;br /&gt;
Вам нужен &lt;b&gt;Dgraph&lt;/b&gt; (DQL) или &lt;b&gt;NebulaGraph&lt;/b&gt;.&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;У &lt;b&gt;Dgraph&lt;/b&gt; отличный шардинг из коробки и DQL закрывает 90% задач продуктовой разработки, но может буксовать на тяжелой аналитике.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;От чего стоит отказаться:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Neo4j Community:&lt;/b&gt; Язык Cypher прекрасен, но ограничения лицензии (отсутствие кластера) убьют проект на росте.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JanusGraph/HugeGraph (Gremlin):&lt;/b&gt; В 2025 году начинать проект на Gremlin — это создавать себе технический долг, так как индустрия движется в сторону ISO GQL (Cypher Style).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Apache AGE:&lt;/b&gt; Пока слишком сыро для High-load, проблемы с горизонтальным масштабированием Postgres никуда не деваются.&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Эпоха «Толстого» браузера и революция локальных данных на WASM</title>
<guid isPermaLink="false">304</guid>
<link>https://gavrilov.info/all/epoha-tolstogo-brauzera-i-revolyuciya-lokalnyh-dannyh-na-wasm/</link>
<pubDate>Sat, 13 Dec 2025 01:20:55 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/epoha-tolstogo-brauzera-i-revolyuciya-lokalnyh-dannyh-na-wasm/</comments>
<description>
&lt;p&gt;В истории IT-архитектуры маятник всегда качался между двумя крайностями: централизацией и децентрализацией. Сначала были мейнфреймы (центр), затем «толстые» клиенты на ПК (локальные вычисления), а потом пришла эра веб-приложений, и индустрия массово мигрировала в Облака.&lt;/p&gt;
&lt;p&gt;Мы привыкли считать браузер лишь «тонким окном», интерфейсом, где вся магия, сложные вычисления и хранение происходят где-то далеко — на серверах AWS или Google. Но сегодня правила игры меняются. Благодаря технологиям WebAssembly (WASM), современному «железу» и новым подходам, браузер превращается в полноценную операционную систему для анализа данных или еще чего-то &lt;a href="https://blog.openreplay.com/ru/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0"&gt;blog.openreplay.com&lt;/a&gt;. Посмотрите статью о “Руководство по Разработке Local-First Приложений”.&lt;/p&gt;
&lt;h3&gt;Почему мы уходили в облака и почему возвращаемся?&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Эра миграции в облака:&lt;/b&gt;&lt;br /&gt;
В 2010-х локальные машины были «бутылочным горлышком». Чтобы обработать гигабайты данных, требовались серверные стойки. Облака давали бесконечную масштабируемость. Архитектура сводилась к простой формуле: *данные пользователя → загрузка через сеть (latency) → обработка на сервере ($$$) → результат обратно клиенту*.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблемы сегодняшнего дня:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Избыточность мощностей:&lt;/b&gt; Современный ноутбук аналитика (даже базовый MacBook Air на M-чипе) обладает вычислительной мощностью, сопоставимой с сервером десятилетней давности. Эти ресурсы простаивают, пока компании платят за облачные CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сетевые задержки и стоимость:&lt;/b&gt; Передать CSV-файл на 2 ГБ в облако для простой фильтрации или агрегации — это долго и дорого (ingress/egress трафик).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Приватность:&lt;/b&gt; Передача чувствительных отчетов или персональных данных на чужой сервер для разового анализа всегда несет риски утечки и нарушений регуляторики.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Решение: Приложения Local-First&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Технология WebAssembly (WASM) позволила запускать нативный код (C++, Rust, Go) прямо в песочнице браузера со скоростью, близкой к нативной &lt;a href="https://habr.com/ru/articles/892052"&gt;habr.com&lt;/a&gt;. Это породило новый класс ПО, которое выглядит как веб-сайт, но работает как десктопное приложение. Вы заходите на страницу, она загружает легковесный движок, и далее вы можете отключить интернет — приложение продолжит «перемалывать» ваши данные локально.&lt;/p&gt;
&lt;h3&gt;Новые герои: Сервер внутри вкладки&lt;/h3&gt;
&lt;p&gt;Уже сейчас существуют продукты, которые меняют представление о работе с данными. Они объединяют UX веб-приложений с мощностью десктопного софта, создавая ощущение, что сервер находится прямо у вас в RAM.&lt;/p&gt;
&lt;h4&gt;1. DataKit — Швейцарский нож аналитика&lt;/h4&gt;
&lt;p&gt;Проект &lt;b&gt;DataKit.page&lt;/b&gt; — яркий пример такой архитектуры. Это не просто “просмотрщик файлов”, это полноценная ETL/Analytics платформа, живущая в вашем браузере.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Как это работает:&lt;/b&gt; Вы перетаскиваете массивные файлы (CSV, JSON, Excel, Parquet) в окно. Они &lt;b&gt;не загружаются&lt;/b&gt; на внешний сервер. Браузер получает доступ к файлу через `File System Access API`, а движок (основанный на DuckDB WASM) монтирует их виртуально.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Функционал:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;SQL и Python в одном окне:&lt;/b&gt; Внутри работает не только SQL-движок, но и Python (через Pyodide). Вы можете использовать `pandas`, `polars`,  `numpy` и строить графики `matplotlib`, обращаясь к данным прямо с вашего диска.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;AI на борту:&lt;/b&gt; Интеграция с локальными LLM (через Ollama) или облачными провайдерами позволяет писать запросы на естественном языке, при этом сама схема и данные остаются у вас.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Умные форматы и коннекторы:&lt;/b&gt; Платформа «нативно» понимает Parquet и вложенные JSON, автоматически определяя типы данных и аномалии. Кроме того, она может подключаться к S3, Google Sheets и базам данных PostgreSQL, выполняя федеративные запросы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. DuckDB Local UI — SQL без инсталляции&lt;/h4&gt;
&lt;p&gt;Команда DuckDB в сотрудничестве с MotherDuck выпустила официальный локальный UI, работающий через расширение. Это прямой ответ на боль пользователей консольных утилит и отличный пример гибридного подхода &lt;a href="https://habr.com/ru/companies/cinimex/articles/913878"&gt;habr.com&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сценарий:&lt;/b&gt; Раньше, чтобы поработать с локальной базой данных, нужно было либо мучиться в CLI, либо ставить тяжелый DBeaver. Теперь одной командой `duckdb -ui` или SQL-вызовом `CALL start_ui();` запускается локальный веб-сервер и открывается современный Notebook-интерфейс.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибридность:&lt;/b&gt; Вы работаете локально, но интерфейс имеет встроенную бесшовную интеграцию с облачным сервисом MotherDuck. Если для разового анализа локальных ресурсов достаточно, вы делаете это приватно. Как только требуется коллаборация или более мощные вычисления, вы можете переключить контекст выполнения в облако в том же окне.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Marimo – тетрадки, почти тот же подход имеет&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/"&gt;https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. PGlite и PondPilot — Postgres и SQL-песочницы&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;PGlite:&lt;/b&gt; Этот проект идет еще дальше и компилирует полноценный PostgreSQL в WASM, позволяя запускать его в браузере или Node.js без эмуляции ОС &lt;a href="https://habr.com/ru/articles/873112"&gt;habr.com&lt;/a&gt;. Это идеально для тестирования, прототипирования и создания приложений, которые требуют совместимости с Postgres.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PondPilot:&lt;/b&gt; Пример open-source SQL-редактора, построенного вокруг DuckDB-WASM &lt;a href="https://habr.com/ru/articles/913682"&gt;habr.com&lt;/a&gt;. Он позволяет быстро анализировать локальные файлы (CSV, Parquet, JSON), сохраняет историю, поддерживает вкладки и даже предлагает виджет для встраивания интерактивных SQL-примеров в блоги и документацию.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Сдвиг парадигмы: От DBeaver к Браузеру&lt;/h3&gt;
&lt;p&gt;Многие аналитики и инженеры привыкли к классическим клиентам баз данных (DBeaver, DataGrip). Это мощные, но «тяжелые» инструменты, требующие установки, настройки драйверов и обновлений. Новый WASM-тренд предлагает более гибкую альтернативу.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Сценарий «Мгновенной аналитики»:&lt;/b&gt;&lt;br /&gt;
Представьте, что вам прислали ссылку на лог-файл в S3 размером 5 ГБ или Parquet-дамп.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Старый путь:&lt;/b&gt; Скачать файл → Установить/открыть DBeaver → Настроить драйвер → Импортировать → Ждать загрузки → Писать SQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Новый путь (WASM):&lt;/b&gt; Открыть ссылку веб-приложения → Перетащить файл (или указать S3 URL) → Мгновенно писать SQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Еще вариант, лог 30ГБ и вы заказали функционал в другой команде, она с радостью сказала, что через два спринта сделает пайплайн за неделю, но ей надо требования. Вы их конечно написали на основе небольшого семпла строк из excel или на основе документации и отдали в разработку. А через месяц получили отличный пайплайн или, который не нужен или его нужно еще доработать.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Технологическая магия за кулисами:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Apache Arrow:&lt;/b&gt; Это скрытый герой революции. Бинарный колоночный формат Arrow позволяет передавать данные из SQL-движка (DuckDB) в JavaScript-интерфейс или Python-ячейку &lt;b&gt;без копирования и сериализации памяти&lt;/b&gt; (Zero-copy). Это обеспечивает мгновенную реакцию интерфейса на миллионах строк — то, чего раньше было невозможно добиться при работе с DOM. (все помним D3JS)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Федеративные запросы:&lt;/b&gt; Локальное приложение умеет «ходить» в интернет. Вы можете написать `SELECT * FROM ‘s3://my-bucket/file.parquet’` прямо из браузера. Движок скачает только нужные байты (range requests), обработает их локально и покажет результат. Данные не оседают на промежуточных серверах разработчика софта.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Органическое масштабирование и новая экономика&lt;/h3&gt;
&lt;p&gt;Для архитекторов платформ данных этот тренд открывает удивительную экономическую модель &lt;b&gt;«Bring Your Own Compute» или «Client-side computing» (Принеси Свои Вычисления)&lt;/b&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Масштабирование без усилий:&lt;/b&gt; Вам не нужно создавать сложный кластер, чтобы тысячи пользователей могли фильтровать свои Excel-файлы. Вы просто хостите статические JS/WASM файлы на CDN.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Органическая нагрузка:&lt;/b&gt; Вычислительная мощность вашего “облака” растет линейно с количеством пользователей, потому что каждый новый пользователь приносит свой CPU и RAM. Пользователи выключают компьютеры — ваше “облако” естественным образом уменьшается.&lt;/li&gt;
&lt;li&gt;Коллаборация и Воспроизводимость:**
&lt;ul&gt;
  &lt;li&gt;*Разовая задача:* Сделал анализ локально, закрыл вкладку — данные исчезли из памяти (полная приватность).&lt;/li&gt;
  &lt;li&gt;*Командная работа:* Написал SQL/Python код локально, сохранил его (текст скрипта весит килобайты) и отправил коллеге. Коллега открыл ту же ссылку, подгрузился код, и магия вычислений произошла уже на его машине над теми же данными (если они в общем S3) или над его локальной копией.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Итого&lt;/h3&gt;
&lt;p&gt;Мы движемся к миру, где браузер — это не тонкий клиент, а &lt;b&gt;универсальная песочница для гибридных вычислений&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Разработчикам и Архитекторам:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Присмотритесь к Serverless 2.0:&lt;/b&gt; Истинный `serverless` — это не AWS Lambda, за которую вы платите. Это когда сервера нет вообще, а код исполняется на клиенте (`client-side computing`). Это дешевле, быстрее для пользователя и безопаснее, удобно разрабатывать и обновлять код.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Privacy-first как преимущество:&lt;/b&gt; Позиционируйте такие решения как безопасные по умолчанию. Аргумент “Ваши данные никогда не покидают ваш компьютер” становится решающим для Enterprise-сектора.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибридная архитектура:&lt;/b&gt; Не отказывайтесь от сервера полностью. Пусть браузер берет на себя интерактивную работу, парсинг и предобработку, а сервер подключается для тяжелых “батчей” или работы с петабайтами данных в том же привычном окне.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Пользователям и Аналитикам:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Осваивайте инструменты:&lt;/b&gt; Попробуйте &lt;a href="https://datakit.page,"&gt;https://datakit.page,&lt;/a&gt; &lt;a href="https://app.pondpilot.io"&gt;https://app.pondpilot.io&lt;/a&gt; или &lt;a href="https://shell.duckdb.org"&gt;DuckDB WASM Shell&lt;/a&gt; для разведочного анализа данных. Это часто быстрее, чем запускать локальный Jupyter.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Используйте облачные хранилища напрямую:&lt;/b&gt; Учитесь подключать S3, Google Sheets и другие облачные источники напрямую к таким инструментам. Это дает мощь облачного хранения в сочетании со скоростью и приватностью локального интерфейса.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ренессанс локальных вычислений начался. Ваш браузер способен на большее, чем просто отображать HTML. Он становится вашей персональной дата-лабораторией.&lt;/p&gt;
</description>
</item>

<item>
<title>Обзор pg_clickhouse: Как объединить мощь ClickHouse и удобство PostgreSQL</title>
<guid isPermaLink="false">302</guid>
<link>https://gavrilov.info/all/obzor-pg-clickhouse-kak-obedinit-mosch-clickhouse-i-udobstvo-pos/</link>
<pubDate>Fri, 12 Dec 2025 23:27:54 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/obzor-pg-clickhouse-kak-obedinit-mosch-clickhouse-i-udobstvo-pos/</comments>
<description>
&lt;p&gt;Недавно компания ClickHouse представила новый инструмент — расширение &lt;b&gt;pg_clickhouse&lt;/b&gt;. Это событие стало ответом на одну из самых частых болей разработчиков: сложность миграции аналитических запросов из классических реляционных баз данных в колоночные аналитические СУБД.&lt;/p&gt;
&lt;p&gt;Оригинал статьи: &lt;a href="https://clickhouse.com/blog/introducing-pg_clickhouse"&gt;A Postgres extension for querying ClickHouse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;или берем сразу тут: &lt;a href="https://github.com/ClickHouse/pg_clickhouse/releases"&gt;https://github.com/ClickHouse/pg_clickhouse/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В этой статье мы разберем, что представляет собой этот инструмент, в чем его фундаментальный смысл для архитектуры приложений и куда проект хочет двигаться дальше.&lt;/p&gt;
&lt;h3&gt;Проблема: Данные переехали, а запросы остались&lt;/h3&gt;
&lt;p&gt;Типичный сценарий роста стартапа выглядит так: приложение строится на PostgreSQL. В какой-то момент данных (логов, метрик, транзакций) становится так много, что аналитические отчеты начинают тормозить. Обычные реплики для чтения (read replicas) перестают спасать.&lt;/p&gt;
&lt;p&gt;Команда принимает решение внедрить ClickHouse. Перенос данных сейчас решается просто (например, с помощью ClickPipes), но возникает другая проблема:&lt;br /&gt;
&lt;b&gt;Как быть с тысячами строк SQL-кода в ORM, дашбордах и скриптах, которые написаны под синтаксис Postgres?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Переписывание всей логики приложения под диалект ClickHouse — это месяцы работы и риск новых багов. Именно эту проблему решает `pg_clickhouse`.&lt;/p&gt;
&lt;h3&gt;Что такое pg_clickhouse?&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;pg_clickhouse&lt;/b&gt; — это расширение для PostgreSQL (Foreign Data Wrapper — FDW), которое позволяет создавать в Postgres «внешние таблицы», фактически ссылающиеся на таблицы в ClickHouse.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Суть технологии:&lt;/b&gt; Вы пишете запросы на привычном SQL диалекте PostgreSQL, обращаясь к этим таблицам. Расширение на лету транслирует запрос в диалект ClickHouse, отправляет его на исполнение в аналитическую базу и возвращает результат обратно в Postgres.&lt;/p&gt;
&lt;p&gt;Для приложения это выглядит прозрачно: таблицы ClickHouse могут находиться просто в отдельной схеме (schema). Достаточно изменить путь поиска (`search_path`), и старые запросы начнут работать с данными, лежащими в ClickHouse.&lt;/p&gt;
&lt;h3&gt;В чем «соль»: Технология Pushdown&lt;/h3&gt;
&lt;p&gt;Главная ценность и сложность такого расширения заключается не просто в соединении двух баз, а в эффективности этого соединения. Этот механизм называется &lt;b&gt;Pushdown&lt;/b&gt; (спуск или делегирование вычислений).&lt;/p&gt;
&lt;p&gt;Если вы делаете запрос `SELECT sum(price) FROM orders`, есть два пути его выполнения:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Плохой путь:&lt;/b&gt; Postgres выкачивает *все* миллионы строк из ClickHouse и сам считает сумму. Это уничтожает весь смысл аналитической базы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Путь pg_clickhouse:&lt;/b&gt; Расширение понимает, что это агрегация, и отправляет в ClickHouse команду «посчитай сумму». Обратно по сети возвращается только одна цифра.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Умная трансляция функций&lt;/h4&gt;
&lt;p&gt;Авторы `pg_clickhouse` пошли дальше простой трансляции. Они научили расширение переводить специфические функции Postgres в аналоги ClickHouse, даже если синтаксис кардинально отличается.&lt;/p&gt;
&lt;p&gt;*Пример:*&lt;br /&gt;
В Postgres есть функция для расчета медианы: `percentile_cont(0.5) WITHIN GROUP (ORDER BY price)`.&lt;br /&gt;
В ClickHouse такой синтаксис не поддерживается.&lt;br /&gt;
`pg_clickhouse` автоматически переписывает это в нативную функцию ClickHouse: `quantile(0.5)(price)`.&lt;/p&gt;
&lt;p&gt;Также поддерживается трансляция конструкции `FILTER (WHERE ...)` в специфичные для ClickHouse комбинаторы `-If` (например, `sumIf`).&lt;/p&gt;
&lt;h4&gt;Ускорение подзапросов (Semi-Join)&lt;/h4&gt;
&lt;p&gt;В версии 0.1.0 была реализована поддержка &lt;b&gt;SEMI JOIN Pushdown&lt;/b&gt;. Это критически важно для запросов с конструкцией `WHERE ... IN (SELECT ...)` или `EXISTS`. Тесты на бенчмарке TPC-H показали, что благодаря этому время выполнения сложных запросов сократилось с нескольких секунд (или даже минут) до миллисекунд, так как фильтрация теперь происходит на стороне ClickHouse.&lt;/p&gt;
&lt;h3&gt;Планы развития (Roadmap)&lt;/h3&gt;
&lt;p&gt;Проект находится в стадии активной разработки (версия 0.1.0), и команда ClickHouse нацелена на полное покрытие аналитических сценариев.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ключевые пункты плана:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Полное покрытие TPC-H и ClickBench:&lt;/b&gt; Оптимизация планировщика, чтобы все стандартные аналитические бенчмарки выполнялись с максимальным pushdown-ом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Расширенная поддержка функций:&lt;/b&gt; Трансляция *всех* агрегатных и обычных функций PostgreSQL в их эквиваленты в ClickHouse.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DML операции:&lt;/b&gt; Поддержка легковесных удалений (`DELETE`) и обновлений (`UPDATE`), а также пакетной вставки данных через `COPY`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Управление настройками:&lt;/b&gt; Возможность передавать настройки ClickHouse (settings) через команды создания пользователей или серверов в Postgres.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Passthrough-режим:&lt;/b&gt; Возможность отправить произвольный SQL-запрос (на диалекте ClickHouse) и получить результат в виде таблицы, обходя парсер Postgres.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;p&gt;`pg_clickhouse` — это попытка построить «лучшее из двух миров»: взять скорость колоночной СУБД и объединить её с богатой экосистемой и инструментарием PostgreSQL. Это позволяет разработчикам плавно мигрировать нагрузку, не переписывая приложение с нуля, и оставляет Postgres в качестве единой точки входа для данных.&lt;/p&gt;
</description>
</item>

<item>
<title>Сводная таблица exchange-compression: LZ4 vs NONE vs ZSTD в Trino</title>
<guid isPermaLink="false">298</guid>
<link>https://gavrilov.info/all/svodnaya-tablica-exchange-compression-lz4-vs-none-vs-zstd-v-trin/</link>
<pubDate>Tue, 02 Dec 2025 00:08:08 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/svodnaya-tablica-exchange-compression-lz4-vs-none-vs-zstd-v-trin/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-232.png" width="160" height="200" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Сводная таблица: LZ4 vs NONE vs ZSTD (простые запросы + &lt;b&gt;дополнение для сложных запросов&lt;/b&gt;)&lt;/p&gt;
&lt;h5&gt;Простые запросы (шарфл ~42 MB)&lt;/h5&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Метрика&lt;/td&gt;
&lt;td style="text-align: center"&gt;NONE 🚀&lt;/td&gt;
&lt;td style="text-align: center"&gt;LZ4&lt;/td&gt;
&lt;td style="text-align: center"&gt;ZSTD 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Wall Time&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;0.95 s&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.68 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.47 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Network&lt;/td&gt;
&lt;td style="text-align: center"&gt;42.0 MB (1.0x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;24.8 MB (1.7x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;12.8 MB (3.3x)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Total CPU&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.52 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.56 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;7.49 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Processed Input&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.86 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h5&gt;Сложные запросы (шарфл ~11.7 GB, 3 JOIN + DISTINCT, ~732M строк, 5.9 GB input)&lt;/h5&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Метрика&lt;/td&gt;
&lt;td style="text-align: center"&gt;NONE&lt;/td&gt;
&lt;td style="text-align: center"&gt;LZ4&lt;/td&gt;
&lt;td style="text-align: center"&gt;ZSTD 📦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Wall Time&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;13.49 s&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.93 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;12.27 s&lt;/b&gt; 🚀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Network&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;11.69 GB (1.0x)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;6.87 GB (~1.7x)&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;3.54 GB (~3.3x)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Total CPU&lt;/td&gt;
&lt;td style="text-align: center"&gt;214 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;~220 s&lt;/td&gt;
&lt;td style="text-align: center"&gt;214 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Processed Input&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;td style="text-align: center"&gt;13.19 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Коэф. сжатия рассчитан относительно NONE по `internalNetworkInputDataSize` (шарфл-трафик):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NONE: 11.686 GB&lt;/li&gt;
&lt;li&gt;LZ4: ~6.87 GB (коэф. 1.7x, как в простых тестах; точные данные из логов подтверждают пропорцию)&lt;/li&gt;
&lt;li&gt;ZSTD: ~3.54 GB (коэф. 3.3x)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Анализ результатов (простые + сложные запросы)&lt;/h4&gt;
&lt;h5&gt;ZSTD — король сжатия (подтверждено на больших объемах)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Простые запросы (малый шарфл 42 MB):&lt;/b&gt; ZSTD сжал до 12.8 MB (3.3x лучше NONE).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сложные запросы (большой шарфл 11.7 GB):&lt;/b&gt; ZSTD сжал до ~3.54 GB (экономия ~8.15 GB на узел). Если шарфл 400 GB, ZSTD сэкономит ~300 GB трафика по сети — критично для кластера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Производительность (Speed vs Overhead)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;NONE:&lt;/b&gt; Быстрее на малых объемах (0.95s), но на сложных — 13.49s (сетевой bottleneck).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ZSTD:&lt;/b&gt; На простых 1.47s (лучше LZ4), на сложных &lt;b&gt;12.27s&lt;/b&gt; (🚀 быстрее всех). Сильное сжатие сокращает сетевой IO, компенсируя CPU overhead.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LZ4:&lt;/b&gt; На простых худший (1.68s, возможно шум), на сложных 13.93s (хуже ZSTD). Быстрое сжатие, но слабое (1.7x).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;CPU (Процессор)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Все варианты:&lt;/b&gt; ~7.5s (простые), ~214s (сложные). Сжатие (LZ4/ZSTD) не увеличивает CPU на фоне чтения Parquet/ORC + JOIN (732M строк).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Ключевые insights из сложных тестов&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сетевой трафик:&lt;/b&gt; ZSTD выигрывает на 70% (3.3x), LZ4 на 41% (1.7x). На больших шарфлах (JOINы генерируют GB) сеть — bottleneck для NONE/LZ4.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Время выполнения:&lt;/b&gt; ZSTD быстрее (12.27s vs 13.49s NONE, 13.93s LZ4). Компенсация сжатием &gt; overhead.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dynamic Filters:&lt;/b&gt; Работают одинаково (df_1013/1014), сжатие не влияет.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Memory:&lt;/b&gt; Peak ~25 GB (user), сжатие снижает пики на exchange.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Итог&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;ZSTD доминирует:&lt;/b&gt; Лучшее сжатие (3.3x), минимальный Wall Time на больших данных, нулевой CPU-штраф. На простых — баланс скорости/сжатия, на сложных — разгружает сеть.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LZ4:&lt;/b&gt; Средний вариант (быстрее сжатие, слабее компрессия). Хуже ZSTD по всем метрикам.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NONE:&lt;/b&gt; Только для микрокластерами/очень малых шарфлов (&lt;10 MB).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Рекомендации&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Внедрить `exchange-compression-codec=ZSTD`&lt;/b&gt; для всего кластера, особенно для многоузлового:&lt;/p&gt;
&lt;p&gt;или&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Управлять сессионно&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SET SESSION exchange_compression_codec = ‘NONE’;&lt;br /&gt;
SET SESSION exchange_compression_codec = ‘LZ4’;&lt;br /&gt;
SET SESSION exchange_compression_codec = ‘ZSTD’;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;exchange-compression-compression-level=3  # Баланс скорость/сжатие (по умолчанию и поменять в Trino нельзя пока)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему ZSTD:&lt;/b&gt; 3x+ экономия bandwidth на JOIN-ах (ваш workload). CPU современный — справляется.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Тестировать:&lt;/b&gt; На production-трафике (GB шарфл) — speedup 10-20%.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Доп. тюнинг:&lt;/b&gt; `exchange.compression-enabled=true` (уже по умолчанию). Если CPU bottleneck — LZ4, но ZSTD лучше.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Мониторинг:&lt;/b&gt; Смотреть `internalNetworkInputDataSize` в Trino UI — цель &lt;30% от uncompressed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZSTD — &lt;b&gt;золотой стандарт&lt;/b&gt; для вашего кластера! 🚀📦&lt;/p&gt;
</description>
</item>

<item>
<title>Просто duckdb 🦆 ну красота же 😍</title>
<guid isPermaLink="false">296</guid>
<link>https://gavrilov.info/all/prosto-duckdb-nu-krasota-zhe/</link>
<pubDate>Mon, 24 Nov 2025 21:21:17 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/prosto-duckdb-nu-krasota-zhe/</comments>
<description>
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;echo &amp;quot;cnt\n1\n2\n3&amp;quot; | duckdb -c &amp;quot;SELECT count(distinct cnt) FROM read_csv('/dev/stdin')&amp;quot;
┌─────────────────────┐
│ count(DISTINCT cnt) │
│        int64        │
├─────────────────────┤
│          3          │
└─────────────────────┘

echo &amp;quot;cnt\n1\n2\n3&amp;quot; | duckdb -c &amp;quot;SELECT sum(cnt) FROM read_csv('/dev/stdin')&amp;quot; 
┌──────────┐
│ sum(cnt) │
│  int128  │
├──────────┤
│    6     │
└──────────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;А тут еще много всякой дополнительно утиной косметики &lt;a href="https://query.farm/duckdb_extensions.html"&gt;https://query.farm/duckdb_extensions.html&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Обработка логов Trino из Kafka с помощью Vector для удаления полей</title>
<guid isPermaLink="false">295</guid>
<link>https://gavrilov.info/all/obrabotka-logov-trino-iz-kafka-s-pomoschyu-vector-dlya-udaleniya/</link>
<pubDate>Fri, 21 Nov 2025 01:27:16 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/obrabotka-logov-trino-iz-kafka-s-pomoschyu-vector-dlya-udaleniya/</comments>
<description>
&lt;p&gt;В современных архитектурах данных, построенных на Kafka, часто возникает задача обработки или фильтрации потока событий “на лету”. Один из распространенных кейсов — удаление чувствительной информации из логов перед их передачей в следующую систему (например, в SIEM или систему долгосрочного хранения).&lt;/p&gt;
&lt;p&gt;Kafka: &lt;a href="https://hub.docker.com/r/apache/kafka"&gt;https://hub.docker.com/r/apache/kafka&lt;/a&gt;&lt;br /&gt;
Vector: &lt;a href="https://vector.dev/docs"&gt;https://vector.dev/docs&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-21-v-00.28.37.png" width="1662" height="720" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Рассмотрим реальный пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Кластер &lt;b&gt;Trino&lt;/b&gt; (или Presto) пишет подробные логи о каждом выполненном запросе в топик Kafka.&lt;/li&gt;
&lt;li&gt;Эти логи содержат как полезные метаданные (пользователь, время, объем данных), так и полную &lt;b&gt;текстовую версию самого SQL-запроса&lt;/b&gt; в поле, например, `query`.&lt;/li&gt;
&lt;li&gt;Задача&lt;b&gt;: Переложить эти логи в другой топик Kafka, но уже &lt;/b&gt;без** поля `query`, чтобы система-подписчик не имела доступа к потенциально конфиденциальной информации в текстах запросов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для решения этой задачи мы воспользуемся &lt;b&gt;Vector&lt;/b&gt; — легковесным и сверхбыстрым инструментом для обработки данных.&lt;/p&gt;
&lt;h4&gt;План действий&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Создадим два топика в Kafka: `trino-logs-raw` (для сырых логов) и `trino-logs-cleaned` (для очищенных).&lt;/li&gt;
&lt;li&gt;Настроим Vector для чтения из первого топика, удаления поля `query` и всех служебных метаданных.&lt;/li&gt;
&lt;li&gt;Настроим Vector на запись результата во второй топик.&lt;/li&gt;
&lt;li&gt;Запустим всю цепочку в Docker и протестируем.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Шаг 1: Подготовка Kafka&lt;/h4&gt;
&lt;p&gt;Предполагается, что у вас уже запущен Kafka-брокер в Docker. На основе нашего примера, у вас есть контейнер с именем `broker1`, который является частью Docker-сети `minimal_iceberg_net`.&lt;/p&gt;
&lt;p&gt;Откройте терминал и подключитесь к контейнеру Kafka, чтобы создать топики:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Создадим сеть 

docker network create my_net 

Запускаем брокер broker:

docker run -d \
  --name broker3 \
  --network=my_net \
  -p 8893:9092 \
  -e KAFKA_NODE_ID=3 \
  -e KAFKA_PROCESS_ROLES='broker,controller' \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS='3@broker3:9093' \
  -e KAFKA_LISTENERS='INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092,CONTROLLER://broker3:9093' \
  -e KAFKA_ADVERTISED_LISTENERS='INTERNAL://broker3:29092,EXTERNAL://localhost:8893' \
  -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT' \
  -e KAFKA_INTER_BROKER_LISTENER_NAME='INTERNAL' \
  -e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \
  -e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \
  apache/kafka:latest


docker exec --workdir /opt/kafka/bin/ -it broker3 sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь, находясь внутри контейнера, выполните команды:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Создаем &amp;quot;сырой&amp;quot; топик для входящих логов Trino
./kafka-topics.sh --create --topic trino-logs-raw --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1

# Создаем &amp;quot;чистый&amp;quot; топик для обработанных логов
./kafka-topics.sh --create --topic trino-logs-cleaned --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;*Обратите внимание: я использую внутренний порт брокера `29092`, который узнали ранее.*&lt;/p&gt;
&lt;p&gt;Выйдите из контейнера командой `exit`.&lt;/p&gt;
&lt;h4&gt;Шаг 2: Конфигурация Vector&lt;/h4&gt;
&lt;p&gt;На вашей локальной машине создайте структуру папок:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;vector-trino-processor/
└── config/
    └── vector.toml&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Поместите в файл `vector.toml` следующую конфигурацию. Это сердце нашего решения.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# vector-trino-processor/config/vector.toml

# ==================================
#          ИСТОЧНИК ДАННЫХ
# ==================================
# Читаем сырые логи из Kafka
[sources.trino_raw_logs]
  type = &amp;quot;kafka&amp;quot;
  # Подключаемся к брокеру по имени контейнера и внутреннему порту
  bootstrap_servers = &amp;quot;broker3:29092&amp;quot;
  # Указываем, какой топик слушать
  topics = [&amp;quot;trino-logs-raw&amp;quot;]
  group_id = &amp;quot;vector-trino-cleaner&amp;quot;
  # Vector автоматически распарсит входящие сообщения как JSON
  decoding.codec = &amp;quot;json&amp;quot;

# ==================================
#             ТРАНСФОРМАЦИЯ
# ==================================
# Удаляем поле `query` и служебные метаданные Vector
[transforms.clean_trino_log]
  type = &amp;quot;remap&amp;quot;
  # Получаем данные от нашего источника
  inputs = [&amp;quot;trino_raw_logs&amp;quot;]
  # Скрипт на языке Vector Remap Language (VRL)
  source = '''
  # 1. Удаляем чувствительное поле &amp;quot;query&amp;quot; из лога.
  del(.query)

  # 2. Удаляем все служебные поля, которые Vector добавляет
  #    при чтении из Kafka, чтобы на выходе был чистый JSON.
  del(.headers)
  del(.message_key)
  del(.offset)
  del(.partition)
  del(.source_type)
  del(.timestamp)
  del(.topic)
  '''

# ==================================
#           ПРИЕМНИК ДАННЫХ
# ==================================
# Пишем очищенные логи в новый топик Kafka
[sinks.trino_cleaned_logs]
  type = &amp;quot;kafka&amp;quot;
  # Принимаем на вход данные, прошедшие трансформацию
  inputs = [&amp;quot;clean_trino_log&amp;quot;]
  bootstrap_servers = &amp;quot;broker3:29092&amp;quot;
  # Указываем топик для записи
  topic = &amp;quot;trino-logs-cleaned&amp;quot;
  # Кодируем итоговое событие обратно в JSON
  encoding.codec = &amp;quot;json&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Шаг 3: Запуск и Тестирование&lt;/h4&gt;
&lt;p&gt;Нам понадобится три терминала.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;В Терминале №1 — Запустим Vector&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Перейдите в папку `vector-trino-processor` и выполните команду:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker run \
  -d \
  --name vector-processor \
  -v &amp;quot;$(pwd)/config:/etc/vector/&amp;quot; \
  --network=my_net \
  --rm \
  timberio/vector:latest-alpine --config /etc/vector/vector.toml&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Эта команда:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Запускает контейнер Vector в фоновом режиме (`-d`).&lt;/li&gt;
&lt;li&gt;Дает ему имя `vector-processor`.&lt;/li&gt;
&lt;li&gt;Монтирует ваш локальный конфиг (`-v`).&lt;/li&gt;
&lt;li&gt;Подключает его к той же сети, что и Kafka (`--network`).&lt;/li&gt;
&lt;li&gt;Явно указывает, какой файл конфигурации использовать (`--config`).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;В Терминале №2 — Симулируем отправку лога Trino&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Запустим интерактивный Kafka-продюсер.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker exec --workdir /opt/kafka/bin -it broker3 ./kafka-console-producer.sh --topic trino-logs-raw --bootstrap-server localhost:29092&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь вставьте в этот терминал JSON, имитирующий лог от Trino, и нажмите Enter:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{&amp;quot;user&amp;quot;:&amp;quot;yuriy&amp;quot;,&amp;quot;source&amp;quot;:&amp;quot;trino-cli&amp;quot;,&amp;quot;queryId&amp;quot;:&amp;quot;20231120_123456_00001_abcde&amp;quot;,&amp;quot;query&amp;quot;:&amp;quot;SELECT * FROM sensitive_table a JOIN other_table b ON a.id = b.id WHERE a.credit_card = '1234-5678-9012-3456'&amp;quot;,&amp;quot;state&amp;quot;:&amp;quot;FINISHED&amp;quot;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;В Терминале №3 — Проверяем результат&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Запустим Kafka-консьюмер, который будет слушать &lt;b&gt;очищенный&lt;/b&gt; топик `trino-logs-cleaned`.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker exec --workdir /opt/kafka/bin -it broker3 ./kafka-console-consumer.sh --topic trino-logs-cleaned --bootstrap-server localhost:29092 --from-beginning&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вы практически мгновенно увидите результат работы Vector — тот же самый лог, но уже &lt;b&gt;без поля `query`&lt;/b&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{&amp;quot;user&amp;quot;:&amp;quot;yuriy&amp;quot;,&amp;quot;source&amp;quot;:&amp;quot;trino-cli&amp;quot;,&amp;quot;queryId&amp;quot;:&amp;quot;20231120_123456_00001_abcde&amp;quot;,&amp;quot;state&amp;quot;:&amp;quot;FINISHED&amp;quot;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Мы построили простой, но мощный конвейер для обработки данных в режиме реального времени, решив поставленную задачу с минимальными усилиями.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-21-v-01.25.17.png" width="1652" height="470" alt="" /&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Nimtable: Единая панель управления для зоопарка Iceberg-каталогов</title>
<guid isPermaLink="false">294</guid>
<link>https://gavrilov.info/all/nimtable-edinaya-panel-upravleniya-dlya-zooparka-iceberg-katalog/</link>
<pubDate>Wed, 19 Nov 2025 22:44:53 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/nimtable-edinaya-panel-upravleniya-dlya-zooparka-iceberg-katalog/</comments>
<description>
&lt;p&gt;В современных компаниях, активно использующих данные, часто возникает проблема “зоопарка” технологий. Данные хранятся в озере данных (Data Lake), а метаданные об этих данных — в каталогах. Со временем таких каталогов становится много: один `Hive Metastore` для унаследованной аналитики, другой — `REST Catalog` для новой платформы на Trino, третий — `JDBC Catalog` для специфичного микросервиса, а где-то в среде разработки таблицы вообще создаются напрямую в S3. Каждая система решает свою задачу, но вместе они создают хаос.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nimtable/nimtable"&gt;https://github.com/nimtable/nimtable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Платформенным дата-командам становится сложно управлять этим разнообразием, отслеживать состояние таблиц, проводить оптимизацию и обеспечивать единые стандарты. Именно для решения этой проблемы и был создан open-source проект &lt;b&gt;Nimtable&lt;/b&gt;. Это не просто очередной каталог для Iceberg, а полноценная платформа для наблюдения и управления (*observability platform*) существующими каталогами из одного окна.&lt;/p&gt;
&lt;h4&gt;Что такое Nimtable?&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Nimtable&lt;/b&gt; — это легковесная веб-платформа с открытым исходным кодом, предназначенная для исследования и управления каталогами и таблицами Apache Iceberg. Его ключевая идея — предоставить единый интерфейс для подключения к различным существующим каталогам, агрегируя метаданные и предоставляя инструменты для их анализа и обслуживания.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-22.18.11.png" width="1376" height="708" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Проект ориентирован на инженерные и платформенные команды, которые хотят получить контроль над своей Iceberg-инфраструктурой без привязки к конкретному вендору и без операционной сложности самостоятельного развертывания разрозненных инструментов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-232.png.jpg" width="2560" height="1598" alt="" /&gt;
&lt;/div&gt;
&lt;h4&gt;Ключевая функциональность&lt;/h4&gt;
&lt;p&gt;Nimtable предлагает набор функций, которые делают его мощным инструментом для управления озером данных.&lt;/p&gt;
&lt;p&gt;пы: картинки можно листать, если что) там много, почти все меню.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1856" data-ratio="3.0032362459547"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-22.04.44.png" width="1856" height="618" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.28.36.png" width="1946" height="1784" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.40.39.png" width="1894" height="606" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.36.26.png" width="1462" height="324" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.36.06.png" width="1470" height="256" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.34.49.png" width="834" height="808" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.34.42.png" width="1886" height="600" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.34.34.png" width="1948" height="706" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.34.18.png" width="1934" height="1776" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.33.43.png" width="1852" height="1136" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.33.03.png" width="1440" height="1040" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.32.48.png" width="1432" height="806" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.32.23.png" width="642" height="408" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.32.03.png" width="630" height="388" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.31.45.png" width="1926" height="1760" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.31.05.png" width="1944" height="1784" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.30.46.png" width="1950" height="960" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.30.37.png" width="1942" height="630" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.30.29.png" width="964" height="626" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.30.08.png" width="1944" height="1780" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.29.51.png" width="1928" height="816" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.29.38.png" width="1876" height="950" alt="" /&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-21.29.29.png" width="1938" height="878" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Агрегация каталогов&lt;/b&gt;: Это главная особенность проекта. Nimtable позволяет в одном интерфейсе подключить и работать с несколькими типами каталогов Apache Iceberg, включая:
&lt;ul&gt;
  &lt;li&gt;`REST Catalog`&lt;/li&gt;
  &lt;li&gt;`AWS Glue`&lt;/li&gt;
  &lt;li&gt;`PostgreSQL` (через JDBC)&lt;/li&gt;
  &lt;li&gt;Каталоги на основе S3 (`S3 Tables`)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Исследование и визуализация&lt;/b&gt;: Платформа предоставляет удобный UI для навигации по метаданным:
&lt;ul&gt;
  &lt;li&gt;Просмотр каталогов, пространств имен (схем) и таблиц.&lt;/li&gt;
  &lt;li&gt;Анализ схемы таблиц, их партиций, снэпшотов и манифестов.&lt;/li&gt;
  &lt;li&gt;Визуализация распределения файлов и снэпшотов, что помогает быстро находить таблицы, требующие оптимизации (например, с большим количеством мелких файлов).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Управление оптимизацией&lt;/b&gt;: Nimtable не просто показывает проблемы, но и помогает их решать. Он интегрируется с внешними вычислительными движками, такими как &lt;b&gt;Apache Spark&lt;/b&gt; или &lt;b&gt;RisingWave&lt;/b&gt;, позволяя запускать и отслеживать задачи по обслуживанию таблиц (например, `compaction` или `expire_snapshots`) прямо из веб-интерфейса.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Встроенный SQL-редактор&lt;/b&gt;: Для быстрой проверки данных или метаданных в Nimtable встроен простой SQL-редактор, позволяющий выполнять запросы к таблицам напрямую из браузера.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Собственный REST API&lt;/b&gt;: Помимо агрегации других каталогов, Nimtable сам может выступать в роли стандартного Iceberg REST-каталога. Это позволяет использовать его как единую точку входа для различных движков запросов (Trino, Spark, Flink).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Варианты использования в большой компании&lt;/h3&gt;
&lt;p&gt;Представим себе компанию, где исторически сложился разнородный ландшафт данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Прод-кластер Hadoop&lt;/b&gt; использует `Hive Metastore` для аналитических витрин.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Аналитическая платформа&lt;/b&gt; на Trino работает с &lt;a href="https://docs.cedrusdata.ru/latest/cedrusdata-catalog.html"&gt;CedrusData Catalog&lt;/a&gt;, который реализует `Iceberg REST API` &lt;a href="https://habr.com/ru/companies/cedrusdata/articles/860356"&gt;habr.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Команда разработки&lt;/b&gt; для своих экспериментов использует таблицы, зарегистрированные напрямую в S3, чтобы не “загрязнять” общие каталоги.&lt;/li&gt;
&lt;li&gt;Какой-то &lt;b&gt;сервис&lt;/b&gt; использует собственную `PostgreSQL` базу как JDBC-каталог.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В такой среде Nimtable становится незаменимым инструментом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Единая точка входа&lt;/b&gt;: Платформенная команда подключает все четыре каталога к Nimtable. Теперь для мониторинга состояния всех Iceberg-таблиц в компании достаточно зайти на один дашборд, не переключаясь между разными консолями и инструментами.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Централизованная оптимизация&lt;/b&gt;: Инженер замечает, что в одной из таблиц на прод-кластере накопилось тысячи мелких файлов. Прямо из интерфейса Nimtable он может запустить `compaction-job` на общем Spark-кластере, выбрав нужную таблицу, независимо от того, в каком каталоге она зарегистрирована.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Упрощение доступа&lt;/b&gt;: Вместо того чтобы объяснять новому аналитику, как настроить 4 разных подключения, ему можно дать доступ к Nimtable, где он сможет исследовать все доступные данные в едином, понятном интерфейсе.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Контролируемая миграция&lt;/b&gt;: Если команда решит перенести таблицы из `Hive Metastore` в новый `REST Catalog`, Nimtable позволит одновременно наблюдать за источником и приемником, контролируя процесс и сверяя метаданные.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Архитектура и развертывание&lt;/h4&gt;
&lt;p&gt;Архитектурно Nimtable располагается между конечными пользователями (или движками запросов) и нижележащими каталогами метаданных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-231.png" width="1443" height="654" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Проект очень прост в развертывании. Самый быстрый способ начать работу — использовать Docker:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Переходим в директорию с docker-файлами в репозитории проекта
cd docker
# Запускаем сервисы в фоновом режиме
docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После этого веб-интерфейс будет доступен по адресу `&lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;`.&lt;/p&gt;
&lt;h4&gt;Сравнение с другими решениями&lt;/h4&gt;
&lt;p&gt;Чтобы понять нишу, которую занимает Nimtable, сравним его с другими популярными решениями для управления метаданными.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Параметр&lt;/td&gt;
&lt;td style="text-align: center"&gt;Nimtable&lt;/td&gt;
&lt;td style="text-align: center"&gt;Project Nessie&lt;/td&gt;
&lt;td style="text-align: center"&gt;Hive Metastore&lt;/td&gt;
&lt;td style="text-align: center"&gt;CedrusData Catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Основное назначение&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Платформа для наблюдения и управления несколькими каталогами.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Каталог с Git-подобным версионированием данных.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хранилище метаданных для экосистемы Hadoop.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высокопроизводительный Iceberg REST каталог.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Поддержка нескольких каталогов (агрегация)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Да (ключевая функция)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет (является самостоятельным каталогом)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет (является самостоятельным каталогом)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет (является самостоятельным каталогом)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Встроенный UI для управления&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да, с фокусом на агрегацию и оптимизацию.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да, с фокусом на ветки, теги и коммиты.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет (обычно управляется через CLI или сторонние UI).&lt;/td&gt;
&lt;td style="text-align: center"&gt;Управляется через API; UI не является основной частью &lt;a href="https://docs.cedrusdata.ru/catalog/458-14"&gt;docs.cedrusdata.ru&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Управление оптимизацией (Compaction)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Да, через интеграцию с внешними движками.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет, это задача движков запросов.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет, это задача движков запросов (Spark/Hive).&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет, это задача движков запросов.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Git-подобные операции&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Да (ключевая функция)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Как видно из таблицы, Nimtable не конкурирует напрямую с каталогами вроде Nessie или Hive и другими, а дополняет их, выступая в роли “менеджера менеджеров”.&lt;/p&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Nimtable — это многообещающий проект, который пока не собрал много звёзд, но уже готов решать реальную боль платформенных дата-команд в крупных организациях. Вместо того чтобы создавать еще один стандарт каталога, он предлагает удобный слой абстракции для управления уже существующим “зоопарком”. Возможность в одном месте видеть, анализировать и оптимизировать таблицы из разных систем (`Hive`, `JDBC`, `REST`) делает его уникальным и крайне полезным инструментом для построения зрелой и управляемой платформы данных на базе Apache Iceberg.&lt;/p&gt;
&lt;p&gt;Кстати, у меня после запуска он сначала жутко тупил, а потом прочихался, на третий день работы в докере))) я уже даже не надеялся, а он смог. ниче не делал) оно само) Но, видимо, если таблиц очень много, то первый запуск надо как то отдельно планировать. В общем зверь интересный и полезный, а запускать не сложно. Ну почти не сложно и баги есть. вот эту нашел например?  &lt;a href="https://github.com/nimtable/nimtable/issues/200"&gt;https://github.com/nimtable/nimtable/issues/200&lt;/a&gt; но это не критично.&lt;/p&gt;
&lt;p&gt;Видосик ниже, компакшен в онлайне не получился, но 5 минут ранее он прошел хорошо. вероятно, что моих локальных ресурсов не хватает для записи видео и этой операции.&lt;/p&gt;
&lt;p&gt;&lt;video controls style="width: 100%; max-width: 1200px; height: auto;"&gt;&lt;br /&gt;
&lt;source src="http://a.gavrilov.info/data/posts/nimtable.mp4" type="video/mp4"&gt;&lt;br /&gt;
Ваш браузер не поддерживает видео.&lt;br /&gt;
&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Да точно, дело в ресурсах, теперь 16 файлов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-22.47.50.png" width="1392" height="648" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-22.48.56.png" width="1532" height="1068" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь кстати хочет оптимизации)), хороший тула, можно и сломать табличку им))&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-11-19-v-22.49.46.png" width="1530" height="1060" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Ранее писал о разных каталогах тут: &lt;a href="https://gavrilov.info/all/rukovodstvo-po-rest-katalogam-dlya-trino-i-iceberg/"&gt;https://gavrilov.info/all/rukovodstvo-po-rest-katalogam-dlya-trino-i-iceberg/&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Новые архитектуры современной инфраструктуры данных: a16z</title>
<guid isPermaLink="false">293</guid>
<link>https://gavrilov.info/all/novye-arhitektury-sovremennoy-infrastruktury-dannyh-a16z/</link>
<pubDate>Tue, 04 Nov 2025 17:02:04 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/novye-arhitektury-sovremennoy-infrastruktury-dannyh-a16z/</comments>
<description>
&lt;p&gt;&lt;b&gt;Источник:&lt;/b&gt; &lt;a href="https://a16z.com/emerging-architectures-for-modern-data-infrastructure"&gt;Emerging Architectures for Modern Data Infrastructure&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Авторы:&lt;/b&gt; Matt Bornstein, Jennifer Li, and Martin Casado&lt;br /&gt;
PDF: &lt;a href="https://a.gavrilov.info/data/posts/Emerging_Architectures_for_Modern_Data_Infrastructure_Andreessen_Horowitz.pdf"&gt;Тут&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Индустрия инфраструктуры данных продолжает стремительно развиваться. С момента публикации первой версии эталонных архитектур в 2020 году, на рынке появилось множество новых продуктов, а метрики ключевых компаний достигли рекордных высот. Эта статья представляет собой обновленный анализ ключевых архитектурных шаблонов и трендов, основанный на опыте ведущих специалистов в области данных.&lt;/p&gt;
&lt;p&gt;Основная гипотеза заключается в том, что, хотя &lt;b&gt;ядро систем обработки данных осталось относительно стабильным&lt;/b&gt;, вокруг него произошел “Кембрийский взрыв” — стремительное размножение поддерживающих инструментов и приложений. Это явление можно объяснить формированием настоящих &lt;b&gt;платформ данных&lt;/b&gt;, которые становятся фундаментом для новой экосистемы.&lt;/p&gt;
&lt;h4&gt;Обновленные эталонные архитектуры&lt;/h4&gt;
&lt;p&gt;Статья предлагает два общих взгляда на современный стек данных.&lt;/p&gt;
&lt;h5&gt;1. Единая инфраструктура данных (Unified Data Infrastructure 2.0)&lt;/h5&gt;
&lt;p&gt;Эта схема дает комплексное представление о стеке данных, охватывая все основные варианты использования — от аналитики до операционных систем.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-222.png" width="2000" height="1236" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Notes: Excludes OLTP, log analysis, and SaaS analytics apps.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-223.png" width="2000" height="955" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Схема демонстрирует путь данных от источников (`Sources`) через этапы загрузки и транспортировки (`Ingestion and Transport`), хранения (`Storage`), обработки запросов (`Query and Processing`), трансформации (`Transformation`) до конечного анализа и вывода (`Analysis and Output`).&lt;/p&gt;
&lt;h5&gt;2. Инфраструктура для машинного обучения (Machine Learning Infrastructure 2.0)&lt;/h5&gt;
&lt;p&gt;Вторая схема подробно рассматривает сложную и все более независимую цепочку инструментов для машинного обучения.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-224.png" width="2000" height="1406" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-225.png" width="2000" height="840" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Здесь показан жизненный цикл ML-модели: от трансформации данных и разработки модели (`Data Transformation`, `Model Training and Development`) до ее развертывания (`Model Inference`) и интеграции в конечные продукты (`Integration`).&lt;/p&gt;
&lt;h4&gt;Что изменилось? Стабильное ядро и “Кембрийский взрыв”&lt;/h4&gt;
&lt;h5&gt;Что не изменилось: стабильность в ядре&lt;/h5&gt;
&lt;p&gt;Несмотря на активное развитие рынка, базовые архитектурные паттерны сохранили свою актуальность. По-прежнему существует разделение между:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Аналитическими системами&lt;/b&gt; (Analytic Systems), которые помогают принимать решения на основе данных (`data-driven decisions`).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Операционными системами&lt;/b&gt; (Operational Systems), которые являются основой для продуктов, использующих данные (`data-powered products`).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ключевые технологии в ядре стека доказали свою устойчивость и продолжают доминировать:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В &lt;b&gt;аналитике&lt;/b&gt; связка `Fivetran` (для репликации данных), `Snowflake`/`BigQuery` (облачные хранилища данных) и `dbt` (для SQL-трансформаций) стала почти стандартом де-факто.&lt;/li&gt;
&lt;li&gt;В &lt;b&gt;операционных системах&lt;/b&gt; укрепились такие стандарты, как `Databricks`/`Spark`, `Confluent`/`Kafka` и `Airflow`.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Что нового: “Кембрийский взрыв”&lt;/h5&gt;
&lt;p&gt;Вокруг стабильного ядра наблюдается бурный рост новых инструментов и приложений, которые можно разделить на две категории:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Новые инструменты&lt;/b&gt; для поддержки ключевых процессов обработки данных:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Data Discovery:&lt;/b&gt; Каталоги данных для поиска и понимания имеющихся активов (`Amundsen`, `DataHub`, `Atlan`).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Data Observability:&lt;/b&gt; Инструменты для мониторинга состояния и качества конвейеров данных (`Monte Carlo`, `Bigeye`).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;ML Model Auditing:&lt;/b&gt; Решения для аудита и валидации ML-моделей.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Новые приложения&lt;/b&gt; для извлечения ценности из данных:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Data Workspaces:&lt;/b&gt; Интерактивные среды для совместной работы аналитиков и Data Scientist’ов (`Mode`, `Hex`, `Deepnote`).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Reverse ETL:&lt;/b&gt; Сервисы, которые возвращают обогащенные данные из хранилища обратно в операционные системы (CRM, ERP), такие как `Census` и `Hightouch`.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;ML Application Frameworks:&lt;/b&gt; Фреймворки для создания приложений на основе ML-моделей (`Streamlit`).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Три основных архитектурных шаблона (Blueprints)&lt;/h4&gt;
&lt;h5&gt;Шаблон 1: Современная Business Intelligence (BI)&lt;/h5&gt;
&lt;p&gt;Этот шаблон предназначен для компаний любого размера, которые строят облачную BI-аналитику.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-226.png" width="2000" height="1236" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Darker boxes are new or meaningfully changed since v1 of the architecture in 2020; lighter colored boxes have remained largely the same. Gray boxes are considered less relevant to this blueprint.&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Что не изменилось:&lt;/b&gt; Основой по-прежнему является комбинация репликации данных (`Fivetran`), облачного хранилища (`Snowflake`) и SQL-моделирования (`dbt`). Дашборды (`Looker`, `Tableau`, `Superset`) остаются главным инструментом анализа.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Что нового:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Metrics Layer:&lt;/b&gt; Появился активный интерес к слою метрик — системе, которая предоставляет стандартизированные бизнес-определения поверх хранилища данных (`Transform`, `LookML`). `dbt` также движется в этом направлении. ( dbt кстати открыла в общий доступ свои метрики &lt;a href="https://gavrilov.info/all/dbt-otkryvaet-ishodny-kod-metricflow-upravlyaemye-metriki-dlya-a"&gt;тут&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Reverse ETL:&lt;/b&gt; Этот инструмент позволяет операционализировать аналитику, отправляя результаты (например, скоринг лидов) из хранилища напрямую в `Salesforce` или `Hubspot`. ( теперь мы знаем как эта штука называется по-модному, когда кто-то просит excele’чку всунуть к табличке рядышком :) )&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Data Workspaces:&lt;/b&gt; Новые приложения для более гибкого и глубокого анализа, чем стандартные дашборды.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Шаблон 2: Мультимодальная обработка данных&lt;/h5&gt;
&lt;p&gt;Этот шаблон развивает концепцию “озера данных” (`Data Lake`) для поддержки как аналитических, так и операционных задач. Часто используется компаниями, которые “мигрировали” с `Hadoop`.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-227.png" width="2000" height="1236" alt="" /&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Что не изменилось:&lt;/b&gt; Ядром остаются системы обработки (`Databricks`, `Starburst`), транспортировки (`Confluent`, `Airflow`) и хранения (`AWS S3`).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Что нового:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Архитектура Lakehouse:&lt;/b&gt; Получила широкое признание концепция `Lakehouse` — гибрид, объединяющий гибкость озера данных и производительность/управляемость хранилища данных. Она позволяет использовать поверх одного и того же хранилища (`S3`) множество движков: `Spark`, `Presto`, `Druid`/`ClickHouse` и др.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Форматы хранения:&lt;/b&gt; Быстрое распространение получают открытые табличные форматы, такие как `Delta Lake`, `Apache Iceberg` и `Apache Hudi`, которые привносят транзакционность и надежность в озера данных.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Stream Processing:&lt;/b&gt; Растет популярность потоковой обработки данных в реальном времени. Появляются новые, более простые в использовании инструменты (`Materialize`, `Upsolver`), а существующие (`Databricks Streaming`, `Confluent`/`ksqlDB`) наращивают функциональность.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Шаблон 3: Искусственный интеллект и машинное обучение (AI/ML)&lt;/h5&gt;
&lt;p&gt;Стек для разработки, тестирования и эксплуатации ML-моделей.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-228.png" width="2000" height="1406" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Note: Darker boxes are new or meaningfully changed since v1 of the architecture in 2020; lighter colored boxes have remained largely the same. Gray boxes are considered less relevant to this blueprint.&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Что не изменилось:&lt;/b&gt; Инструменты для разработки моделей в целом остались прежними: облачные платформы (`AWS Sagemaker`, `Databricks`), ML-фреймворки (`PyTorch`, `XGBoost`) и системы для отслеживания экспериментов (`Weights &amp; Biases`, `Comet`).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Что нового:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Data-Centric AI:&lt;/b&gt; Произошел сдвиг парадигмы в сторону подхода, ориентированного на данные. Вместо бесконечного улучшения кода модели, фокус сместился на улучшение качества и управления данными для обучения. Это привело к росту сервисов &lt;b&gt;разметки данных&lt;/b&gt; (`Scale AI`, `Labelbox`).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Feature Stores:&lt;/b&gt; Увеличилось внедрение хранилищ признаков (`Tecton`, `Feast`) для совместной разработки и использования ML-признаков в production.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Pre-trained Models:&lt;/b&gt; Использование предобученных моделей (особенно в NLP) стало стандартом. Компании, как `OpenAI` и `Hugging Face`, играют здесь ключевую роль.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;MLOps:&lt;/b&gt; Инструменты для эксплуатации моделей стали более зрелыми, особенно в области &lt;b&gt;мониторинга&lt;/b&gt; (`Arize`, `Fiddler`) на предмет деградации качества и дрифта данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Гипотеза о “платформе данных”&lt;/h4&gt;
&lt;p&gt;Ключевая идея статьи — объяснить наблюдаемые изменения через формирование &lt;b&gt;платформ данных&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;В широком смысле, платформа — это то, на чем могут строить свои продукты другие разработчики. Определяющей чертой является взаимная зависимость между поставщиком платформы и большим пулом сторонних разработчиков.&lt;/p&gt;
&lt;p&gt;Применительно к данным, “бэкенд” стека (загрузка, хранение, обработка) консолидируется вокруг небольшого числа облачных вендоров. Эти вендоры (`Snowflake`, `Databricks`) активно инвестируют в то, чтобы сделать данные легкодоступными для других через стандартные интерфейсы (например, SQL).&lt;/p&gt;
&lt;p&gt;В свою очередь, “фронтенд” разработчики пользуются этим, создавая множество новых приложений поверх единой точки интеграции, не беспокоясь о сложностях базовой инфраструктуры. Это приводит к появлению нового класса `warehouse-native` (или `lakehouse-native`) приложений, которые работают непосредственно с данными клиента в его хранилище.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-229.png" width="2000" height="986" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-230.png" width="2000" height="1977" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Эта модель объясняет, почему поставщики ядра данных (`Snowflake`, `Databricks`) так высоко ценятся (они борются за долгосрочную позицию платформы) и почему наблюдается взрывной рост в экосистеме инструментов (`Reverse ETL`, `Metrics Layer`) — они становятся важными компонентами, встроенными в эту новую платформенную архитектуру.&lt;/p&gt;
&lt;h4&gt;Итог и акценты в трендах&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Стабилизация ядра и консолидация.&lt;/b&gt; Ключевые компоненты стека (хранилище/озеро, движки обработки) консолидируются вокруг нескольких крупных игроков, которые становятся де-факто стандартами.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Взрывной рост экосистемы.&lt;/b&gt; Вокруг стабильного ядра формируется богатая экосистема вспомогательных инструментов (`observability`, `discovery`) и бизнес-приложений (`reverse ETL`, `workspaces`), которые повышают ценность данных.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Платформизация стека данных.&lt;/b&gt; Центральные хранилища данных (`Data Warehouse`, `Lakehouse`) превращаются из простых баз данных в полноценные платформы для разработки. Это открывает путь для нового поколения `warehouse-native` SaaS-приложений.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Операционализация данных.&lt;/b&gt; Тренд смещается от простой аналитики (посмотреть на дашборд) к активному использованию данных в операционных процессах бизнеса. Технологии `Reverse ETL` являются главным драйвером этого тренда.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Data-Centric AI.&lt;/b&gt; В мире машинного обучения фокус окончательно сместился с улучшения алгоритмов на улучшение данных, что стимулирует рынок инструментов для управления жизненным циклом данных в ML (`data labeling`, `feature stores`, `monitoring`).&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>dbt открывает исходный код MetricFlow: Управляемые метрики для AI и аналитики</title>
<guid isPermaLink="false">292</guid>
<link>https://gavrilov.info/all/dbt-otkryvaet-ishodny-kod-metricflow-upravlyaemye-metriki-dlya-a/</link>
<pubDate>Sat, 01 Nov 2025 01:03:55 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/dbt-otkryvaet-ishodny-kod-metricflow-upravlyaemye-metriki-dlya-a/</comments>
<description>
&lt;p&gt;Компания dbt Labs объявила о важном изменении в своей стратегии: `MetricFlow`, ключевая технология, лежащая в основе `dbt Semantic Layer`, становится полностью открытой. Проект переводится под лицензию Apache 2.0, что позволяет любому использовать, изменять и встраивать его в свои продукты. Это стратегический шаг, направленный на создание единого отраслевого стандарта для определения бизнес-метрик, особенно в свете бурного развития AI-систем.&lt;/p&gt;
&lt;p&gt;Оригинал тут: &lt;a href="https://www.getdbt.com/blog/open-source-metricflow-governed-metrics"&gt;https://www.getdbt.com/blog/open-source-metricflow-governed-metrics&lt;/a&gt;&lt;br /&gt;
А гит тут: &lt;a href="https://github.com/dbt-labs/metricflow"&gt;https://github.com/dbt-labs/metricflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Еще кстати есть &lt;a href="https://github.com/memiiso/opendbt"&gt;https://github.com/memiiso/opendbt&lt;/a&gt; ( Make dbt great again! :) Может они сольются с метриками, интересно.&lt;/p&gt;
&lt;h3&gt;Проблема: почему семантический слой стал критически важен&lt;/h3&gt;
&lt;p&gt;Концепция семантического слоя, который служит промежуточным слоем для определения бизнес-логики (метрик, измерений, связей), не нова. Она уже много лет используется в BI-системах для обеспечения согласованности отчетов. Однако с появлением больших языковых моделей (LLM) и инструментов в стиле “Chat with your data” проблема вышла на новый уровень.&lt;/p&gt;
&lt;p&gt;Когда AI-агент или LLM пытается ответить на вопрос, обращаясь напрямую к базе данных, он вынужден самостоятельно генерировать SQL-запрос. При этом модель “угадывает”, какие таблицы нужно соединить (`JOIN`), как правильно отфильтровать данные, какую использовать гранулярность по времени и какие оконные функции применить.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблемы такого подхода:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Несогласованность:&lt;/b&gt; Две разные модели (или даже одна и та же, но с другим запросом) могут сгенерировать разный SQL для расчета, казалось бы, одной и той же метрики. Это приводит к разным цифрам в отчетах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ошибки:&lt;/b&gt; LLM может не знать о тонкостях бизнес-логики, например, о том, что при расчете выручки нужно учитывать возвраты или использовать специальный финансовый календарь.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Потеря доверия:&lt;/b&gt; Когда пользователи получают противоречивые или неверные данные, доверие ко всей системе аналитики быстро падает.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Метрики не должны быть вероятностными, зависящими от “догадок” LLM при каждом вызове. &lt;b&gt;Они должны быть детерминированными.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;`MetricFlow` решает именно эту задачу.&lt;/p&gt;
&lt;h3&gt;Что такое MetricFlow и как он работает&lt;/h3&gt;
&lt;p&gt;`MetricFlow` — это движок, который преобразует семантические определения бизнес-понятий в готовый к выполнению и оптимизированный SQL-код. Аналитик один раз определяет метрику “Валовая маржа” на языке `MetricFlow`, и после этого любая система (BI-инструмент, AI-агент, Python-скрипт) может запросить эту метрику по имени, будучи уверенной, что получит корректный и одинаковый результат.&lt;/p&gt;
&lt;h3&gt;Ключевые изменения и их значение&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Лицензия Apache 2.0:&lt;/b&gt; Это одно из главных нововведений. Apache 2.0 — это разрешительная лицензия, которая позволяет другим компаниям свободно встраивать `MetricFlow` в свои коммерческие и открытые продукты. Это снимает барьеры для принятия технологии и способствует ее распространению как стандарта.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сотрудничество с Open Semantic Interchange (OSI):&lt;/b&gt; dbt Labs будет развивать `MetricFlow` совместно с такими партнерами, как Snowflake и Salesforce, в рамках инициативы OSI. Цель — создать единый стандарт для семантической совместимости между разными платформами, чтобы метрики, определенные один раз, одинаково работали во всех инструментах.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Как MetricFlow обеспечивает надежность AI&lt;/h3&gt;
&lt;p&gt;`MetricFlow` предоставляет открытый стандарт для метаданных и расширяемый движок, который превращает намерение (“покажи валовую маржу”) в SQL-запрос для хранилища данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример работы:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Предположим, пользователь задает AI-агенту вопрос:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Покажи валовую маржу (%) по месяцам за прошлый квартал для Северной Америки (за вычетом скидок и возвратов, по финансовому календарю).”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Без семантического слоя LLM пришлось бы конструировать сложный запрос с нуля. С `MetricFlow` процесс выглядит так:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Агент распознает намерение и запрашивает у `MetricFlow` метрику `gross_margin_pct` с нужными измерениями (`region`, `fiscal_month`) и фильтрами.&lt;/li&gt;
&lt;li&gt;`MetricFlow`, на основе заранее созданных определений, строит план запроса:
&lt;ul&gt;
  &lt;li&gt;Находит нужные таблицы: `orders`, `discounts`, `returns`, `cogs` (себестоимость).&lt;/li&gt;
  &lt;li&gt;Применяет правильные `JOIN` между ними.&lt;/li&gt;
  &lt;li&gt;Применяет фильтр по региону (`North America`).&lt;/li&gt;
  &lt;li&gt;Группирует данные по месяцам финансового, а не календарного, года.&lt;/li&gt;
  &lt;li&gt;Рассчитывает числитель (выручка) и знаменатель (себестоимость) с учетом того, что популяция данных для них должна быть одинаковой.&lt;/li&gt;
  &lt;li&gt;Вычисляет итоговое соотношение.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`MetricFlow` компилирует этот план в оптимизированный SQL-запрос, специфичный для диалекта конкретного хранилища (Snowflake, BigQuery, Databricks и т.д.).&lt;/li&gt;
&lt;li&gt;Запрос выполняется в хранилище, и результат возвращается пользователю.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;При этом весь сгенерированный SQL доступен для проверки, что обеспечивает &lt;b&gt;прозрачность и объяснимость&lt;/b&gt; вычислений.&lt;/p&gt;
&lt;h3&gt;Основные возможности движка:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Единое определение, выполнение где угодно:&lt;/b&gt; Метрики и измерения определяются один раз, а `MetricFlow` компилирует их в SQL для разных диалектов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Оптимизация производительности:&lt;/b&gt; Движок строит эффективные запросы, чтобы избежать лишних сканирований и снизить нагрузку на хранилище данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Поддержка сложных вычислений:&lt;/b&gt; `MetricFlow` из коробки обрабатывает сложные соединения, оконные функции, расчеты по когортам и полуаддитивные метрики (например, остатки на счетах, которые нельзя просто суммировать по времени).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;`MetricFlow` vs. `dbt Semantic Layer`&lt;/h3&gt;
&lt;p&gt;Важно понимать различие между двумя компонентами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;`MetricFlow`&lt;/b&gt; — это движок с открытым исходным кодом для &lt;b&gt;определения и вычисления&lt;/b&gt; метрик. Это “сердце” системы, которое выполняет всю сложную работу по генерации SQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`dbt Semantic Layer`&lt;/b&gt; — это коммерческий продукт dbt Labs, построенный *поверх* `MetricFlow`. Он добавляет функциональность корпоративного уровня:
&lt;ul&gt;
  &lt;li&gt;Управление доступом (`RBAC`).&lt;/li&gt;
  &lt;li&gt;Версионирование определений метрик.&lt;/li&gt;
  &lt;li&gt;Аудит и отслеживание происхождения данных (`lineage`).&lt;/li&gt;
  &lt;li&gt;Надежные API и коннекторы для интеграции с BI- и AI-инструментами.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Таким образом, `MetricFlow` становится общедоступным строительным блоком, а `dbt Semantic Layer` — готовым решением для его безопасного и управляемого внедрения в компаниях.&lt;/p&gt;
&lt;h3&gt;Итог&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;dbt Labs сделала `MetricFlow` (движок для расчета метрик) полностью открытым под лицензией Apache 2.0.&lt;/b&gt; Это позволяет всем желающим использовать его без ограничений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Главная цель — создать открытый стандарт для определения бизнес-метрик.&lt;/b&gt; Это особенно актуально для AI-систем, которые часто ошибаются при самостоятельной генерации SQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`MetricFlow` позволяет AI и BI-инструментам запрашивать данные по имени метрики (например, `revenue`), получая детерминированный и корректный SQL-запрос.&lt;/b&gt; Это повышает надежность и согласованность данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Этот шаг способствует совместимости инструментов (`interoperability`) и снижает зависимость от конкретного вендора (`vendor lock-in`).&lt;/b&gt; Метрики, определенные один раз, будут работать одинаково в разных системах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Коммерческий продукт `dbt Semantic Layer` продолжит развиваться&lt;/b&gt; как решение для управления жизненным циклом метрик в корпоративной среде (безопасность, контроль версий, аудит).&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Сравнение Apache Iceberg, Delta Lake и Apache Hudi: Глубокий анализ (2025)</title>
<guid isPermaLink="false">291</guid>
<link>https://gavrilov.info/all/sravnenie-apache-iceberg-delta-lake-i-apache-hudi-glubokiy-anali/</link>
<pubDate>Sat, 01 Nov 2025 00:53:55 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/sravnenie-apache-iceberg-delta-lake-i-apache-hudi-glubokiy-anali/</comments>
<description>
&lt;p&gt;С ростом популярности архитектуры &lt;b&gt;Data Lakehouse&lt;/b&gt; усилился интерес к трём основным открытым проектам в этой области: &lt;b&gt;Apache Hudi&lt;/b&gt;, &lt;b&gt;Delta Lake&lt;/b&gt; и &lt;b&gt;Apache Iceberg&lt;/b&gt;. Все три технологии продолжают активно развиваться, и в этой статье представлено актуальное сравнение их возможностей по состоянию на октябрь 2025 года.&lt;/p&gt;
&lt;p&gt;Оригинал тут: &lt;a href="https://www.onehouse.ai/blog/apache-hudi-vs-delta-lake-vs-apache-iceberg-lakehouse-feature-comparison"&gt;https://www.onehouse.ai/blog/apache-hudi-vs-delta-lake-vs-apache-iceberg-lakehouse-feature-comparison&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Примечание:&lt;/b&gt; Если выбор формата вызывает сложности, обратите внимание на проект &lt;b&gt;Apache XTable&lt;/b&gt; (Incubating), который обеспечивает интероперабельность между Hudi, Delta и Iceberg, позволяя использовать несколько форматов одновременно.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Сравнение возможностей&lt;/h3&gt;
&lt;h4&gt;Функциональность записи&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Функция&lt;/td&gt;
&lt;td&gt;Apache Hudi (v1.0.2)&lt;/td&gt;
&lt;td&gt;Delta Lake (v4.0.0)&lt;/td&gt;
&lt;td&gt;Apache Iceberg (v1.10.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;ACID-транзакции&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Copy-on-Write&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Merge-on-Read&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Полнофункциональный&lt;/td&gt;
&lt;td&gt;❌ Векторы удалений (эксперимент.)&lt;/td&gt;
&lt;td&gt;❌ Векторы удалений (огранич.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Эффективная bulk-загрузка&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Bulk_Insert&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Индексирование&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ 8+ типов индексов&lt;/td&gt;
&lt;td style="text-align: left"&gt;❌ Bloom-фильтр проприетарный&lt;/td&gt;
&lt;td&gt;✅ Метаданные для статистики&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Частичные обновления&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Partial Updates&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Миграция таблиц&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Bootstrap&lt;/td&gt;
&lt;td&gt;✅ Convert to Delta&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Управление конкуренцией&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ OCC, MVCC, NBCC&lt;/td&gt;
&lt;td&gt;✅ OCC&lt;/td&gt;
&lt;td&gt;✅ OCC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Неблокирующая конкуренция&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ NBCC&lt;/td&gt;
&lt;td&gt;❌ OCC с перезапуском&lt;/td&gt;
&lt;td&gt;❌ OCC с перезапуском&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Менеджеры блокировок&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ ФС, DynamoDB, Hive, Zookeeper&lt;/td&gt;
&lt;td&gt;✅ Только внешний DynamoDB&lt;/td&gt;
&lt;td&gt;✅ Каталог или внешние провайдеры&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Дедупликация&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Ключи, Precombine&lt;/td&gt;
&lt;td&gt;❌ Нет первичных ключей&lt;/td&gt;
&lt;td&gt;❌ Нет первичных ключей&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Зависимость от каталога&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌ Не требуется&lt;/td&gt;
&lt;td&gt;❌ Не требуется&lt;/td&gt;
&lt;td&gt;✅ Обязателен&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Ключевые отличия:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt; предлагает наиболее продвинутые механизмы управления конкуренцией, включая неблокирующий контроль (NBCC)&lt;/li&gt;
&lt;li&gt;Только &lt;b&gt;Hudi&lt;/b&gt; поддерживает настоящий Merge-on-Read без компромиссов производительности&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt; предоставляет встроенные инструменты для дедупликации через первичные ключи&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Метаданные таблиц&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Функция&lt;/td&gt;
&lt;td&gt;Apache Hudi&lt;/td&gt;
&lt;td&gt;Delta Lake&lt;/td&gt;
&lt;td&gt;Apache Iceberg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Масштабируемость метаданных&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ LSM-дерево + HFile (100x ускорение)&lt;/td&gt;
&lt;td&gt;❌ Parquet чекпойнты (медленно)&lt;/td&gt;
&lt;td&gt;❌ Avro манифесты (медленно)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;b&gt;Управление индексами&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Асинхронное многомодальное&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Эволюция схемы&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Добавление, переупоряд., удаление&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Эволюция партиций&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Кластеризация + индексы выражений&lt;/td&gt;
&lt;td style="text-align: left"&gt;✅ Эволюция партиций&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Первичные ключи&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td style="text-align: right"&gt;❌ Только в проприетарной версии&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Статистика столбцов&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ HFile (до 50x ускорение)&lt;/td&gt;
&lt;td&gt;✅ Parquet чекпойнт&lt;/td&gt;
&lt;td&gt;✅ Avro манифест&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Важные особенности:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt; использует оптимизированный формат HFile для метаданных, что значительно ускоряет поиск&lt;/li&gt;
&lt;li&gt;Только &lt;b&gt;Hudi&lt;/b&gt; поддерживает настоящие первичные ключи как в реляционных БД&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt; предлагает более гибкий подход к партиционированию через кластеризацию&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Функциональность чтения&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Функция&lt;/td&gt;
&lt;td&gt;Apache Hudi&lt;/td&gt;
&lt;td&gt;Delta Lake&lt;/td&gt;
&lt;td&gt;Apache Iceberg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Time Travel&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Merge-on-Read запросы&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Snapshot Query&lt;/td&gt;
&lt;td&gt;❌ Сложная поддержка&lt;/td&gt;
&lt;td&gt;✅ Все запросы мержат векторы удалений&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Инкрементальные запросы&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ + CDC запросы&lt;/td&gt;
&lt;td&gt;✅ CDF (эксперимент.)&lt;/td&gt;
&lt;td&gt;❌ Только аппенды&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CDC запросы&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ + before/after images&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Вторичные индексы&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Предикаты для пропуска данных&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Индексы выражений&lt;/td&gt;
&lt;td&gt;✅ Логические предикаты&lt;/td&gt;
&lt;td&gt;✅ Трансформации таблиц&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Сервисы таблиц&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Функция&lt;/td&gt;
&lt;td&gt;Apache Hudi&lt;/td&gt;
&lt;td&gt;Delta Lake&lt;/td&gt;
&lt;td&gt;Apache Iceberg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Авторазмер файлов&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ Ручное управление&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Компактизация&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Управляемая&lt;/td&gt;
&lt;td&gt;❌ 2-этапное обслуживание&lt;/td&gt;
&lt;td&gt;❌ Ручное обслуживание&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Очистка&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Управляемая&lt;/td&gt;
&lt;td&gt;❌ VACUUM вручную&lt;/td&gt;
&lt;td&gt;❌ Ручное удаление снапшотов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Кластеризация&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ Авто + Z-order/Hilbert&lt;/td&gt;
&lt;td&gt;❌ Z-order в OSS, авто – проприетар.&lt;/td&gt;
&lt;td&gt;❌ Z-order вручную&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Поддержка экосистемы&lt;/h3&gt;
&lt;p&gt;Все три формата имеют широкую поддержку в экосистеме данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Apache Spark, Flink, Trino, DBT&lt;/b&gt; – полная поддержка чтения/записи во всех форматах&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kafka Connect&lt;/b&gt; – Hudi и Iceberg имеют нативную поддержку, Delta – только проприетарную&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Облачные платформы&lt;/b&gt; (AWS, GCP, Azure) – все три формата поддерживаются с некоторыми ограничениями&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Snowflake&lt;/b&gt; – нативная поддержка Iceberg, Hudi через XTable&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Производительность: TPC-DS бенчмарки&lt;/h3&gt;
&lt;p&gt;Согласно независимым тестам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt; и &lt;b&gt;Delta&lt;/b&gt; показывают сопоставимую производительность&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Iceberg&lt;/b&gt; consistently отстаёт по скорости выполнения запросов&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Важно:&lt;/b&gt; При сравнении производительности учитывайте, что Hudi по умолчанию оптимизирован для mutable-нагрузок (upsert), в то время как Delta и Iceberg – для append-only. Для честного сравнения используйте `bulk-insert` режим в Hudi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Ключевые дифференцирующие возможности&lt;/h3&gt;
&lt;h3&gt;Инкрементальные пайплайн&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Hudi&lt;/b&gt; предлагает наиболее зрелую поддержку инкрементальной обработки с трекингом всех изменений (вставки, обновления, удаления) и предоставлением их в виде change streams. Это позволяет строить эффективные ETL-пайплайны без перевычисления полных наборов данных.&lt;/p&gt;
&lt;h3&gt;Управление конкуренцией&lt;/h3&gt;
&lt;p&gt;В то время как все три системы поддерживают оптимистический контроль конкуренции (OCC), только &lt;b&gt;Hudi&lt;/b&gt; предлагает:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Неблокирующий контроль конкуренции (NBCC)&lt;/li&gt;
&lt;li&gt;Файл-уровневую гранулярность блокировок&lt;/li&gt;
&lt;li&gt;Возможность работы с асинхронными сервисами таблиц без остановки записи&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Merge-on-Read&lt;/h3&gt;
&lt;p&gt;Только &lt;b&gt;Hudi&lt;/b&gt; предоставляет полнофункциональный Merge-on-Read, который позволяет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Балансировать между производительностью записи и чтения&lt;/li&gt;
&lt;li&gt;Использовать row-ориентированные форматы для стриминга и column-ориентированные для аналитики&lt;/li&gt;
&lt;li&gt;Выполнять компактизацию асинхронно&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Кластеризация vs Эволюция партиций&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Iceberg&lt;/b&gt;: Partition Evolution – изменение схемы партиционирования для новых данных&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hudi&lt;/b&gt;: Гибридный подход – coarse-grained партиционирование + fine-grained кластеризация с возможностью эволюции без перезаписи данных&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Многомодальное индексирование&lt;/h3&gt;
&lt;p&gt;Только &lt;b&gt;Hudi&lt;/b&gt; предлагает асинхронную подсистему индексирования, поддерживающую:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloom, hash, bitmap, R-tree индексы&lt;/li&gt;
&lt;li&gt;10-100x ускорение point lookup запросов&lt;/li&gt;
&lt;li&gt;10-30x общее ускорение запросов в реальных нагрузках&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Реальные кейсы использования&lt;/h3&gt;
&lt;h3&gt;Peloton&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Увеличение частоты ингестии с 1 раза в день до каждых 10 минут&lt;/li&gt;
&lt;li&gt;Снижение времени выполнения снапшот-заданий с 1 часа до 15 минут&lt;/li&gt;
&lt;li&gt;Экономия затрат через оптимизацию использования EMR-кластеров&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ByteDance/TikTok&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Обработка таблиц объемом 400+ PB&lt;/li&gt;
&lt;li&gt;Ежедневный прирост данных на уровне PB&lt;/li&gt;
&lt;li&gt;Пропускная способность &gt;100 GB/s на таблицу&lt;/li&gt;
&lt;li&gt;Выбор Hudi из-за открытости экосистемы и поддержки глобальных индексов&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Walmart&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Использование Merge-on-Read для снижения задержек&lt;/li&gt;
&lt;li&gt;Нативная поддержка удалений для GDPR/CCPA compliance&lt;/li&gt;
&lt;li&gt;Row versioning для обработки out-of-order данных&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Инновации сообщества&lt;/h3&gt;
&lt;p&gt;Многие ключевые функции data lakehouse были впервые реализованы в Hudi:&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Инновация Hudi&lt;/td&gt;
&lt;td&gt;Год&lt;/td&gt;
&lt;td&gt;Аналог в других проектах&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Транзакционные обновления&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Delta OSS (2019)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge-on-Read&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Iceberg (2021)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Инкрементальные запросы&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Delta Change Feed (2022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z-order/Hilbert кривые&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Delta OSS (2022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Многомодальное индексирование&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;❌ Нет аналогов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Контроль конкуренции без блокировок&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;❌ Нет аналогов&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;h3&gt;Критерии выбора&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Выбирайте Apache Hudi если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ваши workload’ы содержат значительное количество обновлений и удалений&lt;/li&gt;
&lt;li&gt;Требуется низкая задержка от конца в конец&lt;/li&gt;
&lt;li&gt;Нужны продвинутые возможности управления конкуренцией&lt;/li&gt;
&lt;li&gt;Важна производительность point lookup запросов&lt;/li&gt;
&lt;li&gt;Требуется гибкое управление layout данных через кластеризацию&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Рассмотрите Delta Lake если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы используете экосистему Databricks&lt;/li&gt;
&lt;li&gt;Workload’ы преимущественно append-only&lt;/li&gt;
&lt;li&gt;Достаточно базовых возможностей управления конкуренцией&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Apache Iceberg может подойти если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Основная задача – работа с очень большими объемами данных в cloud storage&lt;/li&gt;
&lt;li&gt;Требуется скрытое партиционирование с эволюцией&lt;/li&gt;
&lt;li&gt;Workload’ы в основном аналитические с минимальными обновлениями&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Итоговые рекомендации&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Для зрелых production-нагрузок&lt;/b&gt; с frequent updates, high concurrency и low latency требованиями &lt;b&gt;Apache Hudi&lt;/b&gt; предлагает наиболее полный набор возможностей.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Не ограничивайтесь сравнением “галочек”&lt;/b&gt; – оценивайте производительность на своих данных и workload’ах.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Рассмотрите Apache XTable&lt;/b&gt; если невозможно определиться с одним форматом или требуется интероперабельность между системами.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Учитывайте roadmap проекта&lt;/b&gt; – Hudi продолжает лидировать в инновациях, что может быть важно для долгосрочных инвестиций.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Технологии data lakehouse продолжают быстро развиваться, и выбор должен основываться на конкретных требованиях ваших use cases, а не только на текущем состоянии функциональности.&lt;/p&gt;
</description>
</item>


</channel>
</rss>