Перейти к содержимому
Последнее обновление

Динамическое партиционирование

Выбор режима управления разделами

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

Динамическое партиционирование добавляет и удаляет разделы в соответствии с настроенными правилами, обеспечивая управление жизненным циклом разделов таблиц (TTL) и снижая нагрузку на хранилище. При работе с журналами и временными рядами динамическое партиционирование обычно используют для регулярного удаления данных с истёкшим сроком хранения.

Сценарии применения​

СценарийОписание
Управление данными журналовХранение журналов за последние N дней с разбиением по дням или часам и автоматическим удалением устаревших разделов
Управление временными рядамиАвтоматическое обслуживание разделов по времени для мониторинга, IoT и подобных задач
Управление жизненным циклом данныхОграничение периода хранения данных с помощью TTL и сокращение затрат на хранение
Предварительное создание будущих разделовСоздание разделов на следующие N дней заранее, чтобы избежать ошибок записи из-за отсутствующих разделов

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

  • Единица времени планирования dynamic_partition.time_unit имеет значение DAY, поэтому разделы организованы по дням.
  • Начальное смещение dynamic_partition.start имеет значение -1, что позволяет сохранять раздел за предыдущий день.
  • Конечное смещение dynamic_partition.end имеет значение 2, что позволяет сохранять разделы на следующие два дня.

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

Динамическое партиционирование

Ограничения​

При использовании динамического партиционирования действуют следующие ограничения:

  • Динамическое партиционирование поддерживает только партиционирование Range по столбцам DATE, DATETIME или TIMESTAMP_NS.
  • Динамическое партиционирование поддерживает только один ключ партиционирования.

Создание таблицы с динамическим партиционированием​

Чтобы создать таблицу с динамическим партиционированием, укажите свойства dynamic_partition при создании таблицы:

CREATE TABLE test_dynamic_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);

Подробнее о параметрах dynamic_partition см. в разделе Свойства динамического партиционирования.

Управление динамическими разделами​

Изменение свойств динамического партиционирования​

Совет

Изменения динамических разделов, внесённые с помощью оператора ALTER TABLE, вступают в силу не сразу. Doris проверяет динамические разделы с интервалом, заданным параметром dynamic_partition_check_interval_seconds, и выполняет необходимые операции создания и удаления разделов.

В следующем примере оператор ALTER TABLE преобразует таблицу с обычным партиционированием в таблицу с динамическим партиционированием:

CREATE TABLE test_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10;

ALTER TABLE test_partition SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);

Просмотр состояния планирования динамических разделов​

Используйте SHOW-DYNAMIC-PARTITION, чтобы просмотреть состояние планирования всех таблиц с динамическим партиционированием в текущей базе данных:

SHOW DYNAMIC PARTITION TABLES;
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] |
| d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
7 rows in set (0.02 sec)

Управление историческими разделами​

Если количество динамических разделов задано свойствами start и end, исторические разделы по умолчанию не создаются, чтобы избежать длительного ожидания при одновременном создании всех разделов. Создаются только разделы для времени после текущего момента. Чтобы создать все разделы сразу, включите параметр create_history_partition.

Например, если текущая дата 2024-10-11 и заданы start = -2, end = 2:

  • При create_history_partition = true немедленно создаются 5 разделов для диапазона [10-09, 10-13].
  • При create_history_partition = false создаются только 3 раздела для диапазона [10-11, 10-13].

Параметры динамического партиционирования​

Свойства динамического партиционирования​

Параметры правил динамического партиционирования используют префикс dynamic_partition. Доступны следующие параметры правил:

ПараметрОбязательныйОписание
dynamic_partition.enableНетОпределяет, включено ли динамическое партиционирование. Допустимые значения: TRUE и FALSE. Если указаны другие обязательные параметры динамического партиционирования, по умолчанию используется TRUE.
dynamic_partition.time_unitДаЕдиница времени планирования динамического партиционирования. Допустимые значения: HOUR, DAY, WEEK, MONTH и YEAR. Они означают, что разделы создаются или удаляются по часам, дням, неделям, месяцам или годам соответственно.
dynamic_partition.startНетНачальное смещение для динамического партиционирования, выраженное отрицательным числом. Значение по умолчанию: -2147483648, при котором исторические разделы не удаляются. С учётом свойства time_unit удаляются разделы, диапазоны которых находятся до этого смещения относительно текущего дня (недели / месяца). Создание отсутствующих исторических разделов между этим смещением и текущим моментом определяется параметром dynamic_partition.create_history_partition.
dynamic_partition.endДаКонечное смещение для динамического партиционирования, выраженное положительным числом. С учётом свойства time_unit разделы для соответствующего диапазона заранее создаются относительно текущего дня (недели / месяца).
dynamic_partition.prefixДаПрефикс имён динамически создаваемых разделов.
dynamic_partition.bucketsНетКоличество бакетов для динамически создаваемых разделов. Этот параметр переопределяет количество бакетов, указанное в DISTRIBUTED.
dynamic_partition.replication_numНетКоличество реплик для динамически создаваемых разделов. Если параметр не задан, используется количество реплик, указанное при создании таблицы.
dynamic_partition.create_history_partitionНетЗначение по умолчанию: false. При значении true Doris автоматически создаёт все разделы по правилам, описанным ниже. При этом параметр FE max_dynamic_partition_num ограничивает общее количество разделов, чтобы избежать одновременного создания слишком большого их числа. Если количество создаваемых разделов превышает max_dynamic_partition_num, операция отклоняется. Этот параметр не действует, если свойство start не задано.
dynamic_partition.history_partition_numНетЕсли create_history_partition имеет значение true, этот параметр задаёт количество создаваемых исторических разделов. Значение по умолчанию: -1, что означает отсутствие настройки. Эта переменная действует так же, как dynamic_partition.start; рекомендуется задавать только одну из них.
dynamic_partition.start_day_of_weekНетЕсли time_unit имеет значение WEEK, этот параметр задаёт начало недели. Допустимый диапазон: от 1 до 7, где 1 означает понедельник, а 7 означает воскресенье. Значение по умолчанию: 1, то есть неделя начинается в понедельник.
dynamic_partition.start_day_of_monthНетЕсли time_unit имеет значение MONTH, этот параметр задаёт начало месяца. Допустимый диапазон: от 1 до 28, где 1 означает 1-е число месяца, а 28 означает 28-е число месяца. Значение по умолчанию: 1, то есть началом месяца считается 1-е число. Начало месяца с 29-го, 30-го или 31-го числа не поддерживается, чтобы избежать неоднозначности из-за високосных лет и разной продолжительности месяцев.
dynamic_partition.reserved_history_periodsНетВременные диапазоны исторических разделов, которые нужно сохранить. Если dynamic_partition.time_unit имеет значение DAY / WEEK / MONTH / YEAR, задайте значение в формате [yyyy-MM-dd,yyyy-MM-dd],[...,...]. Если dynamic_partition.time_unit имеет значение HOUR, задайте значение в формате [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...,...]. Если параметр не задан, используется значение по умолчанию "NULL".
dynamic_partition.time_zoneНетЧасовой пояс для динамического партиционирования. По умолчанию используется системный часовой пояс текущего сервера, например Asia/Shanghai. Подробнее о настройках часового пояса см. в разделе Управление часовыми поясами.

Параметры конфигурации FE​

Параметры динамического партиционирования в FE можно изменить через файл конфигурации FE или с помощью команды ADMIN SET FRONTEND CONFIG:

ПараметрПо умолчаниюОписание
dynamic_partition_enablefalseОпределяет, включено ли динамическое партиционирование в Doris. Этот параметр влияет только на операции с разделами таблиц с динамическим партиционированием и не затрагивает обычные таблицы.
dynamic_partition_check_interval_seconds600Периодичность выполнения потока динамического партиционирования в секундах.
max_dynamic_partition_num500Ограничивает максимальное количество разделов, создаваемых при создании таблицы с динамическим партиционированием, чтобы избежать одновременного создания слишком большого их числа.

Рекомендации по использованию динамического партиционирования​

Пример 1: Скользящий период хранения журналов​

Разделение по дням с сохранением данных только за последние 7 дней и текущий день, а также с предварительным созданием разделов на следующие 3 дня:

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);

Пример 2: Партиционирование по месяцам с сохранением всей истории​

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

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.start_day_of_month" = "3"
);

Пример 3: Сохранение заданных исторических временных диапазонов​

Разделение по дням с сохранением разделов за последние 10 дней и на следующие 10 дней, а также с дополнительным сохранением исторических данных за периоды [2020-06-01, 2020-06-20] и [2020-10-31, 2020-11-15]:

CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-10",
"dynamic_partition.end" = "10",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.reserved_history_periods" = "[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
);