<?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 BI</title>
<link>https://gavrilov.info/tags/bi/</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>Распределённые вычисления с Ray и отчетики</title>
<guid isPermaLink="false">334</guid>
<link>https://gavrilov.info/all/raspredelyonnye-vychisleniya-s-ray-i-otchetiki/</link>
<pubDate>Thu, 23 Apr 2026 08:49:14 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/raspredelyonnye-vychisleniya-s-ray-i-otchetiki/</comments>
<description>
&lt;h3&gt;Введение в распределённые вычисления с Ray&lt;/h3&gt;
&lt;p&gt;ПредположенИИе 🤖&lt;/p&gt;
&lt;p&gt;Ray — это унифицированный фреймворк с открытым исходным кодом для масштабирования AI- и Python-приложений. Он предоставляет простой API для создания распределённых приложений, которые могут масштабироваться от одного ноутбука до целого кластера без изменения кода. Ray эффективно обрабатывает разнообразные рабочие нагрузки: от пакетной обработки данных и распределённого обучения моделей до гиперпараметрической оптимизации и serving-а инференса моделей в продакшене. Ray не ограничивается только задачами ML: он также предоставляет Ray Data и потоковые примитивы для эффективных входных пайплайнов, пакетной обработки и онлайн-инференса.&lt;/p&gt;
&lt;h4&gt;Ключевые возможности Ray&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Единый фреймворк&lt;/b&gt;: Одна кодовая база охватывает все этапы жизненного цикла 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;: На некоторых ML-задачах Ray показывает результаты лучше, чем Spark и Dask, а на одном узле — на ~10% быстрее стандартной многопроцессорной обработки Python.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибкость&lt;/b&gt;: Поддержка как stateful (сохраняющих состояние), так и stateless (не сохраняющих состояние) рабочих нагрузок с помощью задач (tasks) и акторов (actors).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Фронтенд для дашбордов: Streamlit и Marimo&lt;/h3&gt;
&lt;p&gt;Для визуализации данных и создания интерактивных дашбордов на Python сегодня доступны два мощных инструмента: проверенный временем Streamlit и современный Marimo.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-23-v-08.46.41.png" width="2130" height="1370" alt="" /&gt;
&lt;/div&gt;
&lt;h4&gt;Streamlit: Классика для data-приложений&lt;/h4&gt;
&lt;p&gt;Streamlit — это open-source Python-библиотека, которая позволяет превратить скрипты анализа данных в полноценные веб-приложения за считанные минуты, без необходимости писать HTML, CSS или JavaScript. Streamlt поддерживает:&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;: Декораторы `st.cache_data` и `st.cache_resource` для оптимизации загрузки данных и управления тяжёлыми объектами (моделями, подключениями к БД).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Многозатраничность&lt;/b&gt;: Возможность создавать приложения с несколькими страницами через папку `pages/`.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Marimo: Реактивная альтернатива&lt;/h4&gt;
&lt;p&gt;Marimo — это реактивный Python-ноутбук нового поколения, который также можно использовать для создания веб-приложений. Главное отличие от Streamlit — реактивная модель выполнения: при изменении одной ячейки или взаимодействии с UI-элементом автоматически пересчитываются только зависимые ячейки, а не весь скрипт. Marimo подходит для сложного исследовательского анализа и интерактивных дашбордов, где важна производительность и детальный контроль выполнения.&lt;/p&gt;
&lt;h4&gt;Сравнение Streamlit и Marimo&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Подход&lt;/b&gt;: Streamlit — это фреймворк для data-приложений, тогда как Marimo — ноутбук-среда, которую можно запускать как приложение.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Производительность&lt;/b&gt;: Marimo часто показывает лучшую производительность, так как перезапускает только зависимые части, в отличие от Streamlit, который выполняет весь скрипт заново при каждом взаимодействии.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сценарии использования&lt;/b&gt;: Streamlt идеален для быстрой разработки надёжных бизнес-дашбордов, а Marimo — для исследовательских задач и сложной аналитики.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Архитектура системы: Ray как бэкенд для дашбордов&lt;/h3&gt;
&lt;p&gt;Рассмотрим практический пример построения масштабируемой системы отчётности, где Ray выступает в роли мощного бэкенда для обработки и serving-а данных, а Streamlit (или Marimo) — в роли фронтенда для визуализации. Код визуализаций хранится в Git, что упрощает версионирование, совместную работу и развёртывание.&lt;/p&gt;
&lt;h4&gt;Основные компоненты&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Бэкенд (Ray)&lt;/b&gt;: Распределённое приложение (деплоймент) на Ray Serve, которое подключается к источнику данных (например, Trino), выполняет сложные агрегации и возвращает результат.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Фронтенд (Streamlit/Marimo)&lt;/b&gt;: Веб-приложение, которое отправляет HTTP-запросы к Ray-бэкенду, получает данные и отображает их в интерактивных дашбордах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Внешнее хранилище состояния (опционально)&lt;/b&gt;: Redis или база данных для хранения состояния сессий пользователей.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git&lt;/b&gt;: Репозиторий для хранения кода фронтенда (Streamlit-скрипты, Marimo-ноутбуки) и конфигураций.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Пример кода: Бэкенд на Ray Serve&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-04-23-v-08.47.14.png" width="2478" height="1666" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import ray
from ray import serve
from fastapi import FastAPI, HTTPException
import trino
import pandas as pd

app = FastAPI()

