Всем привет! Меня зовут Юлия Скогорева, я системный аналитик в команде Center of excellence дирекции данных и аналитики Lamoda.

Если бизнесу нужны какие-то данные для принятия важных решений, то на помощь приходит наша команда. Мы тщательно изучаем множество микросервисов, чтобы определить, какие же данные нужны для решения бизнес-целей, формируем архитектуру хранилища, пишем скрипты запросов и витрин данных, строим юниверсы, делаем отчеты и дашборды. Большая часть работы не обходится без участия команды DWH-разработки.

В статье я расскажу, как устроено хранилище данных в Lamoda, что находится на каждом его слое, с помощью каких инструментов мы визуализируем данные, сколько у нас отчетов и зачем используем APEX.

Структура DWH 

Data Warehouse (DWH) — это централизованное хранилище данных, агрегирующее данные из разных систем-источников, на которых можно проводить анализ исторических и текущих данных. 

Хранилище в Lamoda построено на Oracle, которое занимает около 60 TB данных, и Vertica на 7 TB.

Oracle

Vertica Cluster

CPU 16 Core (32 threads) 

1.5 TB RAM 

90 TB SSD 

5 nodes 

CPU 160 Core (320 threads) 2.1 GHz 

2.5 TB RAM 

16 TB SSD

Наше DWH состоит из пяти слоев: 

  • Data Layer (DL),

  • Intelligence Layer (IL),

  • Business Layer (BL),

  • Metadata Layer (ML), 

  • Operational Data Store (ODS Report).

Data Layer (DL)

Слой «сырых» данных. Он используется для хранения данных из систем-источников, которые загружаются в рамках автоматизированных ETL-процессов.

Данные на этом слое хранятся в первозданном виде, что позволяет нам выделять и отслеживать дельту их изменений независимо от того, ведет ли источник логи. Это важное преимущество в таких ситуациях, когда в последующих слоях данных (IL/BL) есть ошибки. В этом случае можно провести полную перезагрузку таблиц на основе историй данных из систем-источников или же проверить цифры и данные, которые вызывают сомнения.

Сложности при загрузке на слой: большой объем данных, перенос изменений из источника без потерь.

Intelligence Layer (IL)

Слой, который используется для консолидации, унификации и нормализации данных хранилища. Данные из внешних систем-источников мы приводим к единому формату, а для ключей таблиц генерируем уникальные идентификаторы, которые в дальнейшем используются при сборке витрин данных. Таким образом, этот слой обеспечивает целостность и качество данных из различных систем.

Сложность при загрузке на слой: сделать наиболее понятную сущность, которую удобно было бы переиспользовать при построении новых витрин данных.

Business Layer (BL)

Слой аналитических витрин, в которых данные преобразуются в удобный для пользователей вид для анализа и решения бизнес-задач. Данные витрины используются напрямую пользователями, а также BI-системами для построения юниверсов в SAP BusinessObjects и наборов данных в Power BI.

Часть таблиц перегружается в Vertica без изменений, чтобы пользователи могли выполнять аналитическую работу по различным ad hoc задачам. Тем самым мы не нагружаем основное хранилище, потому что Vertica — колоночная база данных.

Сложность при загрузке на слой: оптимизировать время расчета.

Metadata Layer (ML)

Слой метаданных, который хранит всю информацию о данных хранилища. Он нужен для управления загрузкой данных и их проверки. Также в нем хранятся маппинги ключей для фактовых таблиц и справочников.

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

Operational Data Store (ODS Report)

Слой с витринами данных над Data Layer. Они применяются в трех случаях:

  • когда требования к отчетности не до конца понятны;

  • не нужно делать преобразования над данными источника;

  • данные нужны сразу же после их появления на DL.

Как организована работа с хранилищем в Lamoda

В Lamoda около 60-ти логических систем-источников и более 800 физических источников для DWH.

Типы источников

Их особенности

Реляционные БД

