Инфраструктура для Data-Engineer BI-tools

Введение

BI (Business Intelligence) — это инструмент или несколько инструментов, которые помогают собрать данные в нужный вид и посмотреть на бизнес со стороны данных.

Чаще всего BI-инструментами пользуются аналитики. Они строят дашборды (витрины), выполняют Ad hoc задачи и в целом проводят анализ данных в этих инструментах.

В этой статье я хотел бы показать куда уходят данные и что с ними происходит, когда пайплайны дата-инженеров заканчивают работу.

Также хотелось бы показать ценность мета-данных и того, как важно следить за состоянием витрин и того, как с данными работает BI.

Ниже я рассмотрю несколько популярных BI-инструментов, мы их развернём в Docker. Посмотрим как выглядит наше DWH глазами BI-инструмента.

Тестовая база данных

Весь код проект находится в моём репозитории.

В наших примерах я буду использовать БД PostgreSQL, поэтому я создам изначально docker-compose.yaml:

version: '3.8'  
  
services:  
  data-postgres:  
	  image: postgres:13  
	  environment:  
	    POSTGRES_USER: postgres  
	    POSTGRES_PASSWORD: postgres  
	    POSTGRES_DB: bi  
	  ports:  
	    - "5432:5432"

Важно: Добавление всех BI-инструментов в сборку будет происходить в нём же.

Запустим сборку проекта командой: docker-compose up -d.

Давайте также создадим таблицу users, с которой будем работать.

Для этого необходимо создать виртуальное окружение с необходимыми зависимостями:

python3.12 -m venv venv && \
source venv/bin/activate && \
pip install --upgrade pip && \
pip install poetry && \
poetry lock && \
poetry install

И запустить файл create_and_fill_users.py. После небольшого ожидания в нашей БД создастся таблица users.

Metabase

Предлагаю нам начать с Metabase, он заимел свою популярность за простоту. Позволяет быстро проанализировать и »покрутить данные».

Если мы перейдем на сайт Metabase, то сразу же можем попасть на страницу
Deploy Metabase Open Source. Так как мы будем поднимать всё через Docker, то немного улучшим наш docker-compose.yaml:

...
metabase:  
  image: metabase/metabase:v0.51.1.8  
  container_name: metabase  
  ports:  
    - "3000:3000"

Важно: Я указал версию для образа metabase, если вы хотите, то можете использовать другую версию.

Если заново запустить сборку (docker-compose up -d), то мы сможем перейти по адресу http://localhost:3000/, пройти быструю »регистрацию» и увидеть наш интерфейс.

Теперь мы готовы создать подключение к нашей БД, для этого нужно перейти в настройки и указать параметры для подключения.

760c5f9d67da8d39f48df3f49446fb8a.png


Важно: Внутри проекта мы не указываем хост, мы указываем имя сервиса.

И если сейчас перейти на главную страницу, то мы увидим, что Metabase уже предлагает нам взглянуть на данные.

d9c2f4b5ea718ca6619fdc2520c3d65c.png


После этого мы можем создать новый дашборд и выбирать удобные нам срезы для аналитики. Вот к примеру дашборд с группировкой по неделям.

5b94c7aa13cd269354ddd270f9b765a5.png


И тут стоит упомянуть, что для создания графика я не написал ни строчки кода. Всю логику построения и расчётов забрал на себя Metabase.

ReDash

К сожалению ReDash перешел под другую лицензию, потому что был выкуплен компанией Databricks, но старые версии ReDash до сих пор находятся в Open Source и ими можно пользоваться, плюс старые версии используются во многих компаниях.

С большей частью информации по установке ReDash вы можете ознакомиться по ссылке.

Также основные проблемы я постарался полечить. Поэтому данный код необходимо добавить в наш уже существующий docker-compose.yaml:

# Redash  
redash-server:  
  image: redash/redash:10.1.0.b50633  
  command: server  
  depends_on:  
    - postgres  
    - redash-redis  
  ports:  
    - "5000:5000"  
  environment:  
    PYTHONUNBUFFERED: 0  
    REDASH_LOG_LEVEL: "INFO"  
    REDASH_REDIS_URL: "redis://redash-redis:6379/0"  
    REDASH_DATABASE_URL: "postgresql://postgres:postgres@postgres/postgres"  
    REDASH_COOKIE_SECRET: "redash-cookie-secret"  
    QUEUES: "queries,scheduled_queries,celery,schemas"  
    WORKERS_COUNT: 2  
  restart: always  
  
