Инфраструктура для 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/, пройти быструю »регистрацию» и увидеть наш интерфейс.
Теперь мы готовы создать подключение к нашей БД, для этого нужно перейти в настройки и указать параметры для подключения.
Важно: Внутри проекта мы не указываем хост, мы указываем имя сервиса.
И если сейчас перейти на главную страницу, то мы увидим, что Metabase уже предлагает нам взглянуть на данные.
После этого мы можем создать новый дашборд и выбирать удобные нам срезы для аналитики. Вот к примеру дашборд с группировкой по неделям.
И тут стоит упомянуть, что для создания графика я не написал ни строчки кода. Всю логику построения и расчётов забрал на себя 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:
И теперь давайте создадим первый дашборд в ReDash, для этого необходимо создать первый запрос и добавить для него визуализацию.
Затем перейти в создание нового дашборда и использовать наш запрос для визуализации:
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
и сможем построить такой дашборд:
Подробнее о работе с 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-инструмента на минимальных ресурсах и со временем их можно будет увеличить.
Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.