@serve.deployment(
    ray_actor_options={&amp;quot;num_cpus&amp;quot;: 0.5},
    autoscaling_config={&amp;quot;min_replicas&amp;quot;: 1, &amp;quot;max_replicas&amp;quot;: 2},
)
@serve.ingress(app)
class TrinoQuery:
    def __init__(self):
        self.conn = trino.dbapi.connect(
            host=&amp;quot;192.168.0.125&amp;quot;,
            port=9999,
            user=&amp;quot;jupyter&amp;quot;,
            catalog=&amp;quot;test_warehouse&amp;quot;,
            schema=&amp;quot;test_schema&amp;quot;,
            http_scheme=&amp;quot;http&amp;quot;,
        )
        print(&amp;quot;Соединение с Trino установлено.&amp;quot;)

    @app.get(&amp;quot;/query&amp;quot;)
    async def execute_query(self, query: str):
        if not query:
            raise HTTPException(status_code=400, detail=&amp;quot;Query parameter is required.&amp;quot;)
        try:
            cursor = self.conn.cursor()
            cursor.execute(query)
            rows = cursor.fetchall()
            col_names = [desc[0] for desc in cursor.description]
            df = pd.DataFrame(rows, columns=col_names)
            return df.to_dict(orient=&amp;quot;records&amp;quot;)
        except Exception as e:
            raise HTTPException(status_code=500, detail=str(e))

ray.init(ignore_reinit_error=True)
serve.start(http_options={&amp;quot;host&amp;quot;: &amp;quot;0.0.0.0&amp;quot;, &amp;quot;port&amp;quot;: 8000})
serve.run(TrinoQuery.bind(), blocking=True)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Пример кода: Фронтенд на Streamlit&lt;/h4&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import streamlit as st
import pandas as pd
import requests

BACKEND_URL = &amp;quot;http://127.0.0.1:8000/query&amp;quot;

st.set_page_config(page_title=&amp;quot;Аналитическая панель&amp;quot;, layout=&amp;quot;wide&amp;quot;)
st.title(&amp;quot;Дашборд данных из Trino через Ray&amp;quot;)

with st.sidebar:
    st.header(&amp;quot;Параметры запроса&amp;quot;)
    query = st.text_area(
        &amp;quot;SQL-запрос:&amp;quot;,
        value=&amp;quot;SELECT nationkey, COUNT(*) as cnt FROM test_warehouse.test_schema.my_table1 GROUP BY nationkey&amp;quot;,
        height=200,
    )
    execute_button = st.button(&amp;quot;Выполнить запрос&amp;quot;, type=&amp;quot;primary&amp;quot;)