Быстрая вычитка с помощью SQL. Иногда меняется структура таблиц.

API

Могут менять структуру источника, оставляя API неизменным. Относительно медленное чтение.

Kafka

Быстрая доставка только измененных записей с источника. Иногда записи «теряются» по пути — не все датафиксы и миграции на базы доставляются в Кафку. Неудобно перезагружать данные ретроспективно.

Hadoop

Иногда зависают запросы.

Google Docs и Excel

Ошибки в форматах данных из-за человеческого фактора, в связи с чем активно переходим на APEX.

APEX

Подробнее расскажу о нем в следующем разделе.

Также важно рассказать о том, как мы фиксируем изменения на источниках при загрузке на слой DL, а именно про типы историчности Slowly Changing Dimensions. У нас их три вида: 

  • можем хранить первоначальное значение,

  • перезаписать старое значение новым,

  • добавить новую запись, оставив старую, что позволяет нам иметь историю изменения на источнике.

Типы историчности Slowly Changing Dimensions, применяемые в загрузке на DL:

Тип SCD

Строка вставилась на источнике

Значение поля изменилось на источнике

SCD0

Строка вставилась

Поле не поменяется, строка с новой версией не вставится

SCD1

Строка вставилась

Значение текущей строки поменяется, строка с новой версией не вставится

SCD2

Строка вставилась

Вставится новая строка с новой версией поля с датой загрузки

Наша команда системных аналитиков исследует новые системы-источники и какие данные необходимо забрать в хранилище из этих источников, а еще описывает новые таблицы для команды DWH-разработки. Ребята загружают данные с источников на DL с помощью Pentaho DI, далее последующие слои формируются фреймворком собственной разработки: Oracle PL/SQL и Python. 

Наше хранилище построено по методологии Билла Инмона. Важный слой в методологии — это Intelligence Layer (IL) или слой детальных данных. В нем мы создаем таблицы с данными, приближенными к 3NF (Third normal form или Третьей нормальной форме). 

Таблицы — это нормализованное представление бизнес-сущностей или процессов (заказ, товар, сотрудник). Мы стараемся подбирать понятные имена таблицам, которые отражали бы смысл хранимых данных. Названия используем в единственном числе. Например, fct_orderitem_detail — фактовая витрина с данными по товарам в заказе, fct_order — фактовая витрина с данными по заказам, dim_brand — таблица-справочник брендов, article_daily — витрина состояния товаров (артикулов) на дату.

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

На слое IL одну сущность допускается разбивать на несколько таблиц, если часть атрибутов изменяется редко, а другая — крайне часто. Можно сэкономить место на историчном хранении и на времени загрузки.

Oracle APEX

Это среда быстрой разработки приложений с минимальным программированием на основе СУБД Oracle Database, реализованная в виде веб-приложения. APEX помогает отказаться от Google Docs и от ручных справочников, в которых сложно проследить, что изменилось, а также как часто и кем они обновляются. 

Преимущества APEX:

  • Удобный user-friendly интерфейс, в котором можно загружать данные как построчно, так и из файлов.

  • Обновление полей и удаление некорректных записей (также можно удалять построчно или все записи в справочнике).

  • Выдача ролей на редактирование определенным пользователям, ответственным за конкретные данные. Так пользователь видит только те справочники, к которым у него есть доступ, что избавляет от случайных ошибок, как в Google Docs.

  • Возможность посмотреть, кто создал новую запись, обновил или удалил ее, а еще когда происходило изменение.

  • Загрузка данных из интерфейса в DWH на слой DL. Пользователи могут сами загружать эти данные, когда им нужно, и использовать справочники при построении логики финальных витрин на BL.

У нас создано около 80-ти справочников в APEX. Ниже пример простого справочника, который содержит разницу в часах между московским временем и временем остальных городов. Этот справочник нужен для того, чтобы переводить даты доставки, примерки и другие на местное время.

Инструменты для визуализации

