Характеристики хранения и движок обработки в Doris
Apache Doris представляет собой современную OLAP-СУБД с мультимодальной архитектурой, ориентированной на аналитику больших объемов данных в реальном времени. В Doris ключевую роль играют разделение задач между Frontend (FE) и Backend (BE), колоночное хранение и MVCC, а также мощный движок обработки - векторизованный исполнитель с поддержкой современных техник оптимизации запросов. В этой главе рассмотрены базовые характеристики хранения, принципы обработки запросов и принципы интеграции Doris в конвейеры данных, чтобы инженер по данным мог эффективно проектировать схемы данных, настраивать хранение и выбирать стратегии загрузки и оптимизации исполнения.
Doris ориентирован на сценарии, где требуется высокое быстродействие аналитических запросов по большим наборам данных с поддержкой реального времени. Архитектура FE/BE обеспечивает разделение планирования, метаданных и управления кластера (FE) и физического исполнения запросов и хранения данных (BE). Это разделение упрощает масштабирование, позволяет гибко управлять хранением и поддерживать консистентность между потоками загрузки и аналитикой. В движке Doris применяются современные техники: векторизованный исполнение, продвинутый планировщик, ускорение исполнения через кодогенерацию и CLI-подобное взаимодействие между компонентами. Важным элементом является способность Doris поддерживать потоковую загрузку и обновление витрин в реальном времени, что критично для построения аналитических витрин и дашбордов.
- Архитектура Doris: FE/BE, модель взаимодействия и роль метаданных.
- Хранение данных: структура данных, rowsets, колоннарное хранение, компрессия и индексация.
- Движок обработки: векторизованный исполнение, оптимизатор Nereids, кодогенерация и runtime-фильтры.
- Интеграции и загрузка в реальном времени: подходы к загрузке, потоковые источники, коннекторы и витрины.
Архитектура Doris
Doris реализует двухуровневую архитектуру: Frontend (FE) отвечает за управление метаданными, безопасность, планирование запросов и координацию работы кластера; Backend (BE) выполняет физическое чтение данных, исполнение планов и управление хранением. FE обеспечивает глобальное согласование схем, версий таблиц и прав доступа, а BE - распределенное хранение и вычисления. Этого разделения достаточно для масштабирования: FE может обрабатывать огромное количество запросов и схем, а BE плавно масштабируется по добавлению узлов хранения и вычислений.
FE держит актуальные METADATA-каталоги, которые описывают базы данных, таблицы, столбцы, индексы и распределение данных. BE отвечает за существующую схему физического хранения: tablet’ы (логические единицы хранения данных), rowsets и их версии, сдерживающие механизмы версий и консистентности. В Doris используется механизм MVCC (многоверсионное управлениеConcurrency), который обеспечивает чтение консистентной версии данных во время обновлений и длительных транзакций загрузки. Такой подход минимизирует блокировки и поддерживает режимы консистентности, необходимыми для аналитики в реальном времени.
Коммуникации между FE и BE организованы через распределенные RPC-протоколы. По мере роста кластера Doris поддерживает горизонтальное масштабирование BE-узлов, что позволяет увеличивать пропускную способность чтения и записи. Важной частью архитектуры является механизм управления статистикой: FE собирает базовую статистику по таблицам и подсказывает BE планировщику оптимальные планы выполнения. В реальных сценариях это означает более точные оценки затрат на сканирование столбцов, фильтрацию и агрегацию.
- FE-BE взаимодействие строится на RPC и сигнатурах транзакционных единиц: таблицы, разделы и rowsets.
- Управление версиями и MVCC позволяет читать непротиворечивые снимки данных во время загрузки и обновлений.
- Распределение данных по Tablet’ам и репликации обеспечивает устойчивость к сбоям и пропускную способность.
Хранение данных: структура, rowsets и колоннарное хранение
Doris хранит данные в колоннарном формате на диске, что обеспечивает эффективную выборку по столбцам и ускорение сканирования больших таблиц. Основными концепциями являются tablette, rowset и столбцовые файлы. Данные внутри планшета разбиваются на rowsets - логические фрагменты, которые содержат столбцы в колоннарном виде и организованы по версиям. В типичной конфигурации существует базовый rowset (base) и несколько delta-rowset'ов (delta), которые аккумулируют инкременты изменений за период времени. Это позволяет эффективно обрабатывать массовые загрузки, частичные обновления и удаления без полной переработки всей таблицы.
Структура хранения в Doris включает следующие ключевые элементы:
- Таблетки (Tablet): физическая единица хранения, которая управляется BE. Таблетки распределяются по узлам кластера и реплицируются в соответствии с политиками отказоустойчивости.
- Rowset: фрагмент данных внутри таблетки. Rowset может быть base или delta и представляет собой набор колонок в компактном форм-факторе. Важной особенностью является поддержка версии rowset’ов, что обеспечивает MVCC и возможность чтения «снимков» данных на момент времени.
- Колоннарное представление: каждая колонка хранится отдельно в виде столбцовных файлов, что позволяет выполнять эффективную фильтрацию и агрегацию без загрузки неиспользуемых столбцов.
- Применение кодирования: для снижения объема данных применяются техники кодирования (dictionary encoding, run-length encoding, bit-packing и т. д.), а также компрессия на уровне строк и столбцов, адаптированная к характеру данных.
- Индексы и фильтры: Doris поддерживает zone maps и Bloom-фильтры для ускорения фильтрации. Bloom-фильтры снижают число проверок при чтении, а zone maps помогают пропускать секции файлов, не удовлетворяющих условиям запроса.
- Архитектура хранения и этапы компакции: со временем delta-rowset’ы объединяются с базовым rowset’ом через механизмы компакции (major/minor compaction), что обеспечивает устойчивую производительность чтения и уменьшение количества версий.
Компоненты хранения тесно работают с файловой системой. Doris способен работать с локальным диском, HDFS и объектными хранилищами (S3, GCS и т. п.), что обеспечивает гибкость в эксплуатации и соответствие требованиям инфраструктуры. Важной особенностью является способность делать выборку по партиционированию и по распределению данных на уровне планшета, что влияет на параллелизм выполнения запросов. Партиционирование и распределение данных по ключам влияют на геометрическую схему выполнения запросов: точный выбор ключа распределения обеспечивает локальную агрегацию и минимизацию shuffle на этапе join’ов.
- Колоннарное хранение обеспечивает меньшее I/O при сканировании столбцов, полезно для аналитических запросов.
- Rowset версия и MVCC позволяют читать стабильные снимки данных в процессе загрузки и изменений.
- Файловые форматы и кодирования уменьшают размер хранения и ускоряют сканирование за счет эффективной фильтрации столбцов.
- Интеграция с HDFS/S3 обеспечивает гибкость размещения данных и совместимость с существующими пайплайнами.
Примерно так назначаются данные и метаданные в Doris. Однако важной точкой является то, что архитектура позволяет нарастать по объему и по скорости поступления данных без существенного ухудшения скорости чтения. Комбинация MVCC, rowsets и колоннарного формата делает Doris эффективной площадкой для построения реальных витрин данных и аналитических конвейеров.
Движок обработки: vectorized execution, Nereids и кодогенерация
Движок обработки Doris строится вокруг векторизованного исполнения и продвинутого планирования. Векторизованный движок обрабатывает данные пакетами (batch-ами) по строкам и столбцам, что обеспечивает высокую пропускную способность и снижает задержки на интерпретацию выражений. Такой подход особенно эффективен в условиях больших сканов столбцов и агрегаций.
Ключевые элементы движка обработки:
- Векторизованный исполнитель: операторы сканирования, фильтрации, агрегации и соединения работают над пакетами значений, что улучшает кеш-локальность и снижает накладные расходы на интерпретацию.
- Оптимизатор Nereids: современный планировщик и оптимизатор запросов, который учитывает статистику таблиц, распределение данных, стоимость операций и доступные режимы исполнения. Nereids способен генерировать эффективные плоскости исполнения для сложных запросов, включая многокритериальные агрегации и продвинутые соединения.
- Кодогенерация: Doris использует LLVM для генерации специализированного кода на этапе исполнения запроса. Это позволяет устранить интерпретацию выражений и функций, приводя к значительному увеличению скорости выполнения.
- Runtime-фильтры: динамические фильтры, которые создаются во время исполнения и распространяются по плану для сокращения количества обрабатываемых строк на последующих стадиях выполнения.
- Выбор стратегий соединения: Doris поддерживает несколько алгоритмов соединения (hash join, sort-merge join и др.), которые выбираются в зависимости от размера входов, наличия распределения и статистики. В условиях распределенной архитектуры эффективная стратегия соединения состоит из минимизации shuffle и максимального использования локального соединения.
- Параллелизм и планирование: Doris распараллеливает планы на уровне BE-узлов и в рамках каждого узла по CPU-ядрам. Современная архитектура позволяет держать высокий уровень параллелизма даже при сложных фильтрациях и агрегациях.
Нереидс (Nereids) как часть экосистемы Doris обеспечивает значительное улучшение качества планирования за счёт использования более полной статистики, более точных оценок стоимости операций и поддержки продвинутых паттернов запросов. В комбинации с векторным движком это позволяет достигать ближе к оптимальному плану исполнения для большинства аналитических сценариев, включая сложные соединения, агрегации и множества предикатов на больших датасетах.
- Векторизация и кодогенерация уменьшают накладные расходы на обработку данных и улучшают пропускную способность.
- Runtime-фильтры и динамическая оптимизация улучшают пропуск для «горячих» запросов и ускоряют сканирование больших объемов данных.
- Совместное использование FE/BE для планирования и исполнения снимает узкие места между слоями.
Интеграции и загрузка в реальном времени: подходы к загрузке и витрины
Одной из целей Doris является поддержка реального времени витрин данных и устойчивых конвейеров аналитики. Для этого реализованы механизмы загрузки данных и интеграции с источниками, а также возможность обновлять витрины без потери времени выполнения запросов.
- Загрузка данных: Doris поддерживает пакетные загрузки (batch) и потоковую загрузку (stream load). В пакетной загрузке данные читаются из источников, преобразуются и вставляются в таблицы Doris. Потоковая загрузка предназначена для обновления витрин почти в реальном времени, когда новые данные попадают в хранилище и сразу становятся доступными для анализа.
- Потоковые источники и коннекторы: Doris обеспечивает интеграцию с различными источниками данных, включая файловые системы, облачные хранилища и коннекторы для стриминг-платформ. Это позволяет синхронизировать данные из источников в режиме near real-time и поддерживать свежесть витрин.
- Интеграция с внешними пайплайнами: в реальных проектах Doris дополняется коннекторами к Kafka, Pulsar и другим системам потоковой передачи данных, что позволяет организовать конвейеры данных от источников до витрин анализа без промежуточной задержки.
- Консистентность и транзакционность: благодаря MVCC Doris поддерживает консистентность прочитания в процессе инсерций и обновлений, обеспечивая «снимок» данных на момент запроса и минимизируя конфликты при параллельной загрузке.
- Материализованные витрины и представления: Doris позволяет создавать материализованные представления и витрины, которые автоматически обновляются по мере загрузки данных или по расписанию, что ускоряет повторные запросы и улучшает устойчивость к повторным вычислениям.
Путь загрузки и реальной консистентности тесно связан с архитектурой хранения: загрузка вызывает создание или обновление rowsets, что далее включается в план выполнения запросов. Для высокопроизводительной загрузки важно соблюдать принципы: выбор правильной политики распределения данных (hash-дистрибуция), разумный порог компрессии и режим компакции, чтобы не допускать чрезмерного fragmentation’а и долгих сканирований.
- Пакетная загрузка полезна для стационарных источников и больших батчей данных.
- Потоковая загрузка обеспечивает минимальные задержки между поступлением данных и их доступностью в витринах.
- Интеграция с внешними системами обеспечивает единое место для аналитики без дублирования конвейеров.
Эксплуатация и оптимизация: настройки, статистика и практика
Эффективная работа Doris требует внимания к архитектурным параметрам, стратегии размещения данных и мониторингу. Основные направления включают выбор ключей распределения и партиционирования, настройку компрессии и кодирования, а также использование статистики для повышения точности планирования.
- Партиционирование и распределение: выбор стратегий партиционирования по диапазонам времени или другим критериям и распределение данных по hash-ключам влияет на локализацию сканов и параллелизм выполнения. Хорошо подобранные ключи распределения снижают объем shuffle и повышают производительность соединений и агрегаций.
- Статистика таблиц: сбор статистики по колонкам и кол-во уникальных значений позволяют оптимизатору лучше оценивать стоимость операций. Регулярное обновление статистики особенно важно после массовых загрузок или изменений схемы.
- Компакция и хранение: политика компакции (minor/major) влияет на баланс между частотой обновления rowsets и временем чтения. Правильная настройка компакции уменьшает количество версий и фрагментацию, что улучшает производительность чтения.
- Runtime-фильтры и фильтрация: включение и настройка runtime-фильтров помогают ранжировать данные и отсеивать лишние блоки на этапе сканирования, что особенно важно при больших датасетах.
- Мониторинг и диагностика: системные метрики задержек, пропускной способности, загрузки CPU и IO, а также план выполнения запроса - ключ к пониманию причин узких мест. В Doris доступны инструменты для визуализации планов выполнения и статистических данных по узлам кластера.
- Монтаж новых изменений: внедрение Nereids и переход на современные техники оптимизации может потребовать адаптации существующих запросов, а также пересмотра правил индексации и стратегии распределения данных в рамках существующей среды.
Поскольку Doris поддерживает интеграцию с открытыми форматами данных, такими как Parquet, и может работать с облачными хранилищами (S3, GCS), архитектура хранения остаётся гибкой и адаптивной к требованиям проекта. Важную роль здесь играет баланс между эффективностью хранения и скоростью исполнения: выбор форматов, кодирования и стратегии компакции напрямую влияет на время сканирования и на стоимость операций ввода-вывода.
- Parquet как пример открытого столбцового формата: в Doris он хорошо сочетается с колоннарной природой хранения и поддерживает эффективную компрессію и предикат-пушдауны.
- Стабильная интеграция с облачными хранилищами позволяет снизить затраты на инфраструктуру и упростить масштабирование.
Key takeaways
- Doris разделяет роли FE и BE, что обеспечивает масштабируемость, управление метаданными и эффективное выполнение запросов.
- Колоннарное хранение, rowsets и MVCC позволяют достигать высокой скорости чтения и безопасной загрузки данных.
- Векторизованный движок и optimizer Nereids повышают производительность сложных аналитических запросов.
- Поддержка потоковой загрузки и near real-time витрин облегчает создание актуальных аналитических витрин и оперативной аналитики.
- Грамотный выбор партиционирования, распределения и сбор статистики критически влияет на производительность и стоимость исполнения запросов.
- Runtime-фильтры, кодогенерация и продвинутые методы планирования помогают снизить задержки и увеличить пропускную способность.
- Интеграции с Parquet и облачными хранилищами делают Doris удобной площадкой для построения конвейеров данных на реальном времени.
FAQ
- Какие основные компоненты архитектуры Doris и как они взаимодействуют?
Doris строится вокруг Frontend (FE) и Backend (BE). FE отвечает за метаданные, безопасность, планирование и координацию, тогда как BE осуществляет хранение данных и выполнение запросов. При работе запроса FE парсит SQL, формирует план и распределяет его между BE-узлами, которые сканируют данные, применяют фильтры и возвращают результаты обратно FE для агрегации и финального формата вывода. MVCC обеспечивает чтение консистентных снимков при параллельной загрузке и обновлениях. Векторизованный движок и Nereids улучшают скорость выполнения, а runtime-фильтры уменьшают объем сканируемых данных.
- Что такое rowset и почему он важен для храненния в Doris?
Rowset - это логический фрагмент данных внутри Tablet, содержащий столбцы в колоннарном формате. Rowset разделяет данные по версиям и позволяет эффективное обновление и удаление без полного переразнесения таблиц. Это критично для поддержки MVCC и для быстрого выполнения загрузок и обновлений, не блокируя чтение.
- Как Doris достигает высокой скорости сканирования больших таблиц?
Основной фактор - колоннарное хранение, которое позволяет считывать только необходимые столбцы. Дополнительную скорость дают zone maps и Bloom-фильтры, а также векторизованный движок, который обрабатывает данные пакетами и уменьшает накладные расходы на интерпретацию выражений. Кодогенерация с использованием LLVM further ускоряет исполнение выражений и операций агрегации.
- Что делает оптимизатор Nereids и как он влияет на планирование?
Nereids - современный оптимизатор, который учитывает статистику таблиц, распределение данных и стоимость операций. Он генерирует эффективные планы исполнения и может выбрать оптимальные стратегии соединения и агрегации. В сочетании с векторизованным исполнением это приводит к более предсказуемой и более быстрой работе сложных запросов.
- Какие методы загрузки данных поддерживает Doris и как они применяются в реальных конвейерах?
Doris поддерживает пакетную загрузку (batch) и потоковую загрузку (stream load). Пакетная загрузка удобна для больших начальных наборов данных, потоковая загрузка - для near real-time обновления витрин. Doris может интегрироваться с источниками данных через коннекторы, включая облачные хранилища и очереди сообщений, что позволяет строить непрерывные конвейеры.
- Какие механизмы консистентности обеспечивают Doris при параллельной загрузке и запросах?
Doris реализует MVCC, что дает возможность чтения стабильных снимков данных даже во время активной загрузки и обновления. Это снижает риск конфликтов и блокировок и обеспечивает предсказуемость поведения аналитических запросов.
- Как выбрать стратегию партиционирования и распределения данных?
Выбор зависит от характера запросов и объема данных. Партиционирование по диапазонам времени или другим критериям может уменьшить область сканирования, в то время как hash-дистрибуция обеспечивает равномерный распределение данных по BE-узлам и снижает contention. Регулярная актуализация статистики таблиц и анализ префиксов запросов помогают уточнить оптимальные настройки.
- Какие файлы и форматы использует Doris для хранения данных?
Doris хранит данные в колоннарном виде на уровне планшетов и rowsets. В качестве внешних форматов Doris может работать с Parquet и аналогичными столбцовыми форматами, особенно при импорте/экспорте данных. Облачные хранилища (S3, GCS) позволяют гибко организовать хранение и миграцию данных в рамках конвейеров.
- Какие сценарии эксплуатации особенно требуют внимания к оптимизации?
Сценарии с сильно агрегируемыми запросами, сложными join’ами и большими объёмами данных требуют точного подбора распределения, использования runtime-фильтров и оптимизации планов через Nereids. Также критично поддерживать актуальную статистику и разумную стратегию компакции rowsets, чтобы минимизировать задержки при сканировании.
- Какие преимущества Doris по сравнению с альтернативами в контексте реального времени и витрин?
Doris предлагает мощную комбинацию MVCC, колоннарного хранения, векторизованного исполнения и продвинутого оптимизатора. Это делает Doris особенно эффективной для построения реального времени витрин и загрузки больших объемов данных. В сочетании с интеграциями и поддержкой потоковой загрузки Doris обеспечивает устойчивая платформа для аналитики и оперативной отчетности. В сравнении с некоторыми альтернативами, Doris может давать более эффективное выполнение сканов по столбцам и стабильную консистентность данных без чрезмерной загрузки инфраструктуры.
Примечание: в контексте открытых технологий и примеров, Doris может использовать концепции и методы, схожие с теми, что применяются в других системах, например, в современных столбцовых хранилищах. При этом стоит помнить, что уникальная комбинация FE/BE, rowsets и MVCC в Doris формирует собственный набор стандартов исполнения и интеграций, адаптированных под задачи корпоративной аналитики и реального времени. При необходимости можно опираться на открытые принципы столбцового хранения и векторизованного выполнения, но конкретная реализация Doris остаётся уникальной для данной платформы.



