1. Аудит источников данных Источниками данных выступили системы учета:
- Кассовая система
- Оператор Фискальных Данных
- Аналитическая система ST Analyze
- Решение для планирования, бюджетирования и прогнозирования Oracle Hyperion (рассматривались только данные для отчета P&L)
Данные имеют разный формат: реляционные SQL базы, NoSQL XML-файлы свободной структуры с данными о продажах, текстовые файлы с разделителем, изображения.
В компании они используются при создании отчетов для топ-менеджмента и оценки эффективности функциональных подразделений: продаж и маркетинга, HR, бэкофиса, склада.
Сбор данных был реализован следующим образом:
- ClickHouse собирает данные напрямую из других внешних БД, минуя промежуточные выгрузки, что сокращает расходы на разработку Extract слоя.
- Данные из любых файловых источников собираются напрямую БД (JSON, CSV, Parquet).
- Для данных из RestAPI, GraphQL, SOAP используется промежуточный слой в виде Python.
- Настроено подключение к шине данных (RabbitMQ, Kafka) для наполнения Staging и ODS (Operational Data Store) слоев данных в реальном времени
2. Потребители данных
Были определены все системы, которые должны получать доступ к хранилищу:
- Системы визуализации данных и формирования отчетов
- Системы отчетности в реальном времени – веб-приложения и мобильные приложения с аналитикой по продажам, сотрудникам и т.д. Требуют низкой задержки отображения данных, в основном используются на местах.
- Внешние потребители данных - сервисы формирования купонов, обучения сотрудников, HR агентства и т. д., собирающие часть данных из систем DWH.
3. Развертывание Support служб и настройка процесса CI/CD для разработки
- На серверах заказчика развернуты службы оркестрации, логирования и сбора метаданных - настроен Dagster, установлены GitLab и DataHub
- Настроена связка проекта с Git-репозиториями для организации процесса непрерывного развертывания CI/CD (Continuous Integration & Continuous Delivery).
4. Наполнение Слоя первичных данных (Staging Layer) Наполнение слоя происходило в зависимости от источника данных, который подается на вход в хранилище.
В результате этапа настроены интеграции со всеми источниками данных, настроено обновление данных внутри слоя по расписанию и реализован механизм инкрементального обновления.
- XML-файлы из кассовой системы
Данные кассовой системы извлекаются из XML-источников. Процесс чтения и выгрузки данных, представленных на сетевом диске, реализован на средствах Python + DBT. Сохранение данных по таблицам производится с учетом времени их обновления в источнике данных (обновленные позже данные перезаписываются на место загруженных ранее). Организовано инкрементальное обновление данных на слое. Все данные из XML-файлов хранятся в слое сырых данных.
- Оператор Фискальных Данных (ОФД)
Данные от ОФД реплицируются на сервера заказчика 1к1 с определенной задержкой. Подключение Postgres к СlickHouse осуществлено с использованием нативных JDBC драйверов. Дополнительно проведена настройка, позволяющая загружать только измененные и добавленные данные на основании MD5 хешей записей в таблице базы данных.
На этапе выгрузки сырых данных осуществлена пообъектная репликация данных в Staging слой. Использовано ODBC подключение к исходным данным и реализована инкрементальная загрузка данных. В результате сформирована схема данных на слое, где размещена обновляемая копия данных QSR в контуре хранилища данных.
Настроена интеграция с данными из Excel - файлов, выгруженными из Oracle Hyperion. Данные используются для построения P&L отчета и обновляются при обновлении выгрузок.
5. Формирование требований к слою витрин данных (Data Marts Layer) Витрина данных – аналитическая структура, поддерживающая работу одного из приложений, подразделения, бизнес-раздела.
Для анализа существующих моделей в аналитических приложениях и формирования, с учетом комплексной бизнес-модели заказчика, технических заданий для витрин привлекался специалист-аналитик. Совместно с инженером данных были проработаны методы формирования витрин, а также метрики качества данных (полнота, достоверность и пр.).
В результате этапа:
- Обследованы таблицы QSR (подготовлено описание таблиц в сервисном слое)
- Сформированы правила определения соответствий (mapping) данных из источников
- Сформированы требования к витрине, которые не склонны к двойственности трактования и отвечают на все бизнес-запросы заказчика
- Разрабатываемые витрины обеспечивают быструю и бесшовную миграцию приложений QlikView на новый источник данных
- При миграции соблюдена полнота и достоверность данных
- Артефактом данного этапа является BRD (Business Requirements Document) на витрины, основанные на источнике XML-файлов с данными кассовой системы
6. Разработка ядра хранилища (Core Data Layer) В ядре разрозненная информация из Staging слоя структурируется и приводится к нужным ключам/виду, обеспечивается полнота и целостность данных. Здесь добавляется бизнес-логика, устанавливаются соответствующие материализации, данные объединяются и проверяются в соответствии с бизнес-стандартами.
В процессе трансформации данных из Staging слоя в ядро хранения, они никак не агрегируются и не пересчитываются. После того как на этапе разработки ядра данные были приведены к формату хранения выбранной методологии Снежинка, появилась возможность их агрегировать, конвертировать и осуществлять прочие операции для подготовки к формированию витрин данных.
Весь этот процесс трансформации производился при помощи фреймворка DBT, который в акрониме ELT отвечает за Transform. DBT не выгружает данные из источников, но предоставляет возможности по работе с теми данными, которые уже загружены в хранилище.
В результате этапа:
- Сформированы таблицы с детальными данными по отдельным доменам (продажи, ОФД и т. д.)
- Сформированы таблицы со справочниками
- Сформированы mapping таблицы с соответствием значений атрибутов между разными доменами
- Осуществлено проектирование промежуточных витрин данных и начата подготовка конечных пользовательских витрин данных
- Настроена автоматическая актуализация таблиц на основании обновлений Staging слоя
7. Работа со справочниками В рамках этапа был проведен анализ справочников (рестораны, меню) и подготовка таблиц соответствия.
Справочники из временного внешнего источника данных (Excel-файлы) были загружены в хранилище в исходном виде. На основании направленных заказчиком правил был сформирован справочник Календарь. Настроено обновление Справочников на основании источников данных.
На данном этапе не формировался функционал работы с вводом данных и изменением значений.
8. Формирование сервиcного слоя (Service Layer) Сервисный слой (Service Layer)
обеспечивает мониторинг данных, оперативное устранение ошибок, позволяет выполнять сквозной аудит данных (data lineage), использовать общие подходы к выделению дельты изменений и управления загрузкой.
Сервисный слой реализует следующие функции:
Для управления метаданными и визуализации потока данных (data lineage) использовался DataHub. Это платформа метаданных с открытым исходным кодом для modern data stack, основной задачей которой является помощь сотрудникам в обнаружении нужных данных.
С помощью DataHub можно всегда получить всю необходимую информацию о данных: кто является владельцем, список полей в витрине и их бизнес-назначение, какие расчеты используются при формировании тех или иных показателей, из чего были собраны источники.
Алерты дают возможность оперативно узнавать об изменениях в инфраструктуре и сбоях автоматизированных процедур, таких как:
- Не был получен ожидаемый HML-файл от источника
- Обработка файла заняла больше времени, чем в среднем необходимо
- Файл имеет очень низкое или очень высокое количество строк
- Есть проблемы с сетевым подключением
- Задания (Jobs) не отработали по расписанию
- Очень высокая нагрузка на систему
Специалистами Qlever был настроен автоматический сбор, хранение и обработка логов в облачном хранилище.
Использование второго сервера позволяет хранить логи и получать информацию о произошедшем сбое, даже если файловая система одной из виртуальных машин повредилась и все данные на сервере были уничтожены.
После восстановления работоспособности сервера через бэкапы, технические специалисты могут проанализировать логи, чтобы сделать выводы и выработать решения, которые предотвратят появление таких инцидентов в будущем.
Были логированы следующие события:
- Системные логи, связанные с системными событиями
- Серверные логи, регистрирующие обращения к серверу и возникшие при этом ошибки
- Логи, фиксирующие запросы к DWH
- Логи авторизации
- Логи аутентификации
- Логи работы Job
Оркестрация — это управление потоками данных, автоматическое размещение, координация и управление сложными системами и службами. Оркестрация описывает то, как сервисы должны взаимодействовать между собой, используя для этого обмен сообщениями, включая бизнес-логику и последовательность действий.
Для оркестрации в хранилище был использован инструмент Dagster. Dagster позволяет определять конвейеры потока данных между повторно используемыми логическими компонентами, тестировать их локально и запускать в облачных сервисах или других распределенных системах. C Dagster возможно строить сложные data pipeline, в том числе по обмену данными между разными приложениями. Унифицированное представление конвейеров и ресурсов, которые они производят, позволяет Dagster работать с Python и SQL.
В Dagster мониторинг и наблюдение за выполнением конвейеров обработки данных реализуется через структурированный журнал событий, который является историческим хранилищем неизменных записей вычислений в этом оркестраторе. Журнал управляет реактивными пользовательскими интерфейсами Dagit, формирует каталог ресурсов, поддерживает форматированные трассировки стека и рендеринг разметки непосредственно при просмотре запуска. Каждый выполненный data pipeline и любое созданное событие записываются в этот неизменяемый лог-журнал, позволяя ему служить системной записью для всей платформы данных.
В результате этапа настроены:
- Процесс управления расписанием задач
- Процесс логирования выполнения задач
- Процесс уведомления в случае ошибок и предупреждений
- Автоматизированное формирование сохранения информации о метаданных (реализовано средствами DataHub)