BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » Apache Doris для Data Engineer » Продвинутые техники агрегаций и материализованных представлений в Apache Doris

Продвинутые техники агрегаций и материализованных представлений в Apache Doris

Apache Doris устойчиво применяется как ядро аналитических витрин в современных дата-латрах: он обеспечивает низкие задержки на больших объемах data и эффективную поддержку агрегирующих запросов. В этой главе рассматриваются продвинутые техники агрегаций и построения материализованных представлений (MV) в Doris: архитектура и алгоритмы, стратегии проектирования MV, интеграции с потоковыми источниками данных и практики тюнинга для реальных витрин. Цель - сформировать у инженера по данным четкое понимание того, как выбирать подходы к агрегациям и MV в зависимости от сценария, определить точки балансировки между задержкой обновления витрины и точностью агрегаций, а также выработать набор практик, обеспечивающих устойчивость и предсказуемость производительности.

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

  • Архитектура агрегаций и MV в Doris: принципы работы и распределенная логика
  • Алгоритмы агрегаций и выбор стратегий исполнения запросов
  • Модели материализованных представлений в Doris: создание, обновление и поддержка
  • Интеграции MV в реальном времени: источники данных, потоки и консистентность
  • Практические паттерны проектирования витрин и мониторинга производительности

     

Архитектура агрегаций и материаловиданных представлений

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

  • Векторизованный двигатель выполнения обеспечивает эффективную обработку агрегаций на уровне операторов. Агрегатные функции выполняются векторно по пакетам строк, что снижает вычислительную стоимость и улучшает пропускную способность между узлами.
  • Распределенная модель исполнения группировок реализуется через частичные агрегации на узлах-исполнителях и последующий этап слияния результатов на уровень планировщика. Это позволяет уменьшить межузловой трафик и увеличить параллелизм.
  • Модели MV встроены в экосистему Doris как особый тип физических объектов: MV создаются на основе SELECT-запросов с GROUP BY и поддерживаются с точки зрения обновления. MV хранит предвычисленные агрегаты и может использоваться в качестве источника для последующих запросов без повторной агрегации всего объема данных.
  • Планировщик запросов учитывает распределенность данных, ключевые столбцы и доступность MV. Он принимает решения о том, когда и какие агрегаты задействовать, чтобы минимизировать задержку и обеспечить консистентность данных в витрине.

Понимание этих принципов критично для правильного проектирования витрин: агрегации должны располагаться поблизости к данным, где они наиболее востребованы, MV - быть выбраны там, где повторяются тяжелые агрегирования, а планировщик - координировать их использование в рамках единого запроса.

 

Таблица: принципы взаимодействия агрегаций и MV (обзор)

Принцип Применение в Doris Выигрыш
Распределенные частичные агрегации выполняются на сегментах, затем объединяются масштабируемость и низкая задержка
Модели MV предвычисленные агрегаты на основе исходных таблиц ускорение повторяющихся запросов
Планировщик выбирает между агрегациями на уровне узла и MV баланс задержки и точности
Интеграция с потоками MV обновляется инкрементально, по мере поступления изменений близость к реальному времени

Ниже приведены примеры типовых подходов, которые применяются в Doris при работе с MV и агрегациями.

-- Пример создания MV в Doris (упрощенная схема)
## CREATE MATERIALIZED VIEW mv_sales_daily AS
SELECT dt, region, SUM(sales_amount) AS total_sales, AVG(unit_price) AS avg_price
FROM sales
GROUP BY dt, region;

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

 

Алгоритмы агрегаций и оптимизация исполнения

Эффективность агрегаций в Doris во многом зависит от выбора алгоритма на этапе выполнения запросов и от конфигурации окружения. Основные подходы включают:

  • Hash-based агрегации: применяется в большинстве случаев, когда размер группировок и размер выборки позволяют закрепить хорошую плотность хеш-таблиц в памяти. Обеспечивает быстрое обновление и агрегацию по большим наборам строк.
  • Sort-based агрегации: применяется при больших объемах данных, когда хеш-таблицы слишком велики и возникают проблемы с памятью. Применение внешней сортировки может оказаться предпочтительным для устойчивого выполнения.
  • Частичные агрегации на уровне сегментов: Doris может выполнять агрегации на локальном уровне на сегментах и затем агрегировать результаты на уровне кластера, уменьшая сетевой трафик и латентность.
  • Rollup и Cube-подобные техники: поддерживают расширение группировок для многомерной аналитики, позволяя запросам покрывать комбинации измерений без повторной обработки исходных данных.
  • Агрегации по пользовательским ключам и распределениям: выбор ключей группировки и распределения кардинально влияет на производительность. Правильный выбор distribution/partition keys уменьшает коллизии и балансирует нагрузку между узлами.

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

 

Развернутый пример: выбор стратегии агрегации в зависимости от нагрузки

