Apache Doris — это высокопроизводительная аналитическая база данных в режиме реального времени, основанная на архитектуре MPP. Она хорошо известна своими чрезвычайно быстрыми и простыми в использовании функциями. Для возврата результатов запроса для больших данных требуется всего лишь доля секунды. Он может не только поддерживать сценарии точечных запросов с высоким уровнем параллелизма, но и сценарии комплексного анализа с высокой пропускной способностью. Благодаря этому Apache Doris может лучше соответствовать сценариям использования, таким как анализ отчетов, специальные запросы, построение единого хранилища данных, ускорение интегрированных запросов озера данных и т. д. Пользователи могут создавать анализ поведения пользователей, платформу экспериментов AB, анализ извлечения журналов, пользовательские приложения. такие как портретный анализ и анализ заказов.
Apache Doris впервые родился как проект Palo в сфере рекламных репортажей Baidu. Его исходный код был официально открыт в 2017 году. В июле 2018 года он был передан в дар Фонду Apache для инкубации компанией Baidu. Затем он был инкубирован и разработан членами инкубатора. комитет по управлению проектом под руководством наставников Apache. В настоящее время сообщество Apache Doris собрало более 600 участников из сотен компаний из разных отраслей, а число активных участников в месяц превышает 120. В июне 2022 года Apache Doris успешно завершила инкубатор Apache и официально стала проектом верхнего уровня Apache (TLP).
Apache Doris теперь имеет широкий спектр групп пользователей в Китае и даже по всему миру. На сегодняшний день Apache Doris используется в производственных средах более чем 4000 компаний по всему миру, входящих в число 50 крупнейших интернет-компаний Китая по рынку. капитализация или оценка. Более 80% используют Apache Doris в течение длительного времени, включая Baidu, Meituan, Xiaomi, JD.com, ByteDance, Tencent, NetEase, Kuaishou, Weibo, Shell и т. д. В то же время он также имеет широкое применение в некоторых традиционных отраслях, таких как финансы, энергетика, производство, телекоммуникации и других областях.
Как показано на рисунке ниже, после различной интеграции и обработки данных источник данных обычно хранится в хранилище данных Doris в режиме реального времени и в автономном озерном хранилище (Hive, Iceberg, Apache Doris широко используется в следующих сценариях). Описание изображения
Самостоятельный анализ для аналитиков, режим запроса не фиксирован и требует высокой пропускной способности. Xiaomi создала платформу анализа роста (Growing Analytics, GA) на основе Doris, которая использует данные о поведении пользователей для проведения анализа роста бизнеса. Средняя задержка запроса составляет 10 с, задержка запроса 95-го процентиля находится в пределах 30 с, а ежедневный объем SQL-запросов. это десятки тысяч полос.
Одна платформа отвечает потребностям создания унифицированного хранилища данных и упрощает громоздкий стек программного обеспечения для работы с большими данными. Единое хранилище данных Haidilao, построенное на базе Doris, заменило старую архитектуру, состоящую из Spark, Hive, Kudu, Hbase и Phoenix, и архитектура была значительно упрощена.
Благодаря объединенному анализу данных в Hive, Iceberg и Hudi по внешнему виду производительность запросов значительно повышается без копирования данных.
Dorisобщая архитектураКак показано ниже,Doris Архитектура очень проста, всего два типа процессов.
Оба типа процессов можно масштабировать горизонтально, а один кластер может поддерживать сотни компьютеров и десятки петабайт емкости хранилища. И эти два типа процессов обеспечивают высокую доступность сервисов и высокую надежность данных посредством протоколов согласованности. Такая высокоинтегрированная архитектурная конструкция значительно снижает затраты на эксплуатацию и обслуживание распределенной системы.
существоватьиспользоватьинтерфейсаспект,Doris использовать MySQL протокол, высокая совместимость MySQL Грамматика, поддержка стандартов SQL, пользователи могут получить к нему доступ через различные клиентские инструменты. Дорис, и поддержите BI Бесшовная интеграция инструментов. Дорис В настоящее время поддерживает различные основные BI продукты, включая, помимо прочего, SmartBI、DataEase、FineBI、Tableau、Power BI、SuperSet Подождите, пока он поддерживает MySQL согласованный BI Инструменты, Дорис Его можно использовать в качестве источника данных для поддержки запросов.
существоватьдвигатель храненияаспект,Doris Использование хранилища формата столбца, сжатие данных с кодированием и чтением по столбцу позволяет добиться чрезвычайно высокого коэффициента сжатия, одновременно сокращая большое количество ненужных сканирований данных, тем самым увеличивая IO и CPU ресурс.
Doris такжеподдерживатьотносительно богатыйизСтруктура индекса,Чтобы сократить сканирование данных:
существоватьмодель храненияаспект,Doris Он поддерживает несколько моделей хранения и оптимизирован для различных сценариев:
Doris такжеподдерживать Сильная консистенцияизматериализованный вид,материализованный Обновления и выбор видизов производятся автоматически внутри системы и не требуют ручного выбора пользователем, тем самым значительно сокращая количество материализованных вид Техобслуживание из стоимости.
существоватьмеханизм запросоваспект,Doris использовать MPP из Модель, параллельное выполнение между узлами и внутри узлов, также поддерживается Несколько больших таблиц, распределенный стиль Shuffle Присоединяйтесь, чтобы лучше обрабатывать сложные запросы.
Doris механизм запросовдаВекторизменятьмеханизм запросов,Все структуры памяти могут быть расположены в столбчатом формате.,Возможность значительно сократить вызовы виртуальных функций.、продвигать Cache Скорость попадания, эффективное использование SIMD инструкцияиз Эффект。Производительность в сценариях агрегации широких таблиц невекторизована в 5-10 раз.
Doris использовать Понятно Adaptive Query Execution технология, может быть основано на Runtime Statistics для динамической корректировки плана выполнения, например, посредством Runtime Filter Технология может генерировать во время выполнения Filter подтолкнуть к Probe сторону и иметь возможность Filter Автоматически проникать в Probe нижняя сторона Scan узлах, тем самым значительно уменьшая Probe объем данных, ускорение Join производительность. Дорис из Runtime Filter поддерживать In/Min/Max/Bloom Filter。
На стороне оптимизатора Doris использовать CBO и RBO объединитьизотличныйизменять Стратегия,RBO поддерживают свертывание констант, перезапись подзапросов, перемещение предикатов и т. д., CBO поддерживать Join Переупорядочить. в настоящий момент CBO возвращатьсясуществовать持续отличныйизменятьсередина,Основное внимание уделяется более точному сбору статистической информации и ее получению.,Более точная оценка цен и другие аспекты.
В существующем Дорисе данные логически описаны в виде таблицы.
Row & Column
Таблица включает в себя строки и столбцы:
Column Можно разделить на две основные категории: Ключевые и Ценить. С точки зрения бизнеса, Кей и Value Они могут соответственно соответствовать столбцам измерений и индикаторам. Столбец Doris iskey — это столбец «из», указанный в операторе создания таблицы, а ключевое слово «уникальный» — в операторе создания таблицы. ключ» или «агрегат» ключ» или «дубликат Столбец «из» после «ключевого» является ключевым столбцом. В дополнение к ключевому столбцу, оставшийся «из» представляет собой значение «Список». Те же столбцы и строки будут объединены в одну строку. в Value Метод агрегирования столбцов задается пользователем при создании таблицы. о Для получения дополнительной информации о модели представления представлений см. Doris Модель данных.
Tablet & Partition
существовать Doris издвигатель При хранении пользовательские данные горизонтально делятся на несколько порций (таблетки, также называемые корзинами данных). каждый Tablet Содержит несколько строк данных. каждый Tablet Нет пересечения между изданными существующими и физически независимыми хранилищами.
Несколько Tablet существуют логически принадлежат разным из Разделов (Разделов). один Tablet Принадлежит только одному Раздел. И один Partition Содержит несколько Таблетка. потому что Tablet существующее хранилище является физически независимым хранилищем, поэтому его можно рассматривать как Partition существование также физически независимо. Таблетка Перемещение, копирование и другие операции данных из наименьшей физической единицы хранения.
несколько Partition сформировать Table。Partition Его можно рассматривать как наименьшую логическую единицу управления. данныеиз импорта и удаления, только для одного Partition руководить.
Проиллюстрируем операцию создания таблицы. Doris изданныеразделять。
Doris из создания таблицы — это одна команда синхронизации. Результат будет возвращен после завершения выполнения SQL. Если команда завершается успешно, это означает, что создание таблицы выполнено успешно. Подробную информацию о синтаксисе создания таблиц см. в разделе CREATE. ТАБЛИЦА, вы также можете пройти HELP CREATE TABLE; См. дополнительную помощь.
В этом разделе используется пример, чтобы представить Doris из Способ создания таблицы。
-- Range Partition
CREATE TABLE IF NOT EXISTS example_db.example_range_tbl
(
`user_id` LARGEINT NOT NULL COMMENT "ID пользователя",
`date` DATE NOT NULL COMMENT "данныевведите дату и время",
`timestamp` DATETIME NOT NULL COMMENT "данныезаполнить из метки времени",
`city` VARCHAR(20) COMMENT «Город пользователя»,
`age` SMALLINT COMMENT "Пользователь ГодAGE",
`sex` TINYINT COMMENT "пол пользователя",
`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT «Время последнего доступа пользователя»,
`cost` BIGINT SUM DEFAULT "0" COMMENT «Общее потребление пользователей»,
`max_dwell_time` INT MAX DEFAULT "0" COMMENT «Максимальное время пребывания пользователя»,
`min_dwell_time` INT MIN DEFAULT "99999" COMMENT «Минимальное время пребывания пользователя»
)
ENGINE=OLAP
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
"replication_num" = "3",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2018-01-01 12:00:00"
);
-- List Partition
CREATE TABLE IF NOT EXISTS example_db.example_list_tbl
(
`user_id` LARGEINT NOT NULL COMMENT "ID пользователя",
`date` DATE NOT NULL COMMENT "данныевведите дату и время",
`timestamp` DATETIME NOT NULL COMMENT "данныезаполнить из метки времени",
`city` VARCHAR(20) NOT NULL COMMENT «Город пользователя»,
`age` SMALLINT COMMENT "Пользователь ГодAGE",
`sex` TINYINT COMMENT "пол пользователя",
`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT «Время последнего доступа пользователя»,
`cost` BIGINT SUM DEFAULT "0" COMMENT «Общее потребление пользователей»,
`max_dwell_time` INT MAX DEFAULT "0" COMMENT «Максимальное время пребывания пользователя»,
`min_dwell_time` INT MIN DEFAULT "99999" COMMENT «Минимальное время пребывания пользователя»
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY LIST(`city`)
(
PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
PARTITION `p_jp` VALUES IN ("Tokyo")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
"replication_num" = "3",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2018-01-01 12:00:00"
);
Определение столбца
Здесь мы используем только AGGREGATE KEY Модель данных объясняется в качестве примера. Посмотреть больше моделей данных Doris Модель данных.
столбцызбазовый тип,Можетпроходитьсуществовать mysql-client казнен в HELP CREATE TABLE; Проверять.
AGGREGATE KEY В DataModel все имеют и имеют указание метода агрегирования (SUM, REPLACE, MAX, MIN) и из списка для просмотра. Key Список. пока остальные Value Список.
При определении столбцов можно воспользоваться следующими предложениями:
Разделы
Doris владения разделены на два изданных этажа. Первый слой Partition,поддерживать Range и List из Разделяющий метод. Второй слой Bucket(Tablet),поддерживать Hash и Random из Разделяющий метод.
Вы также можете нанести только один слой Раздела.,При создании таблицы только не пишите заявление Разделиз.,В это время Дорис сгенерирует один из Раздел по умолчанию.,Это прозрачно для пользователей. сипользовать, когда один слой Раздела,Толькоподдерживать Bucket разделять. Давайте введем разделение и сегментирование соответственно:
Partition
Раздел диапазона
FROM(...) TO (...) INTERVAL ...
создавать Раздел в пакетном режиме.
проходить VALUES […) Легче понять одновременное указание верхней и нижней границ. Вот пример, когда использовать оператор VALUES LESS THAN (…) при добавлении или удалении Разделиз,Раздел диапазона изменений:
Как показано в примере example_range_tbl выше, после завершения создания таблицы будут автоматически созданы следующие три раздела:
p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)
Когда мы добавляем раздел p201705 ЗНАЧЕНИЯ МЕНЬШЕ («2017-06-01»), результаты раздела следующие:
p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)
p201705: [2017-04-01, 2017-06-01)
На этом этапе мы удаляем раздел p201703, и результаты раздела следующие:
p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)
заметил p201702 и p201705 Дальность из Раздел не изменилась, а между двумя Разделами появилась дыра: [2017-03-01, 01.04.2017). То есть в пустом диапазоне, если существуют изданные диапазон импорта, это Невозможно. импортироватьиз。
Продолжайте удалять раздел p201702, результаты раздела следующие:
p201701: [MIN_VALUE, 2017-02-01)
p201705: [2017-04-01, 2017-06-01)
Диапазон отверстий становится: [2017-02-01, 2017-04-01)
сейчассуществовать Увеличиватьодин Раздел p201702new VALUES LESS THAN («2017-03-01»), результаты раздела следующие:
p201701: [MIN_VALUE, 2017-02-01)
p201702new: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)
Видно, что объем дыры уменьшился до: [2017-03-01, 2017-04-01)
сейчассуществоватьудалить Раздел p201701 и добавьте раздел p201612 VALUES LESS THAN («01.01.2017»), результаты раздела следующие:
p201612: [MIN_VALUE, 2017-01-01)
p201702new: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)
То есть появилась новая дырка: [2017-01-01, 2017-02-01)
Подводить итоги,Удаление Разделиз не изменит диапазон существующих существующих Разделиз. Удаление Раздела может привести к появлению дыр. ЗНАЧЕНИЯ МЕНЬШЕ ЧЕМ при добавлении Раздела в оператор,Нижнее царство Разделиз непосредственно примыкает к верхнему царству Один Разделиз.
Диапазон Раздел В дополнение к вышесказанному мы видим Раздел из одного столбца, также поддерживаемый Раздел из нескольких столбцов, примеры следующие:
PARTITION BY RANGE(`date`, `id`)
(
PARTITION `p201701_1000` VALUES LESS THAN ("2017-02-01", "1000"),
PARTITION `p201702_2000` VALUES LESS THAN ("2017-03-01", "2000"),
PARTITION `p201703_all` VALUES LESS THAN ("2017-04-01")
)
существуют. В приведенном выше примере мы указываем date(DATE тип) и id(INT тип) Сделать для Раздел Список. В конечном итоге приведенный выше пример приводит к следующему результату:
* p201701_1000: [(MIN_VALUE, MIN_VALUE), ("2017-02-01", "1000") )
* p201702_2000: [("2017-02-01", "1000"), ("2017-03-01", "2000") )
* p201703_all: [("2017-03-01", "2000"), ("2017-04-01", MIN_VALUE))
Обратите внимание, что по умолчанию пользователь указывает только последний раздел. date столбец из Раздел значения, поэтому id Значения столбца Из Раздел будут заполнены по умолчанию. MIN_VALUE。когда пользователь вводит данные,Значения столбца «Раздел» будут сравниваться по порядку.,Наконец-то получил соответствующий из Раздел. Примеры следующие:
* данные --> Раздел
* 2017-01-01, 200 --> p201701_1000
* 2017-01-01, 2000 --> p201701_1000
* 2017-02-01, 100 --> p201701_1000
* 2017-02-01, 2000 --> p201702_2000
* 2017-02-15, 5000 --> p201702_2000
* 2017-03-01, 2000 --> p201703_all
* 2017-03-10, 1 --> p201703_all
* 2017-04-01, 1000 --> Невозможно импортировать
* 2017-05-01, 1000 --> Невозможно импортировать
RangeРазделтакой жеподдерживатьпартия Раздел, проходитьзаявление FROM (“2022-01-03”) TO (“2022-01-06”) INTERVAL 1 DAY Создание пакета разделено по дням: с 03.01.2022 по 06.01.2022 (исключая 06.01.2022), результаты следующие:
p20220103: [2022-01-03, 2022-01-04) p20220104: [2022-01-04, 2022-01-05) p20220105: [2022-01-05, 2022-01-06)
Раздел списка
Раздел Списокподдерживать BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR Тип данных, значение раздела — это значение перечисления. Раздел может быть затронут только в том случае, если данные являются одним из значений перечисления целевого раздела.
Раздел поддерживаетпроходить VALUES IN (…), чтобы указать, что каждый раздел содержит значения перечисления.
приведите пример ниже,При выполнении операций добавления и удаления на Разделиз,Разделиз изменить.
Как показано в примере example_list_tbl выше, когда создание таблицы будет завершено, автоматически будут созданы следующие три раздела:
p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San Francisco”) p_jp: (“Tokyo”)
Когда мы добавляем раздел p_uk VALUES IN («Лондон»), результаты раздела следующие:
p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San Francisco”) p_jp: (“Tokyo”) p_uk: (“London”)
Когда мы удаляем раздел p_jp, результат раздела следующий:
p_cn: (“Beijing”, “Shanghai”, “Hong Kong”) p_usa: (“New York”, “San Francisco”) p_uk: (“London”)
Раздел Раздела также поддерживает несколько столбцов Раздела, пример следующий:
PARTITION BY LIST(
id
,city
) ( PARTITIONp1_city
VALUES IN ((“1”, “Beijing”), (“1”, “Shanghai”)), PARTITIONp2_city
VALUES IN ((“2”, “Beijing”), (“2”, “Shanghai”)), PARTITIONp3_city
VALUES IN ((“3”, “Beijing”), (“3”, “Shanghai”)) )
существуют. В приведенном выше примере мы указываем id(INT тип) и city(VARCHAR тип) Сделать для Раздел Список. В конечном итоге приведенный выше пример приводит к следующему результату:
когда пользователь вводит данные,Значения столбца «Раздел» будут сравниваться по порядку.,Наконец-то получил соответствующий из Раздел. Примеры следующие:
Bucket
о Перегородка и Ведро из Количества и данные Количество из Рекомендации
о Случайное распределение настроек и использование сцен.
Составное разбиение и одиночное разбиение
Составной раздел
Рекомендуются следующие сценариииспользовать Составной раздел
ENGINE В этом примере ДВИГАТЕЛЬ из типа олап, по умолчанию ENGINE тип。существовать Doris во,только это ENGINE Тип задается Doris Ответственныйданныеуправлятьихранилищеиз。другой ENGINE Тип, например mysql、broker、es И т. д., по сути просто сопоставляя внешнюю другую библиотеку или таблицу из системы, чтобы гарантировать Doris Эти данные можно прочитать. и Doris Он не создает и не управляет какими-либо не- olap ENGINE типизповерхностьиданные。
другой
IF NOT EXISTS
Это значит, что еслииметь ранее не создавала таблицу, то создайте ее. Обратите внимание, что это только определяет, существует ли имя таблицы, но не определяет, совпадает ли вновь созданная структура таблицы с существующей структурой существующей таблицы. Поэтому, если сохраняется один существующий объект с тем же именем, но с другой структурой таблицы, команда также вернет успех, но это не означает, что была создана новая таблица и новая структура.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.