В качестве интерфейса доступа к данным и визуализации для бизнес-пользователей мы используем SAP BusinessObjects и Power BI. В них мы строим юниверсы и наборы данных на BL-витринах, развивая self-service аналитику. Это означает, что любой сотрудник может запросить доступ к SAP BO и нужному юниверсу, построить отчет в нем или создать дашборд в Power BI. 

SAP BusinessObjects

В SAP BO можно просматривать данные с разных точек зрения через диалоговое окно интерфейса и легко редактировать запросы и отчеты.

Бизнес-пользователи сами редактируют и формируют отчеты, добавляют или удаляют ограничивающие фильтры, если бизнес-логика поменялась или появилось дополнительное условие. Например, пользователь хочет в отчете видеть не просто заказанные товары, а только фактически доставленные, тогда он добавляет дополнительный фильтр для этого условия. Можно самостоятельно добавлять в отчет строки и столбцы, менять их, создавать формулы и переменные. Также можно подтягивать ссылки на сайт, чтобы при выгрузке отчета по товарам видеть его изображение и выгружаемые данные.

В SAP BO у нас около 10 000 отчетов, из которых 1300 стоят в расписании на обновление. 10% из них созданы системными аналитиками, остальные — бизнес-пользователями.

Power BI 

Это инструмент для визуализаций и отчетов, с помощью которых пользователи могут отслеживать бизнес-показатели онлайн. Дашборды в Power BI используют для проверки статусов заказов, оперативного мониторинга работы автопарка и общего состояния инфраструктуры, а также для отслеживания доступности сервисов доставки в реальном времени.

Отображаемая информация в дашбордах помогает делать выводы о ситуации и оперативно решать проблемы. Например, дашборд с основными показателями использования собственного автопарка (коэффициенты утилизации, доступности, количество транспортных средств, штрафов, ремонтов) помогает мониторить его работу и зафиксировать зоны для улучшения в конкретном городе или подразделении.

Главный плюс Power BI — это user-friendly платформа. При созданных наборах данных пользователи могут сами строить визуализации.

Над чем работаем сейчас и планы на ближайшее будущее

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

Из основных крупных проектов — интеграция данных из 1С в пять HR-систем и миграция на новую Axapta 365. А в 2022 году нас ждет миграция из Oracle в Greenplum. Об этом мы напишем новые статьи :)