Предположим, у нас есть факт-таблица продаж с полями: date, region, category, sales_amount, quantity. Для дневной витрины по региону и категории целесообразно использовать предварительную агрегацию на уровне дня, региона и категории. При этом если периодически выполняются запросы с детализацией по конкретному дню и региону, можно применить комбинированную стратегию: MV для общих агрегаций и частные hash-агрегации на уровне запроса для детальных метрик.

В реальной инфраструктуре целесообразна комбинация методик: MV для часто запрашиваемых агрегатов с низкой задержкой, hash-агрегации для случаев, когда MV не покрывает конкретные комбинации, и sort-based подход для больших объемов, когда памяти не хватает для хеш-агрегаций.

 

Модели материаловиданных представлений: создание, обновление и поддержка

Материализованное представление в Doris - это предвычисленная таблица, которая содержит агрегированные данные и может быть использована как источник для запросов на витрину. Основные принципы:

  • MV строится на основе выражения SELECT с GROUP BY и может охватывать один или несколько уровней агрегаций. MV хранит данные на уровне файловой системы кластера и индексируются для быстрого доступа.
  • Обновление MV может быть инкрементальным: при появлении изменений в базовой таблице Doris применяет соответствующие обновления к MV, поддерживая консистентность между MV и исходными данными.
  • В зависимости от версии Doris и конфигурации, MV может обновляться автоматически или по запросу администратора. В некоторых сценариях целесообразно использовать периодическое обновление MV в период низкой загрузки.
  • Поддержка MV включает выбрать правильную стратегию refresh: автоматическую, вручную или по расписанию, в зависимости от требований к актуальности данных и задержке.
    -- Демонстрационный пример создания MV для витрины продаж
    ## CREATE MATERIALIZED VIEW mv_sales_daily AS
    SELECT dt, region, SUM(sales_amount) AS total_sales, AVG(unit_price) AS avg_price
    FROM sales
    GROUP BY dt, region;
    
    -- Пример обновления MV (зависит от версии Doris)
    REFRESH MATERIALIZED VIEW mv_sales_daily;
    

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

     

Интеграции MV в реальном времени: источники данных, потоки и консистентность

Реализация витрин в условиях реального времени предполагает тесную интеграцию Doris с потоковыми источниками и системами обработки данных. Основные сценарии:

  • Ингестирование через брокерские сервисы: Doris поддерживает ingest данных через брокеры (например, Kafka) и через файловые источники. В потоковой загрузке важно минимизировать задержку между приходом данных и их доступностью для агрегаций.
  • Инкрементальные обновления MV: для поддержания MV в актуальном состоянии применяются паттерны стримовой обработки, когда изменения в исходной таблице приводят к частичным обновлениям MV. Это обеспечивает близкую к реальному времени витрину.
  • Согласованность между MV и оперативной загрузкой: при использовании MV следует проектировать механизмы компенсации дезинформации в случае задержек обновления или задержки потока.
  • Интеграция с внешними обработчиками: Doris может работать совместно с Flink, Spark или потоковыми консолидаторами, обеспечивая предобработку и нормализацию данных до загрузки в MV.

     

Практические паттерны:

  • Разделение потоковых и батчевых источников на разные MV, чтобы изолировать задержки и предупредить влияние потока на стационарную витрину.
  • Регулярная проверка целостности: контрольные суммы, сравнение агрегатов между MV и исходными таблицами.

     

Практические паттерны проектирования витрин и мониторинга производительности

Проектирование витрин требует аккуратного баланса между актуальностью данных и стоимостью поддержки MV и агрегаций. Рекомендуемые паттерны:

  • Выбор ключей группировки и распределения: для больших витрин целесообразно выбрать ключи, которые минимизируют коллизии и обеспечивают равномерное распределение нагрузки. Стратегия может включать разбиение по времени и региону, чтобы консолидировать часто запрашиваемые сочетания.
  • Разделение по MV и базовым таблицам: MV следует использовать там, где повторяются тяжелые агрегации, а базовые таблицы - там, где требуется детальный анализ. Это снижает задержку и уменьшает нагрузку на источник данных.
  • Управление объемом MV: чрезмерное количество MV может перегрузить метаданные и потребовать больше ресурсов на поддержание. Рекомендуется начинать с нескольких MV, охватывающих наиболее востребованные метрики.
  • Тюнинг планировщика: настройка параметров планирования, чтобы запросы могли выбирать MV, если он покрывает требуемые агрегаты, иначе применялась обычная агрегация. Это важно для обеспечения прозрачности задержек и согласованности.
  • Мониторинг и наблюдаемость: ведение журнала изменений MV, отслеживание задержек обновления и времени выполнения агрегаций. Включение метрик по времени сканирования, объему обработки и частоте обновления MV критично для диагностики проблем производительности.
  • Тестирование нагрузок: моделирование сценариев цепочек обновления, когда MV обновляются параллельно с запросами, тестирование на выявление узких мест и определение порогов для переключения между MV и обычными агрегациями.