redash-worker:  
  image: redash/redash:10.1.0.b50633  
  command: worker  
  depends_on:  
    - redash-server  
  environment:  
    PYTHONUNBUFFERED: 0  
    REDASH_LOG_LEVEL: "INFO"  
    REDASH_REDIS_URL: "redis://redash-redis:6379/0"  
    REDASH_DATABASE_URL: "postgresql://postgres:postgres@postgres/postgres"  
    REDASH_COOKIE_SECRET: "redash-cookie-secret"  
    QUEUES: "queries,scheduled_queries,celery,schemas"  
    WORKERS_COUNT: 2  
  restart: always  
  
redash-scheduler:  
  image: redash/redash:10.1.0.b50633  
  command: scheduler  
  depends_on:  
    - redash-server  
  environment:  
    PYTHONUNBUFFERED: 0  
    REDASH_LOG_LEVEL: "INFO"  
    REDASH_REDIS_URL: "redis://redash-redis:6379/0"  
    REDASH_DATABASE_URL: "postgresql://postgres:postgres@postgres/postgres"  
    REDASH_COOKIE_SECRET: "redash-cookie-secret"  
  restart: always  
  
redash-redis:  
  image: redis:7-alpine  
  restart: always  
  
postgres:  
  image: postgres:13  
  environment:  
    POSTGRES_PASSWORD: postgres  
  ports:  
    - "5431:5432"  
  restart: always

После этого снова запустить сервисы командой: docker-compose up -d. Затем когда у вас скачаются все образы и сервисы развернуться.

Необходимо будет создать базу данных для ReDash командой: docker-compose run --rm redash-server create_db.

Важно: Если ReDash всё равно не доступен, то выполните команду: docker-compose up -d --force-recreate.

Важно: я создал сервис postgres без использования префикса redash-, как у всех остальных сервисов, потому что это старый продукт и часть проблем не были решены и он имеет »стандартный» URI, подробнее по ссылке. Также можете ознакомиться с оригинальным ответом в GitHub.

Стоит также упомянуть, что на Docker Hub от ReDash появилась preview сборка.

После запуска нашего проекта мы можем подключиться к нашему серверу ReDash по ссылке — http://localhost:5000/. В самом начале вам нужно будет зарегестрироваться. Так как БД развернута локально и это не продовое окружение, то можете использовать любые параметры для »регистрации».

Первым делом нам необходимо создать подключение к PostgreSQL. Оно будет идентичным как и в Metabase:

df41c9133be6a73bfd7570b88dd7e46d.png


И теперь давайте создадим первый дашборд в ReDash, для этого необходимо создать первый запрос и добавить для него визуализацию.

Затем перейти в создание нового дашборда и использовать наш запрос для визуализации:

1e6e3bc7356831cb669e81408edf23fe.png


ReDash многие используют также для работы с БД вместо популярного DBeaver, потому что тут сразу можно селектить и исследовать данные.

Также ReDash позволяет поставить дашборд на автообновление и благодаря такой возможности заинтересованные могут получать актуальную информацию по метрикам бизнеса.

Yandex DataLens

Всю информацию по Open Source DataLens вы можете найти по ссылке.

DataLens имеет хорошо описанную документацию по старту.

В начале в наш docker-compose.yaml добавим следующий код:

# DataLens  
pg-compeng:  
  container_name: datalens-pg-compeng  
  image: postgres:13  
  environment:  
    POSTGRES_PASSWORD: "postgres"  
    POSTGRES_DB: postgres  
    POSTGRES_USER: postgres  
  
control-api:  
  container_name: datalens-control-api  
  image: ghcr.io/datalens-tech/datalens-control-api:0.2139.0  
  environment:  
    BI_API_UWSGI_WORKERS_COUNT: 4  
    CONNECTOR_AVAILABILITY_VISIBLE: "clickhouse,postgres,chyt,ydb,mysql,greenplum,mssql"  
    RQE_FORCE_OFF: 1  
    DL_CRY_ACTUAL_KEY_ID: key_1  
    DL_CRY_KEY_VAL_ID_key_1: "h1ZpilcYLYRdWp7Nk8X1M1kBPiUi8rdjz9oBfHyUKIk="  
    RQE_SECRET_KEY: ""  
    US_HOST: "http://us:8083"  
    US_MASTER_TOKEN: "fake-us-master-token"  
  depends_on:  
    - us  
  
data-api:  
  container_name: datalens-data-api  
  image: ghcr.io/datalens-tech/datalens-data-api:0.2139.0  
  environment:  
    GUNICORN_WORKERS_COUNT: 5  
    RQE_FORCE_OFF: 1  
    CACHES_ON: 0  
    MUTATIONS_CACHES_ON: 0  
    RQE_SECRET_KEY: ""  
    DL_CRY_ACTUAL_KEY_ID: key_1  
    DL_CRY_KEY_VAL_ID_key_1: "h1ZpilcYLYRdWp7Nk8X1M1kBPiUi8rdjz9oBfHyUKIk="  
    BI_COMPENG_PG_ON: 1  
    BI_COMPENG_PG_URL: "postgresql://postgres:postgres@pg-compeng:5432/postgres"  
    US_HOST: "http://us:8083"  
    US_MASTER_TOKEN: "fake-us-master-token"  
  depends_on:  
    - us  
    - pg-compeng  
  
