Yandex DataLens поверх ClickHouse: BI без лицензионного кошмара
Клиент хочет BI поверх ClickHouse без дорогих лицензий. Разворачиваем Yandex DataLens, подключаем ClickHouse напрямую, строим дашборды операционной аналитики за пару дней.
Yandex DataLens публично запускается в 2020 году как BI-инструмент в составе Yandex Cloud с нативной поддержкой ClickHouse
Пришёл запрос от клиента, который сформулировал задачу примерно так: «У нас ClickHouse, в него льются данные из нескольких источников, аналитики хотят дашборды. Tableau нам выставили цену - мы чуть не упали. Power BI - только через облачный тенант Microsoft, а данные из России уходить не должны. Что делать?». Вопрос справедливый, выбор на рынке в таком раскладе небольшой.
Как раз в этот момент Yandex DataLens вышел в публичный доступ как часть Yandex Cloud. Мы видели его раньше в закрытом бета-тесте, представление было. Решили попробовать на этом кейсе - вполне рабочий повод.
Что за клиент и что за данные
Средний e-commerce: несколько магазинов, онлайн и офлайн каналы, собственная логистика. ClickHouse поднят на dedicated-серверах, туда через ETL прилетают данные из CRM, из 1С, из онлайн-кассы и из веб-аналитики. Объём - не петабайты, несколько сотен миллионов строк, но запросы аналитиков бывают тяжёлые: срезы по периодам, когортный анализ, продажи с группировкой по десяткам атрибутов. PostgreSQL такое не потянул бы без серьёзной возни, ClickHouse с этим справляется быстро.
Аналитики до этого работали в Excel и Google Sheets, куда выгружали CSV из ClickHouse вручную. Хотели нормальные интерактивные дашборды с фильтрами.
Как устроен DataLens
DataLens работает прямо из браузера - заходишь через Yandex Cloud Console, создаёшь подключение, поверх него датасет, поверх датасета чарты, чарты собираешь в дашборд. Концептуально похоже на Tableau или Metabase, только управление правами через Yandex IAM и всё живёт в инфраструктуре Яндекса.
Поддержка ClickHouse нативная - не через ODBC-костыль, а прямое подключение с пониманием типов CH, включая Array, Nullable, LowCardinality. Это важно: часть инструментов BI ломается об специфику типов ClickHouse или работает через JDBC с потерей производительности.
Модель данных в DataLens называется датасет - по сути VIEW поверх таблицы или произвольного SQL-запроса. Можно указать таблицу, можно написать subquery. Мы написали subquery для каждого логического объекта: продажи, товары, склад, клиенты. Это позволило скрыть от аналитиков технические поля и сделать нормальные имена на русском языке.
Что настраивали на стороне ClickHouse
Несколько вещей пришлось сделать на уровне CH перед подключением.
Отдельный пользователь с ограниченными правами. Создали пользователя datalens_ro с правами SELECT на нужные таблицы и ограничением по max_memory_usage и max_execution_time. Без этого один неосторожный аналитик с тяжёлым запросом может положить кластер. DataLens не строит совсем уж безумные запросы, но когда пользователей десять и у каждого открыт дашборд с AUTO_REFRESH - нагрузка накапливается.
Материализованные представления для агрегатов. Часть дашбордов требовала агрегации по периодам с десятками миллионов строк. Вместо того чтобы каждый раз гонять полный скан, сделали materialized view с предагрегацией по дням. DataLens читает их вместо raw-таблиц - запросы ускорились в несколько раз.
Квоты по пользователям. В ClickHouse есть встроенный механизм квот - ограничение на количество запросов и объём данных в единицу времени. Настроили квоту для datalens_ro на 100 запросов в минуту. Запас большой, но защита от случайного infinite loop есть.
Как прошёл процесс
Первый день - подключение, датасеты, первые чарты. Здесь DataLens работает быстро: создал подключение, указал host и credentials, нажал «проверить» - подключился. Датасет строится через UI, поля с нормальными типами определяются автоматически.
Второй день - дашборды и итерации с аналитиками. Вот тут началась работа. Аналитики хотят фильтры по периодам, по категориям товаров, по магазинам - и чтобы все чарты на дашборде реагировали на один фильтр. В DataLens это называется «связанные фильтры» - они работают, но настраивается это немного непривычно: фильтр применяется к датасету, а не к дашборду глобально. Когда понял логику - нормально, но первые часы было непонятно почему один чарт не реагирует на фильтр.
К концу второго дня основные дашборды были готовы. Три основных: операционный (продажи за день/неделю в разбивке по каналам), складской (остатки, оборачиваемость), клиентский (новые/повторные, когорты по месяцам).
Что понравилось
Нативная связка с ClickHouse. Типы не ломаются, запросы генерируются нормальные. Видно что люди делали интеграцию руками, а не через generic JDBC.
Скорость старта. Два дня до работающих дашбордов - это реальная цифра, не маркетинговая. С Tableau такое невозможно даже теоретически с учётом лицензирования и развёртывания.
Стоимость. Базовый DataLens на момент запуска - бесплатно при использовании с Yandex Cloud. Для клиента это был один из главных аргументов.
Что вызвало вопросы
Кастомизация чартов ограничена. Нельзя добавить произвольный JS, нельзя сделать совсем нестандартный тип визуализации. Стандартных типов достаточно для 90% задач, но если нужен специфический вид - придётся выкручиваться или признать что DataLens здесь не подходит.
Экспорт в Excel. Есть, но работает с ограничениями по размеру выгрузки. Аналитики, привыкшие к «выгрузить всё», немного расстроились. Решается на уровне процесса: объяснили что дашборд - это не замена Excel, это другой инструмент.
Права на уровне строк. На момент нашего разворачивания - отсутствуют. Если нужно чтобы менеджер региона видел только свой регион - это надо решать на уровне ClickHouse (отдельные представления или параметризованные запросы) или разделять дашборды. Не критично для этого клиента, но у других может быть вопрос.
Где сейчас
Дашборды работают вторую неделю. Аналитики пользуются, вопросы «как сделать новый чарт» поступают - хороший знак, система используется. ClickHouse под нагрузкой держится нормально, квоты не превышались.
Следующий шаг - настроить dwh-bi уведомления: хотим чтобы при отклонении ключевых метрик приходил алерт, а не только дашборд по запросу. В DataLens alerts пока в базовом виде - смотрим что из этого получится.