Практический практикум по внедрению MV в Doris должен включать анализ бизнес-требований к точности и задержкам, построение карты витрин и постепенное добавление MV с акцентом на наиболее часто запрашиваемые метрики.

 

Key takeaways

  • Аггрегации в Doris являются распределенно масштабируемыми и поддерживаются через частичные агрегации на сегментах и объединение результатов.
  • Материализованные представления позволяют ускорить повторяющиеся тяжелые запросы за счет предвычисленных агрегатов и интегрируются с планировщиком запросов для оптимизации исполнения.
  • Инкрементальное обновление MV и его совместимость с потоками данных критически важны для построения реальных витрин с низкой задержкой.
  • Выбор стратегий агрегаций (hash- vs sort-based) зависит от объема данных, доступной памяти и требуемой задержки; оптимальные решения часто комбинируют оба подхода.
  • Правильное проектирование MV и распределения данных сокращает сетевой трафик и повышает пропускную способность витрины.
  • Интеграции Doris с потоковыми источниками и системами обработки (Kafka, Flink) позволяют поддерживать витрины в близком к реальному времени режиме.
  • Регулярный мониторинг, тестирование и корректная настройка планировщика - ключ к устойчивой производительности и предсказуемости в средах с высокой нагрузкой.

     

FAQ

  1. Как Doris реализует агрегацию в распределенной среде, и какие проблемы это решает?

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

 

  1. Какие ограничения существуют у MV в Doris и как их избегать?

MV в Doris требует достаточного объема ресурсов на хранение и поддержание индекса и метаданных. Они полезны для часто запрашиваемых агрегатов, но не покрывают абсолютно все возможные запросы. Рекомендуется использовать MV для наиболее часто встречающихся комбинаций группировок и поддерживать детальные данные в базовых таблицах для анализа в редких случаях. Важно следить за временем обновления MV и балансировать частоту обновления с требуемой актуальностью данных.

 

  1. Как выбрать стратегию MV для разных сценариев витрины?

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

 

  1. Как реализуется инкрементальное обновление MV в Doris?

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

 

  1. Какие факторы влияют на выбор ключей группировки и распределения?

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

 

  1. Как тестировать производительность агрегаций в Doris?

Рекомендуется моделировать реальную рабочую нагрузку: тесты на сканирование больших наборов данных, повторные запросы с одинаковыми группировками, вариации по времени и регионам. Важна проверка задержки исполнения и времени обновления MV. Анализ планов выполнения запросов и профилирование отдельных этапов помогут выявить узкие места.

 

  1. Какие паттерны оптимизации применимы к витринам на Doris?

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

 

  1. Как интегрировать Doris MV с потоковой обработкой и источниками типа Kafka?

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

 

  1. Какие показатели мониторинга критичны для MV и агрегаций?

Задержка обновления MV, время выполнения запросов, объем до и после обработки, пропускная способность узлов, загрузка памяти и дисков, частота ошибок обновления MV. Набор метрик должен включать аналитику по времени сканирования, эффективности агрегаций и влиянию MV на общую производительность кластера.

 

  1. Как минимизировать риск неконсистентности между MV и исходными таблицами?

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

 

Глава рассчитана на практическое применение в проектах по созданию и поддержке реальных витрин на Apache Doris: от планирования архитектуры агрегаций до оперативной поддержки MV и мониторинга производительности. В сочетании с подходами к интеграции потоковых источников и продуманной стратегией обновления MV, Doris обеспечивает эффективную и гибкую основу для современных аналитических витрин с требованиями к низкой задержке и масштабируемости.

← Предыдущая статья
Vectorized Execution и другие техники ускорения
Следующая статья →
Оптимизация памяти и вычислений: компрессии, Bloom-фильтры, кеш

 

Узнать стоимость решенияЗапросить видео презентацию

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • ООО «Модум-Транс» — независимый оператор грузовых железнодорожных перевозок, лидирующий по количеству инновационного парка на сети РЖД.

  • ООО «Ай Пи Ти Групп» (IPT Group) — многопрофильный консалтинговый холдинг, специализирующийся на юридическом и финансовом сопровождении бизнеса. IPT Group занимает высокие позиции в профессиональных рейтингах, входит в ТОП-30 лучших юридических компаний России по версии «Право.ru-300», Global Law Experts и др.

  • ООО "Уральская транспортная компания" — это транспортно-логистическая компания, специализирующаяся на железнодорожных перевозках грузов, создана в 2009 году.

  • Русклимат
    Русклимат — международный торгово-производственный холдинг, концентрирующий опыт ведущих мировых производителей индустрии климата, мощный потенциал конструкторских бюро и лабораторий индустриального дизайна.
     
    Компания образована в 1996 году. За более чем двадцатилетнюю историю Русклимат прошел путь от локальной компании до мощной вертикально-интегрированной многопрофильной структуры.
     
  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.