if execute_button:
    if not query:
        st.warning(&amp;quot;Введите SQL-запрос.&amp;quot;)
    else:
        with st.spinner(&amp;quot;Выполняется запрос через Ray Serve...&amp;quot;):
            try:
                response = requests.get(BACKEND_URL, params={&amp;quot;query&amp;quot;: query}, timeout=30)
                response.raise_for_status()
                data = response.json()
                if data:
                    df = pd.DataFrame(data)
                    st.success(f&amp;quot;Запрос выполнен. Получено строк: {len(df)}&amp;quot;)
                    st.dataframe(df, use_container_width=True)
                    if df.select_dtypes(include='number').shape[1] &amp;gt; 0:
                        st.subheader(&amp;quot;Статистика по числовым колонкам&amp;quot;)
                        st.dataframe(df.describe(), use_container_width=True)
                else:
                    st.info(&amp;quot;Запрос вернул пустой результат.&amp;quot;)
            except Exception as e:
                st.error(f&amp;quot;Ошибка: {e}&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Хранение визуализаций в Git&lt;/h4&gt;
&lt;p&gt;Код фронтенда (Streamlit-скрипты или Marimo-ноутбуки) должен храниться в Git-репозитории. Это обеспечивает:&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;/li&gt;
&lt;li&gt;&lt;b&gt;Автоматизацию развёртывания&lt;/b&gt;: CI/CD пайплайны могут автоматически деплоить новую версию дашборда на сервер при пуше в определённую ветку.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Репозиторий может иметь следующую структуру:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;.
├── app.py                 # Основной файл Streamlit-приложения
├── pages/                 # Дополнительные страницы (если используются)
├── marimo_notebooks/      # Marimo-ноутбуки (если используются)
├── requirements.txt       # Зависимости
├── .gitignore
└── README.md&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Управление состоянием: как построить систему отчётов&lt;/h3&gt;
&lt;p&gt;В распределённой системе, где множество пользователей одновременно обращаются к дашборду, а сам бэкенд масштабируется на множество реплик, управление состоянием (state management) становится критически важным. Ошибка может привести к тому, что пользователь увидит чужие данные или потеряет свой прогресс в сессии.&lt;/p&gt;
&lt;h4&gt;Stateless vs. Stateful: Основной выбор&lt;/h4&gt;
&lt;p&gt;Ray поддерживает оба подхода:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Stateless бэкенд (рекомендуемый)&lt;/b&gt;: Бэкенд не хранит состояние пользователей. Вся сессионная информация (например, результаты фильтрации, текущая страница) хранится во фронтенде или во внешнем хранилище. Любая реплика Ray может обработать любой запрос. Это делает систему простой и отказоустойчивой, но требует, чтобы состояние было “лёгким” (например, хранилось в cookies или `session_state`).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stateful бэкенд&lt;/b&gt;: Бэкенд хранит состояние в своей памяти. В этом случае необходимо обеспечить, чтобы все запросы от одного пользователя направлялись на одну и ту же реплику (sticky sessions).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Рекомендуемая архитектура: Stateless бэкенд + Session State во фронтенде&lt;/h4&gt;
&lt;p&gt;Для большинства BI-дашбордов идеальна следующая схема:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Бэкенд (Ray)&lt;/b&gt;: Полностью stateless. Он принимает запрос, выполняет вычисления и возвращает результат. Он не помнит, какие запросы делал пользователь ранее.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Фронтенд (Streamlit/Marimo)&lt;/b&gt;: Хранит состояние сессии локально. В Streamlit для этого используется `st.session_state`. Например, вы можете сохранить в `session_state` фильтры, выбранные пользователем, чтобы они применялись при каждом взаимодействии.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Внешнее хранилище&lt;/b&gt;: Для кэширования результатов тяжёлых запросов или для хранения общего состояния (например, результатов обучения модели) используйте Redis или базу данных.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Если требуется Stateful бэкенд (например, кэш в памяти реплики)&lt;/h4&gt;
&lt;p&gt;Иногда возникает необходимость, чтобы бэкенд хранил какое-то состояние для повышения производительности. Например, каждая реплика может загружать большую модель машинного обучения в свою память. В таком случае используется подход &lt;b&gt;Soft Session Affinity&lt;/b&gt;: все запросы от одного пользователя направляются на одну и ту же реплику, используя уникальный ключ (`X-SERVE-SHARD-KEY`).&lt;/p&gt;
&lt;h4&gt;Сценарий: Долгоживущий отчёт (Report as a Service)&lt;/h4&gt;
&lt;p&gt;Рассмотрим сценарий, где бизнес-пользователь хочет “заказать” отчёт, который генерируется 10 минут, и вернуться за ним через час. Stateless архитектура здесь не подойдёт, так как бэкенд “забудет” о задаче.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Stateful бэкенд (Ray Actor)&lt;/b&gt;: Используется долгоживущий Ray Actor (актор), который хранит состояние задачи и её результат.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Хранилище задач&lt;/b&gt;: База данных (например, PostgreSQL) используется для хранения информации о задаче (статус, результат). Актор периодически обновляет статус.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Фронтенд&lt;/b&gt;: Пользователь запускает задачу, получает её `task_id`, а затем периодически опрашивает эндпоинт `GET /task/{task_id}/status`, который возвращает статус и, при готовности, результат.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Преимущества использования Ray в архитектуре отчётов&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Масштабируемость под нагрузку&lt;/b&gt;: Ray может автоматически масштабировать количество реплик бэкенда в зависимости от количества запросов. Если вашим дашбордом пользуется 10 или 10 000 человек, Ray адаптируется.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Производительность&lt;/b&gt;: Ray оптимизирован для параллельных вычислений и может обрабатывать большие объёмы данных быстрее, чем традиционные инструменты.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Единая кодовая база&lt;/b&gt;: Вы можете использовать Ray не только для serving-а данных, но и для их предварительной обработки, обучения моделей и т.д. Это упрощает инфраструктуру.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Отказоустойчивость&lt;/b&gt;: Ray автоматически перезапускает упавшие реплики, обеспечивая высокую доступность ваших дашбордов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибкость управления ресурсами&lt;/b&gt;: Вы можете точно указать, сколько CPU и GPU нужно выделить для каждого компонента системы.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Ray, Streamlit и Marimo образуют мощный тандем для построения современных систем отчётности и аналитики. Ray обеспечивает масштабируемый и производительный бэкенд, способный обрабатывать большие объёмы данных. Streamlit и Marimo предоставляют удобные средства для создания интерактивных и красивых дашбордов, а Git гарантирует контроль версий и простоту развёртывания. Ключом к успешной архитектуре является правильный выбор стратегии управления состоянием: в большинстве случаев подходит stateless бэкенд с хранением состояния во фронтенде, что обеспечивает простоту и отказоустойчивость. Для более сложных сценариев (долгие задачи, кэширование моделей) можно использовать stateful подход с Ray акторами и внешним хранилищем.&lt;/p&gt;
&lt;p&gt;Если вы хотите увидеть полный рабочий пример с кодом, архитектурной схемой и инструкцией по развёртыванию, дайте знать — я подготовлю подробный гайд.&lt;/p&gt;
</description>
</item>

<item>
<title>Новая эра трансформации данных: dbt против Bruin и aaC</title>
<guid isPermaLink="false">272</guid>
<link>https://gavrilov.info/all/novaya-era-transformacii-dannyh-dbt-protiv-bruin-i-aac/</link>
<pubDate>Sat, 23 Aug 2025 16:04:02 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/novaya-era-transformacii-dannyh-dbt-protiv-bruin-i-aac/</comments>
<description>
&lt;p&gt;В мире данных произошла тихая, но фундаментальная революция. На смену традиционному подходу &lt;b&gt;ETL (Extract, Transform, Load)&lt;/b&gt;, где данные преобразовывались до загрузки в хранилище, пришла новая парадигма — &lt;b&gt;ELT (Extract, Load, Transform)&lt;/b&gt;. Благодаря мощности современных облачных хранилищ (таких как Snowflake, BigQuery, Databricks, Starburst\Trino) стало выгоднее сначала загружать сырые данные, а уже затем трансформировать их непосредственно в хранилище.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/demo.gif" width="1200" height="900" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Этот сдвиг породил потребность в инструментах, которые специализируются на последнем шаге — трансформации (T). Именно в этой нише dbt (data build tool) стал безоговорочным лидером, но на его поле появляются и новые сильные игроки, такие как Bruin. Давайте разберемся, что это за инструменты, какой подход они олицетворяют и в чем их ключевые различия.&lt;/p&gt;
&lt;h4&gt;Подход «Аналитика как код»&lt;/h4&gt;
&lt;p&gt;И dbt, и Bruin являются яркими представителями движения &lt;b&gt;“Analytics as Code”&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;Версионирование:&lt;/b&gt; Все трансформации данных описываются в виде кода (в основном SQL), который хранится в системе контроля версий, такой как Git. Это позволяет отслеживать изменения, совместно работать и откатываться к предыдущим версиям.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Модульность и переиспользование (DRY – Don’t Repeat Yourself):&lt;/b&gt; Сложные трансформации разбиваются на небольшие, логически завершенные модели, которые могут ссылаться друг на друга. Это делает код чище, понятнее и позволяет повторно использовать уже написанную логику.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Тестирование:&lt;/b&gt; Код трансформаций должен быть протестирован. Инструменты позволяют автоматически проверять качество данных после преобразований: на уникальность ключей, отсутствие `NULL` значений, соответствие заданным условиям и т.д.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Документация и прозрачность:&lt;/b&gt; Процесс трансформации становится самодокументируемым. Инструменты могут автоматически генерировать документацию и строить графы зависимостей моделей (data lineage), показывая, как данные текут и преобразуются от источника к конечному виду. &lt;a href="https://www.element61.be/en/resource/when-use-dbt-or-delta-live-tables"&gt;element61.be&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CI/CD (Continuous Integration / Continuous Deployment):&lt;/b&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;“Черные ящики” ETL:&lt;/b&gt; Заменяют сложные, трудноподдерживаемые и непрозрачные ETL-процессы на понятный и документированный код.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Рассинхронизация команд:&lt;/b&gt; Стирают границы между инженерами данных и аналитиками, позволяя аналитикам, владеющим SQL, самостоятельно создавать надежные модели данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Низкое качество данных:&lt;/b&gt; Встроенные механизмы тестирования помогают обеспечить надежность и согласованность данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;dbt (data build tool): Золотой стандарт трансформации&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;dbt&lt;/b&gt; — это инструмент с открытым исходным кодом, который позволяет аналитикам и инженерам трансформировать данные в их хранилищах с помощью простых SQL-запросов. Важно понимать, что dbt &lt;b&gt;не извлекает и не загружает данные&lt;/b&gt;. Он специализируется исключительно на шаге &lt;b&gt;“T”&lt;/b&gt; в ELT  &lt;a href="https://vutr.substack.com/p/why-is-dbt-so-popular"&gt;vutr.substack.com&lt;/a&gt;. &lt;a href="https://github.com/dbt-labs/dbt-core"&gt;dbt git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Он работает как компилятор и исполнитель: вы пишете модели данных в `.sql` файлах, используя шаблонизатор Jinja для добавления логики (циклы, условия, макросы). Затем dbt компилирует этот код в чистый SQL и выполняет его в вашем хранилище данных &lt;a href="https://www.element61.be/en/resource/when-use-dbt-or-delta-live-tables"&gt;element61.be&lt;/a&gt;.&lt;/p&gt;
&lt;h5&gt;Плюсы dbt&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Огромное сообщество и экосистема:&lt;/b&gt; dbt стал де-факто стандартом индустрии. Существует огромное количество статей, курсов, готовых пакетов (библиотек) и экспертов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Фокус на SQL:&lt;/b&gt; Низкий порог входа для аналитиков, которые уже знают 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; Инструмент проверен временем и используется тысячами компаний по всему миру.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибкость:&lt;/b&gt; Благодаря шаблонизатору Jinja можно создавать очень сложные и переиспользуемые макросы, адаптируя dbt под любые нужды.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Минусы dbt&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Только трансформация:&lt;/b&gt; dbt не занимается извлечением (E) и загрузкой (L). Для этого вам понадобятся отдельные инструменты (например, Fivetran, Airbyte), что усложняет стек технологий.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кривая обучения:&lt;/b&gt; Хотя основы просты, освоение продвинутых возможностей Jinja, макросов и структуры проекта требует времени.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Зависимость от Python-моделей:&lt;/b&gt; Хотя недавно появилась поддержка моделей на Python, она все еще не так нативна и проста, как основной SQL-подход, и требует дополнительных настроек.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Bruin Data: Универсальный боец&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Bruin&lt;/b&gt; — это более новый игрок на рынке, который позиционирует себя как инструмент для создания “end-to-end” пайплайнов данных. В отличие от dbt, он не ограничивается только трансформацией, а стремится охватить больше этапов работы с данными, включая их загрузку (ingestion) &lt;a href="https://github.com/bruin-data/bruin"&gt;https://github.com/bruin-data/bruin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bruin разделяет ту же философию “Analytics as Code”, но предлагает более интегрированный опыт, где SQL и Python являются равноправными гражданами.&lt;/p&gt;
&lt;h5&gt;Плюсы Bruin&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Универсальность:&lt;/b&gt; Один инструмент для определения всего пайплайна: от загрузки из источников до финальных витрин данных. Это может упростить стек технологий.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Нативная поддержка SQL и Python:&lt;/b&gt; Позволяет легко комбинировать задачи на разных языках в одном пайплайне без дополнительных настроек. Это идеально для задач, где чистый SQL громоздок (например, работа с API, машинное обучение).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Простота конфигурации:&lt;/b&gt; Зачастую требует меньше шаблонного кода (boilerplate) для определения ассетов и пайплайнов по сравнению с dbt.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Встроенное качество данных:&lt;/b&gt; Как и dbt, делает акцент на проверках качества на каждом шаге.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Минусы Bruin&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt; Пока маленькое сообщество:&lt;/b&gt; Как у нового инструмента, у Bruin гораздо меньше пользователей, готовых решений и обсуждений на форумах по сравнению с dbt. Найти помощь или готовый пакет для решения специфической задачи сложнее.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Незрелость:&lt;/b&gt; Инструмент моложе, а значит, наверное, потенциально менее стабилен и может иметь меньше интеграций по сравнению с проверенным dbt. Пока нет облачных функция за деньги. Я так думал, но все же есть &lt;a href="https://getbruin.com."&gt;https://getbruin.com.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;“Мастер на все руки — эксперт ни в чем?”:&lt;/b&gt; Стремление охватить все этапы (E, L, T) может означать, что в каждом отдельном компоненте Bruin может уступать лучшим в своем классе специализированным инструментам (например, Fivetran в загрузке, dbt в трансформации), но это конечно субъективно.&lt;/li&gt;
&lt;/ul&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;dbt (data build tool)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Bruin Data&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;Трансформация (T в ELT)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Весь пайплайн (E, L, T)&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;SQL с шаблонизатором Jinja&lt;/td&gt;
&lt;td style="text-align: center"&gt;SQL и Python как равноправные&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;Маленькая, развивающаяся&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;Низкая/Средняя&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;Требует отдельных E/L инструментов&lt;/td&gt;
&lt;td style="text-align: center"&gt;Стремится быть самодостаточным&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Итого&lt;/h4&gt;
&lt;p&gt;Выбор между dbt и Bruin — это выбор между двумя стратегиями построения современного стека данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Выбирайте dbt, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы строите гибкий стек из лучших в своем классе инструментов (“best-of-breed”): один для загрузки, другой для хранения, третий для трансформации.&lt;/li&gt;
&lt;li&gt;Ваша команда в основном состоит из аналитиков, сильных в SQL.&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;p&gt;&lt;b&gt;Выбирайте Bruin, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы предпочитаете единый, интегрированный инструмент для управления всеми пайплайнами, чтобы упростить архитектуру&lt;/li&gt;
&lt;li&gt;Вы любите open source и End-to-end дата framework: фор data ingestion + transformations + кволити. :)&lt;/li&gt;
&lt;li&gt;Ваши пайплайны требуют тесной связки SQL и Python для трансформаций (например, обогащение данных через вызовы API или модели ML).&lt;/li&gt;
&lt;li&gt;Вы начинаете новый проект или работаете в небольшой команде и цените скорость настройки и меньшее количество движущихся частей.&lt;/li&gt;
&lt;li&gt;Вы Go’шник :) –  Bruin написан на Go почти на 100%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И dbt, и Bruin — мощные инструменты, воплощающие современные подходы к инженерии данных. dbt предлагает проверенный, сфокусированный и невероятно мощный движок для трансформаций, ставший стандартом. Bruin же предлагает более универсальный и интегрированный подход, который может быть привлекателен для команд, стремящихся к простоте и нативной поддержке Python.&lt;/p&gt;
&lt;h4&gt;А что такое “Аналитика как код” (Analytics as Code, AaC)?&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Аналитика как код&lt;/b&gt; — это подход к управлению аналитическими процессами, при котором все компоненты аналитики — от моделей данных и метрик до отчетов и правил доступа — определяются в виде кода в человекочитаемых файлах. Эти файлы затем управляются так же, как исходный код любого другого программного обеспечения: с помощью систем контроля версий, автоматизированного тестирования и развертывания &lt;a href="https://medium.com/gooddata-developers/analytics-as-code-managing-analytics-solutions-like-any-other-software-504372ba6a61"&gt;medium.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Самая близкая и известная аналогия — это &lt;b&gt;Infrastructure as Code (IaC)&lt;/b&gt;. Как IaC (например, с помощью Terraform) позволил инженерам описывать серверы, сети и базы данных в коде вместо ручной настройки через веб-интерфейсы, так и AaC позволяет описывать в коде всё, что связано с данными &lt;a href="https://medium.com/@terezacihelkova/analytics-as-code-what-is-it-and-how-does-it-help-you-93e9a3c179ee"&gt;medium.com&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Идея проста и убедительна: “настройте свои системы один раз, выразите это в виде кода, а затем поместите в систему контроля версий” &lt;a href="https://www.holistics.io/blog/analytics-as-code/"&gt;holistics.io&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Проблема: Как было раньше?&lt;/h4&gt;
&lt;p&gt;Чтобы понять ценность AaC, нужно посмотреть на проблемы, которые он решает. В традиционном подходе аналитика часто была разрозненной и хрупкой:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Логика в “черных ящиках”:&lt;/b&gt; Сложные преобразования данных были скрыты внутри GUI-интерфейсов старых ETL-инструментов или непосредственно в настройках BI-платформы (например, Tableau, Power BI). Никто, кроме автора, не мог легко понять, как рассчитывается та или иная метрика.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Разрозненные SQL-скрипты:&lt;/b&gt; Аналитики хранили важные SQL-запросы на своих локальных машинах, в общих папках или на wiki-страницах. Не было единой версии правды, код дублировался и быстро устаревал.&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;Этот хаос приводил к главному — &lt;b&gt;недоверию к данным&lt;/b&gt;. Никто не мог быть уверен, что цифры в дашборде верны.&lt;/p&gt;
&lt;h4&gt;Ключевые принципы “Аналитики как код”&lt;/h4&gt;
&lt;p&gt;AaC решает эти проблемы, внедряя практики из мира разработки ПО.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Декларативное определение:&lt;/b&gt; Все аналитические артефакты описываются в файлах.
&lt;ul&gt;
  &lt;li&gt;Модели данных:** `SELECT * FROM ...` в `.sql` файлах.&lt;/li&gt;
  &lt;li&gt;Тесты:** `not_null`, `unique` в `.yml` файлах.&lt;/li&gt;
  &lt;li&gt;Документация:** Описания таблиц и полей в `.yml` файлах.&lt;/li&gt;
  &lt;li&gt;Метрики и дашборды:** Определения в `.yml` или специализированных файлах &lt;a href="https://medium.com/gooddata-developers/analytics-as-code-managing-analytics-solutions-like-any-other-software-504372ba6a61"&gt;medium.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Контроль версий (Git):&lt;/b&gt; Весь код хранится в репозитории (например, на GitHub или GitLab).