Комментарии (18)


  1. BigD
    10.01.2022 12:53

    Спасибо за описание! Доступ пользователей к созданию отчетов - как на практике решаете проблему возможной несходимости данных? Я считаю продажи так, а в другом отделе - совершенно другим способом. При этом на совещаниях мы можем показывать разные отчеты, и спорить, хотя построены на одних данных и те, и другие. Но математика/логика могут быть разными.


    1. juliaskogoreva Автор
      10.01.2022 13:55
      +2

      В системах отчетности SAP BusinessObjects и PowerBI все формулы прописаны для метрик (продажи, себестоимость, коэффициенты возврата, продаж и др), которые используют пользователи, им не приходится заново рассчитывать их. И также мы делаем описания в confluence в спейсе, к которому есть доступ у всей компании.

      Если происходят моменты несходимости данных в отчетах, то обсуждаем с отделами, что и как они используют, анализируем их отчеты, стараемся прийти к единой логике, и если есть необходимость в создании новых метрик, то добавляем их в SAP BO и Power BI. Это помогает избежать ошибок в дальнейшем.


      1. BigD
        10.01.2022 14:00

        Расчёт показателей сделан на уровне DWH, или внутри BI?


        1. juliaskogoreva Автор
          10.01.2022 14:07
          +1

          Базовые показатели на уровне DWH. Остальные, которые можно вынести - в SAP BO и PowerBI.


  1. askogorev
    10.01.2022 12:55

  1. getId
    10.01.2022 13:22

    Пробовали ClickHouse для ваших задач? Чем не подошел?


    1. juliaskogoreva Автор
      10.01.2022 14:02
      +1

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

      Но ClickHouse используется в отделе R&D для решения их задач.


    1. EvgenyVilkov
      11.01.2022 17:57

      это же узкоспециализированный инструмент и подходит только для для доступа к данным без использования сложнонаписанных sql выражений. Какое может быть ХД на КХ?


  1. Kozobrod
    10.01.2022 14:30

    Удачи вам, ребята!

    С нетерпением жду статью про гринплам) Особенно интересна часть про моделирование, там из-за распределенности наверняка будут вылезать нюансы. Железо, кстати, придется же сменить?

    Помню, хотели поднимать хадуп для DL... не взлетело?


    1. juliaskogoreva Автор
      10.01.2022 14:33

      Спасибо, Коля!

      Модель будет определяться многими факторами (команда, мощности, интенсивность загрузки). Железо придется сменить, но это не точно.

      Хадуп не очень хорошо себя показал для наших основных потребностей.


    1. EvgenyVilkov
      11.01.2022 17:58

      в вертике то нюансов побольше в моделировании чем в гп


  1. Ninil
    10.01.2022 14:31

    Сталкивались ли с случаями, когда "гранулярность" историчности в системах-источниках не совпадает с "гранулярностью" историчности в вашем IL (который в 3NF)? То есть, например, в системе источнике есть:

    • неисторичная таблица КЛИЕНТ с полем ИМЯ (в которой при изменении данные просто апдейтятся)

    • и историчная таблица АДРЕС_КЛИЕНТА с историей всех адресов клиента (т.е. в самом простом виде там есть поля КЛИЕНТ_ИД + ДАТА_С + ДАТА_ПО + АДРЕС)

    В IL же у вас есть одна общая таблица КЛИЕНТ с атрибутами ИМЯ и АДРЕС, в которой реализовано SCD2. Соответственно:

    • как вы обрабатываете изменения данных в таблицах с точки зрения корректного выстраивания историчности? Есть ли какая-либо договоренность с "бизнесом" на тему "как трактовать и какой датой отражать изменения в "неисторичных" таблицах источников?

    • есть ли правки "задним числом" и если да, то как вы их загружаете в IL?


    1. juliaskogoreva Автор
      10.01.2022 18:33

      1) У нас DL историчный, так как мы все почти грузим SCD2 (то есть даже неисторичные таблицы источников у нас обретают историю). На IL формируем таблицу с датами valid_from/valid_to по изменениям обеих таблиц (так как есть история на DL).

      С бизнесом договоренности есть только по витринам на BL, так как бизнес не знает о всей логике хранилища - отображаем неисторичное на дату последнего изменения (то есть на текущий момент значения).

      2) Если случаются на источнике такие правки, то перегружаем DL/IL таблицы с нужной даты или за все время.


  1. RinatJulchurin
    10.01.2022 14:34

    Можете рассказать какими механизмами переносите на слой Data Layer (DL) из Source systems?


    1. juliaskogoreva Автор
      10.01.2022 14:35

      В основном забираем с источника батчами средствами SQL (полный или инкрементальный забор данных).


  1. EvgenyVilkov
    11.01.2022 18:02

    В Vertica 7 Тб данных на 5 узлов в которых 160 CPU и 2,5Tb RAM.

    Если посчитать TCO на 1 TB то будет очень больно.


    1. barloc
      12.01.2022 00:35

      И при этом они с оракла на гп переходят, а не с вертики :)

      Как раз зашёл сказать, что оракл тянет 60 тб (представляю эту фулфлеш полку под ним), а чудо вертика всего 7.

      А подоплека наверняка в том, что вертика сменила лицензию и теперь не докупить расширение для неё, надо покупать все с нуля.


      1. EvgenyVilkov
        12.01.2022 09:58

        Ну вы же сами подтверждаете мой намек :) 60Тб как бы не хотят тащить в Вертику.

        GP в целом тоже не подарок :)