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

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

Выберите режим управления партициями

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы создать таблицу с динамическим партиционированием, укажите свойства 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]"
);