&lt;ul&gt;
  &lt;li&gt;Прозрачность:** Каждое изменение — это `commit` с понятным описанием.&lt;/li&gt;
  &lt;li&gt;Совместная работа:** Аналитики работают в отдельных ветках, а изменения вносятся через `Pull Request` (или `Merge Request`), что позволяет проводить ревью кода (code review).&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; Тесты являются неотъемлемой частью кода. Они запускаются автоматически при каждом изменении, чтобы гарантировать, что данные по-прежнему соответствуют ожиданиям (например, `user_id` всегда уникален и не равен `NULL`).&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;CI/CD (Непрерывная интеграция и развертывание):&lt;/b&gt; Процессы полностью автоматизированы.
&lt;ul&gt;
  &lt;li&gt;Когда аналитик вносит изменения в `Pull Request`, автоматически запускаются тесты.&lt;/li&gt;
  &lt;li&gt;После одобрения и слияния ветки изменения автоматически развертываются в продуктивной среде (например, dbt Cloud или Jenkins запускает команду `dbt run`).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Модульность и переиспользование (DRY – Don’t Repeat Yourself):&lt;/b&gt; Сложные потоки данных разбиваются на небольшие, логичные и переиспользуемые модели. Одна модель может ссылаться на другую, создавая четкий граф зависимостей (lineage), который можно визуализировать.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Преимущества подхода AaC&lt;/h4&gt;