pg-us:  
  container_name: datalens-pg-us  
  image: postgres:13  
  environment:  
    POSTGRES_DB: us-db-ci_purgeable  
    POSTGRES_USER: us  
    POSTGRES_PASSWORD: us  
  
us:  
  container_name: datalens-us  
  image: ghcr.io/datalens-tech/datalens-us:0.256.0  
  depends_on:  
    - pg-us  
  environment:  
    APP_INSTALLATION: "opensource"  
    APP_ENV: "prod"  
    MASTER_TOKEN: "fake-us-master-token"  
    POSTGRES_DSN_LIST: ${METADATA_POSTGRES_DSN_LIST:-postgres://us:us@pg-us:5432/us-db-ci_purgeable}  
    SKIP_INSTALL_DB_EXTENSIONS: ${METADATA_SKIP_INSTALL_DB_EXTENSIONS:-0}  
    USE_DEMO_DATA: ${USE_DEMO_DATA:-1}  
    HC: ${HC:-0}  
    NODE_EXTRA_CA_CERTS: /certs/root.crt  
  extra_hosts:  
    - "host.docker.internal:host-gateway"  
  volumes:  
    - ./certs:/certs  
  
datalens:  
  container_name: datalens-ui  
  image: ghcr.io/datalens-tech/datalens-ui:0.2248.0  
  ports:  
    - ${UI_PORT:-8080}:8080  
  depends_on:  
    - us  
    - control-api  
    - data-api  
  environment:  
    APP_MODE: "full"  
    APP_ENV: "production"  
    APP_INSTALLATION: "opensource"  
    AUTH_POLICY: "disabled"  
    US_ENDPOINT: "http://us:8083"  
    BI_API_ENDPOINT: "http://control-api:8080"  
    BI_DATA_ENDPOINT: "http://data-api:8080"  
    US_MASTER_TOKEN: "fake-us-master-token"  
    NODE_EXTRA_CA_CERTS: "/usr/local/share/ca-certificates/cert.pem"

Затем запустим его командой docker-compose up -d и сможем построить такой дашборд:

55eb77bbf7f7c2f777004ac91fed5f63.png


Подробнее о работе с DataLens вы можете ознакомиться из документации (есть так же российская версия документации).

Meta-данные

Meta-данные — это данные о данных. Довольно важный элемент в BI, так как он позволяет быстрее исследовать данные и понимать что значит то или иное поле.

Если у вас не будет мета-данных, то вашим аналитикам придётся искать информацию по таблицам/колонкам в корпоративной библиотеке, что не всегда просто.

Для демонстрации работы мета-данных давайте выполним скрипт fill_meta_about_users.py. Он заполнит нам информацию по таблице users.

И теперь в любом из BI-инструментов мы сможем при написании запросов знать что значит та или иная колонка.

Мета-данные как раз помогают разобраться в логике построения таблицы, потому что за модель отвечает backend-разработка и у них при создании модели были свои требования.

Если взять колонку city из таблицы users, то без заполненных мета-данных мы можем только гадать что означает город в таблице: город рождения, город регистрации или что-то другое.

Заключение

В статье мы рассмотрели буквально три BI-инструмента, но на самом деле их великое множество. Существуют платные решения, существуют решения из Open Source.

Основная задача BI-инструмента по моему мнению — это дать возможность гибко и быстро принимать решения по бизнесу.

На что стоит обратить внимание дата-инженеру при работе c BI-инструментами:

  • Обращайте внимание на нагрузку от BI-инструментов. Не редки случаи, когда аналитики могут обращаться к сырым или не агрегированным данным что увеличивает расходы на содержание DWH/Data Lake.

  • Держите мета-данные в порядке, чтобы исключить лишние обращения в сторону data-платформы.

  • Старайтесь делать агрегаты и предагрегаты, чтобы улучшить производительность DWH/Data Lake.

  • Большая часть BI-инструментов имеет множество коннектов к различным DWH/Data Lake.

  • Некоторые BI-инструменты могут использовать »стандарты SQL» при создании дашбордов, что может негативно сказаться на вашем DWH/Data Lake. К примеру если у вас используется ClickHouse, то в нём лучше использовать инструкции самого ClickHouse, а не »стандартного» SQL.

  • При настройке BI-инструмента или подключении нового инструмента настройте квоту потребления ресурса на минимум, чтобы проверить работу BI-инструмента на минимальных ресурсах и со временем их можно будет увеличить.

Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.

© Habrahabr.ru