Инфраструктура для 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-инструмента на минимальных ресурсах и со временем их можно будет увеличить.


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


ссылка на оригинал статьи https://habr.com/ru/articles/856922/