&lt;p&gt;Принятие этой философии дает компании ощутимые выгоды:&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;/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; AaC дает возможность аналитикам, владеющим SQL, самостоятельно создавать надежные и протестированные модели данных, не дожидаясь инженеров данных. Это стирает барьеры между командами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В конечном итоге, “Аналитика как код” — это культурный сдвиг, который превращает аналитику из ремесленного занятия в зрелую инженерную дисциплину, обеспечивая скорость, надежность и масштабируемость, необходимые современному бизнесу.&lt;/p&gt;
</description>
</item>

<item>
<title>Эволюция бизнес-аналитики: от монолитной к компонуемой архитектуре</title>
<guid isPermaLink="false">193</guid>
<link>https://gavrilov.info/all/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt/</link>
<pubDate>Thu, 13 Feb 2025 01:23:28 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt/</comments>
<description>
&lt;p&gt;Перевод: &lt;a href="https://www.pracdata.io/p/the-evolution-of-business-intelligence-stack"&gt;https://www.pracdata.io/p/the-evolution-of-business-intelligence-stack&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-132.png" width="1336" height="944" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;По мере того, как мы вступаем в 2025 год, область инженерии данных продолжает свою стремительную эволюцию. В этой серии мы рассмотрим преобразующие тенденции, меняющие ландшафт инженерии данных, от новых архитектурных шаблонов до новых подходов к инструментарию.&lt;/p&gt;
&lt;p&gt;Это первая часть нашей серии, посвященная эволюции архитектуры бизнес-аналитики (BI).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Введение&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ландшафт бизнес-аналитики (BI) претерпел значительные преобразования в последние годы, особенно в том, как данные представляются и обрабатываются.&lt;/p&gt;
&lt;p&gt;Эта эволюция отражает более широкий переход от монолитных архитектур к более гибким, компонуемым решениям, которые лучше отвечают современным аналитическим потребностям.&lt;/p&gt;
&lt;p&gt;В этой статье прослеживается эволюция BI-архитектуры через несколько ключевых этапов: от традиционных монолитных систем, через появление безголовой (headless) и бездонной (bottomless**) BI, до последних разработок в области BI-as-Code и встроенной аналитики.&lt;/p&gt;
&lt;p&gt;** 😂 👯‍♀️&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt.png" width="2156" height="222" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Если серьезно, то наверное лучший вариант бескрайний&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Традиционная BI-архитектура: Монолитный подход&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Традиционные BI-инструменты были построены как комплексные, тесно связанные системы со значительным акцентом на дизайне пользовательского интерфейса.&lt;/p&gt;
&lt;p&gt;Эти системы обеспечивали обширную гибкость благодаря функциональности “кликай и смотри” для нарезки, разделения и группировки данных с использованием различных визуализаций. В своей основе эти системы состояли из трех взаимосвязанных компонентов, которые работали в гармонии для предоставления бизнес-аналитики.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-133.png" width="473" height="487" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;*Традиционный BI-стек*&lt;/p&gt;
&lt;p&gt;Серверный уровень служил основой, обрабатывая прием данных из источников OLAP и создавая оптимизированные кубы данных на сервере. Эти кубы содержали предварительно вычисленные измерения, которые позволяли исследовать данные в режиме реального времени.&lt;/p&gt;
&lt;p&gt;Работая совместно с серверной частью, клиентский уровень предоставлял интерфейс визуализации, подключаясь к серверной части для доступа к кубам данных и построения панелей мониторинга.&lt;/p&gt;
&lt;p&gt;Семантический уровень завершал архитектуру, определяя ключевые показатели эффективности (KPI) и метрики, встроенные в BI-программное обеспечение.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Недостатки традиционных BI-инструментов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Хотя эти традиционные системы были мощными, они имели значительные накладные расходы.&lt;/p&gt;
&lt;p&gt;Организациям требовалась существенная инфраструктура для локального развертывания до того, как управляемые облачные BI-сервисы стали более доступными, а стоимость лицензирования часто была непомерно высокой.&lt;/p&gt;
&lt;p&gt;Сроки реализации были длительными, даже демонстрации концепции требовали недель настройки и конфигурации. Для предприятий, обслуживающих большую пользовательскую базу, требования к ресурсам были особенно высокими.&lt;/p&gt;
&lt;p&gt;Эти фундаментальные ограничения в сочетании с растущей потребностью в гибкости и экономичности вызвали серию архитектурных инноваций в области BI.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Появление бездонных (Bottomless) BI-инструментов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;В ответ на эти вызовы появилось новое поколение легких, дезагрегированных BI-инструментов. Заметные решения с открытым исходным кодом, такие как Apache Superset, Metabase и Redash, начали появляться около десяти лет назад, причем Superset, первоначально разработанный в Airbnb, приобрел особую известность в экосистеме.&lt;/p&gt;
&lt;p&gt;Эти новые инструменты приняли “безднную” архитектуру, устранив тяжелый серверный уровень, традиционно используемый для вычислений, построения и кеширования объектов куба.&lt;/p&gt;
&lt;p&gt;Вместо того чтобы поддерживать свой собственный вычислительный уровень, они полагаются на подключенные исходные движки для запроса и предоставления данных на панели мониторинга во время выполнения. Этот архитектурный сдвиг вводит различные стратегии для обслуживания данных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-134.png" width="1456" height="1147" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Работа с задержкой запросов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Отсутствие сервера отчетов представляет собой серьезную проблему для бездонных BI-инструментов: управление задержкой запросов при доступе к данным в режиме реального времени.&lt;/p&gt;
&lt;p&gt;Чтобы решить эту проблему, эти инструменты используют несколько стратегий оптимизации. Один из ключевых подходов включает использование предварительно вычисленных агрегатов, хранящихся в основном хранилище данных, что позволяет панелям мониторинга эффективно предоставлять результаты.&lt;/p&gt;
&lt;p&gt;Кроме того, такие инструменты, как Superset, реализуют уровни кеширования с использованием Redis для хранения часто используемых наборов данных. Этот механизм кеширования оказывается особенно эффективным: после того, как первоначальный запрос загружает набор данных, последующие визуализации и перезагрузки панели мониторинга могут обращаться к кешированной версии до тех пор, пока не изменятся базовые данные, что значительно сокращает время отклика.&lt;/p&gt;
&lt;p&gt;Для компаний, работающих с большими объемами данных, интеграция со специализированными OLAP-движками реального времени, такими как Druid и ClickHouse, обеспечивает аналитические возможности с низкой задержкой.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-135.png" width="1339" height="1173" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Появление универсального семантического слоя&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;По мере того, как отрасль стремилась к большей гибкости в своем BI-стеке, переносимый семантический слой, или то, что известно как безголовая (headless) BI, появился в качестве промежуточного шага между традиционными монолитными системами и полностью легкими решениями.&lt;/p&gt;
&lt;p&gt;Платформы безголовой BI предоставляют выделенный семантический слой, а некоторые объединяют движок запросов, позволяя организациям использовать любой инструмент визуализации по своему выбору. Этот подход полностью отделяет уровень представления (фронтенд) от семантического слоя.&lt;/p&gt;
&lt;p&gt;С помощью таких инструментов, как Cube и MetricFlow (теперь часть dbt Labs), например, организации могут определять свои метрики и модели данных в центральном месте, а затем подключать различные инструменты визуализации, пользовательские приложения или легкие BI-решения к этому семантическому слою.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-136.png" width="542" height="755" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Этот архитектурный шаблон предлагает несколько преимуществ по сравнению с традиционными BI-системами. Он позволяет организациям поддерживать согласованные определения метрик в различных инструментах визуализации, поддерживает несколько интерфейсных приложений одновременно и обеспечивает лучшие возможности интеграции с современными стеками данных.&lt;/p&gt;
&lt;p&gt;Семантический слой действует как универсальный переводчик между источниками данных и уровнями визуализации, обеспечивая согласованную бизнес-логику во всех аналитических приложениях.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Движение BI-as-Code&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;В последние годы наблюдается появление BI-as-Code, представляющего собой еще более легкий подход к разработке панелей мониторинга и интерактивных приложений для работы с данными.&lt;/p&gt;
&lt;p&gt;Этот сдвиг парадигмы привносит рабочие процессы разработки программного обеспечения в разработку BI, позволяя использовать контроль версий, тестирование и методы непрерывной интеграции. Поскольку код служит основной абстракцией, а не пользовательским интерфейсом, разработчики могут реализовывать правильные рабочие процессы разработки перед развертыванием в производственной среде.&lt;/p&gt;
&lt;p&gt;Известные инструменты в этой области, такие как Streamlit, легко интегрируются с экосистемой Python, позволяя разработчикам оставаться в рамках своих проектов Python без необходимости установки внешнего программного обеспечения для создания панелей мониторинга и приложений для работы с данными.&lt;/p&gt;
&lt;p&gt;Этот подход делает упор на простоту и скорость, используя SQL и декларативные инструменты, такие как YAML, для создания панелей мониторинга. Полученные веб-приложения можно легко разместить самостоятельно, обеспечивая гибкость развертывания.&lt;/p&gt;
&lt;p&gt;Хотя Streamlit лидирует по популярности, в последние годы появились новые решения с открытым исходным кодом, такие как Evidence, Rill, Vizro и Quary, каждое из которых привносит свой собственный подход к концепции BI-as-Code.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-137.png" width="688" height="745" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Ограничения BI-as-Code&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Инструменты BI-as-Code в настоящее время имеют ограничения с точки зрения интерактивных функций исследования данных и предоставления BI-возможностей корпоративного уровня.&lt;/p&gt;
&lt;p&gt;Они не обеспечивают тот же пользовательский опыт для нарезки и разделения данных, что и традиционные BI-инструменты, и им не хватает поддержки управления данными и семантического слоя, которые есть как в традиционных, так и в легких BI-решениях.&lt;/p&gt;
&lt;p&gt;Тем не менее, BI-as-Code все чаще используется различными способами, например, командами специалистов по обработке данных, создающими интерактивные автономные приложения, командами разработчиков продуктов, создающими встроенные функции аналитики, и аналитиками, разрабатывающими внутренние приложения для работы с данными.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая развивающаяся тенденция: BI + Встроенная аналитика&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Последняя эволюция в BI-архитектуре включает интеграцию высокопроизводительных встраиваемых OLAP-движков запросов, таких как Apache DataFusion и DuckDB.&lt;/p&gt;
&lt;p&gt;Этот подход устраняет несколько пробелов в текущем ландшафте, сохраняя при этом преимущества легких, дезагрегированных архитектур.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-138.png" width="1209" height="1094" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Новая полнофункциональная компонуемая BI-архитектура дает несколько ключевых преимуществ:&lt;/p&gt;
&lt;p&gt;Во-первых, она предлагает настоящую компонуемость и совместимость с возможностью замены встроенных вычислительных движков по мере необходимости, сохраняя при этом автономный семантический слой для определения метрик.&lt;/p&gt;
&lt;p&gt;Возможности встроенной аналитики особенно мощны благодаря интеграции без копирования через стандартные фреймворки, в основном Apache Arrow, обеспечивающей доступ к данным на уровне микросекунд через оптимизированные столбчатые форматы в памяти.&lt;/p&gt;
&lt;p&gt;Интеграция без копирования относится к методу оптимизации производительности, при котором доступ к данным и их обработка могут осуществляться без необходимости сериализации и преобразования данных между различными представлениями в памяти. В контексте DataFusion и Apache Arrow это означает, что когда данные загружаются в память в столбчатом формате Arrow, DataFusion может напрямую выполнять вычисления с этими данными без необходимости их преобразования или копирования во внутренний формат.&lt;/p&gt;
&lt;p&gt;Прямая поддержка озер данных и lakehouse представляет собой еще один значительный шаг вперед, позволяя командам создавать панели мониторинга непосредственно поверх открытых табличных форматов, таких как Apache Iceberg и Apache Hudi, без промежуточного перемещения данных.&lt;/p&gt;
&lt;p&gt;Эта возможность в сочетании с комплексной поддержкой федеративных запросов решает давнюю проблему в существующих легких BI-инструментах, которые с трудом эффективно объединяли данные из нескольких источников без необходимости использования внешнего движка федеративных запросов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Внедрение в отрасли&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Внедрение встраиваемых движков запросов в отрасли набирает обороты в экосистеме BI.  Коммерческие поставщики возглавляют эту трансформацию: Omni интегрировала DuckDB в качестве своего основного аналитического движка, в то время как Cube.dev реализовала сложное сочетание Apache Arrow и DataFusion в своей безголовой BI-архитектуре.&lt;/p&gt;
&lt;p&gt;Аналогичным образом, GoodData приняла эту тенденцию, реализовав Apache Arrow в качестве основы уровня кеширования своей системы FlexQuery, а Preset (Managed Superset) интегрировалась с MotherDuck (Managed DuckDB).&lt;/p&gt;
&lt;p&gt;В области открытого исходного кода и Superset (с использованием библиотеки duckdb-engine), и Metabase теперь поддерживают встроенное подключение DuckDB с потенциальной будущей интеграцией в их основные движки.&lt;/p&gt;
&lt;p&gt;Движение BI-as-Code также приняло встраиваемые движки. Rilldata объявила об интеграции DuckDB в 2023 году для автоматического профилирования и интерактивного моделирования при разработке панелей мониторинга, в то время как Evidence представила &lt;a href="https://evidence.dev/blog/why-we-built-usql"&gt;Universal SQL в 2024 году&lt;/a&gt;, основанный на реализации WebAssembly от DuckDB.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Заключение&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ландшафт бизнес-аналитики продолжает развиваться в сторону более гибких и эффективных решений.&lt;/p&gt;
&lt;p&gt;Каждое архитектурное изменение принесло явные преимущества: безголовая BI обеспечила согласованность метрик между инструментами, бездонная BI снизила сложность инфраструктуры, BI-as-Code привнесла рабочие процессы разработчиков в аналитику, а встроенные движки теперь объединяют эти преимущества с высокопроизводительными возможностями запросов.&lt;/p&gt;
&lt;p&gt;Интеграция встраиваемых движков запросов с легкими BI-инструментами представляет собой перспективное направление для реализации легкой BI, объединяющее лучшие аспекты традиционных BI-возможностей с современными архитектурными шаблонами. По мере развития этих технологий и роста экосистемы компании могут рассчитывать на все более сложные, но компонуемые решения для своих аналитических потребностей.&lt;/p&gt;
</description>
</item>


</channel>
</rss>