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

Compaction для кластеров Shared-data

Эта тема описывает, как управлять compaction в кластерах shared-data Selena.

Обзор

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

Compaction Score

Обзор

Compaction Score отражает статус объединения файлов данных в разделе. Более высокий балл указывает на более низкий прогресс объединения, что означает, что раздел имеет больше необъединенных версий файлов данных. FE поддерживает информацию о Compaction Score для каждого раздела, включая Max Compaction Score (самый высокий балл среди всех tablet в разделе).

Если Max Compaction Score раздела ниже параметра FE lake_compaction_score_selector_min_score (по умолчанию: 10), compaction для этого раздела считается завершенным. Max Compaction Score, превышающий 100, указывает на нездоровое состояние compaction. Когда балл превышает параметр FE lake_ingest_slowdown_threshold (по умолчанию: 100), система замедляет коммиты транзакций загрузки данных для раздела. Если он превышает lake_compaction_score_upper_bound (по умолчанию: 2000), система блокирует транзакции импорта для раздела.

Правила расчета

Обычно каждый файл данных вносит 1 в Compaction Score. Например, если раздел имеет один tablet и 10 файлов данных, сгенерированных из первой операции загрузки, Max Compaction Score раздела равен 10. Все файлы данных, сгенерированные транзакцией в пределах tablet, группируются как Rowset.

Во время расчета балла Rowset tablet группируются по размеру, и группа с наибольшим количеством файлов определяет Compaction Score tablet.

Например, tablet проходит 7 операций загрузки, генерируя Rowset с размерами: 100 МБ, 100 МБ, 100 МБ, 10 МБ, 10 МБ, 10 МБ и 10 МБ. Во время расчета система объединит три Rowset по 100 МБ в одну группу и четыре Rowset по 10 МБ в другую. Compaction Score рассчитывается на основе группы с большим количеством файлов. В этом случае вторая группа имеет больший compaction score. Compaction приоритизирует группу с более высоким баллом, поэтому после первого compaction распределение Rowset будет: 100 МБ, 100 МБ, 100 МБ и 40 МБ.

Рабочий процесс Compaction

Для кластеров shared-data Selena вводит новый механизм compaction, контролируемый FE:

  1. Расчет балла: Узел Leader FE рассчитывает и сохраняет Compaction Score для разделов на основе результатов публикации транзакций.
  2. Выбор кандидатов: FE выбирает разделы с наивысшими Max Compaction Score в качестве кандидатов для compaction.
  3. Генерация задач: FE инициирует транзакции compaction для выбранных разделов, генерирует подзадачи уровня tablet и отправляет их на Compute Nodes (CN) до достижения лимита, установленного параметром FE lake_compaction_max_tasks.
  4. Выполнение подзадач: CN выполняют подзадачи compaction в фоновом режиме. Количество одновременных подзадач на CN контролируется параметром CN compact_threads.
  5. Сбор результатов: FE агрегирует результаты подзадач и коммитит транзакцию compaction.
  6. Публикация: FE публикует успешно закоммиченную транзакцию compaction.

Управление compaction

Просмотр compaction scores

  • Вы можете просмотреть compaction scores разделов в конкретной таблице, используя оператор SHOW PROC.

    SHOW PROC '/dbs/<database_name>/<table_name>/partitions'

    Пример:

    mysql> SHOW PROC '/dbs/load_benchmark/store_sales/partitions';
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    | PartitionId | PartitionName | CompactVersion | VisibleVersion | NextVersion | State | PartitionKey | Range | DistributionKey | Buckets | DataSize | RowCount | CacheTTL | AsyncWrite | AvgCS | P50CS | MaxCS |
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    | 38028 | store_sales | 913 | 921 | 923 | NORMAL | | | ss_item_sk, ss_ticket_number | 64 | 15.6GB | 273857126 | 2592000 | false | 10.00 | 10.00 | 10.00 |
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    1 row in set (0.20 sec)
  • Вы также можете просмотреть compaction scores разделов, запросив системное представление information_schema.partitions_meta.

    Пример:

    mysql> SELECT * FROM information_schema.partitions_meta ORDER BY Max_CS LIMIT 10;
    +--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
    | DB_NAME | TABLE_NAME | PARTITION_NAME | PARTITION_ID | COMPACT_VERSION | VISIBLE_VERSION | VISIBLE_VERSION_TIME | NEXT_VERSION | PARTITION_KEY | PARTITION_VALUE | DISTRIBUTION_KEY | BUCKETS | REPLICATION_NUM | STORAGE_MEDIUM | COOLDOWN_TIME | LAST_CONSISTENCY_CHECK_TIME | IS_IN_MEMORY | IS_TEMP | DATA_SIZE | ROW_COUNT | ENABLE_DATACACHE | AVG_CS | P50_CS | MAX_CS | STORAGE_PATH |
    +--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
    | tpcds_1t | call_center | call_center | 11905 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | cc_call_center_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 12.3KB | 42 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11906/11905 |
    | tpcds_1t | web_returns | web_returns | 12030 | 3 | 3 | 2024-03-17 08:40:48 | 4 | | | wr_item_sk, wr_order_number | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 3.5GB | 71997522 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/12031/12030 |
    | tpcds_1t | warehouse | warehouse | 11847 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | w_warehouse_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 4.2KB | 20 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11848/11847 |
    | tpcds_1t | ship_mode | ship_mode | 11851 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | sm_ship_mode_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 1.7KB | 20 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11852/11851 |
    | tpcds_1t | customer_address | customer_address | 11790 | 0 | 2 | 2024-03-17 08:32:19 | 3 | | | ca_address_sk | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 120.9MB | 6000000 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11791/11790 |
    | tpcds_1t | time_dim | time_dim | 11855 | 0 | 2 | 2024-03-17 08:30:48 | 3 | | | t_time_sk | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 864.7KB | 86400 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11856/11855 |
    | tpcds_1t | web_sales | web_sales | 12049 | 3 | 3 | 2024-03-17 10:14:20 | 4 | | | ws_item_sk, ws_order_number | 128 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 47.7GB | 720000376 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/12050/12049 |
    | tpcds_1t | store | store | 11901 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | s_store_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 95.6KB | 1002 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11902/11901 |
    | tpcds_1t | web_site | web_site | 11928 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | web_site_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 13.4KB | 54 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11929/11928 |
    | tpcds_1t | household_demographics | household_demographics | 11932 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | hd_demo_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 2.1KB | 7200 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11933/11932 |
    +--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+

Вам нужно сосредоточиться только на следующих двух метриках:

  • AvgCS: Средний compaction score всех tablet в разделе.
  • MaxCS: Максимальный compaction score среди всех tablet в разделе.

Просмотр задач compaction

По мере загрузки новых данных в систему FE постоянно планирует задачи compaction для выполнения на разных узлах CN. Вы можете сначала просмотреть общий статус задач compaction на FE, а затем просмотреть детали выполнения каждой задачи на CN.

Просмотр общего статуса задач compaction

Вы можете просмотреть общий статус задач compaction, используя оператор SHOW PROC.

SHOW PROC '/compactions';

Пример:

mysql> SHOW PROC '/compactions';
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+
| Partition | TxnID | StartTime | CommitTime | FinishTime | Error | Profile |
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+
| ssb.lineorder.43026 | 51053 | 2024-09-24 19:15:16 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43027 | 51052 | 2024-09-24 19:15:16 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43025 | 51047 | 2024-09-24 19:15:15 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43026 | 51046 | 2024-09-24 19:15:04 | 2024-09-24 19:15:06 | 2024-09-24 19:15:06 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
| ssb.lineorder.43027 | 51045 | 2024-09-24 19:15:04 | 2024-09-24 19:15:06 | 2024-09-24 19:15:06 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
| ssb.lineorder.43029 | 51044 | 2024-09-24 19:15:03 | 2024-09-24 19:15:05 | 2024-09-24 19:15:05 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+

Возвращаются следующие поля:

  • Partition: Раздел, к которому принадлежит задача compaction.
  • TxnID: ID транзакции, назначенный задаче compaction.
  • StartTime: Время начала задачи compaction. NULL указывает, что задача еще не была инициирована.
  • CommitTime: Время коммита данных задачей compaction. NULL указывает, что данные еще не были закоммичены.
  • FinishTime: Время публикации данных задачей compaction. NULL указывает, что данные еще не были опубликованы.
  • Error: Сообщение об ошибке (если есть) задачи compaction.
  • Profile: (поддерживается с v3.2.12 и v3.3.4) Profile задачи compaction после завершения.
    • sub_task_count: Количество подзадач (эквивалентно tablet) в разделе.
    • read_local_sec: Общее время потребления всех подзадач на чтение данных из локального кэша. Единица: Секунды.
    • read_local_mb: Общий размер данных, прочитанных из локального кэша всеми подзадачами. Единица: МБ.
    • read_remote_sec: Общее время потребления всех подзадач на чтение данных из удаленного хранилища. Единица: Секунды.
    • read_remote_mb: Общий размер данных, прочитанных из удаленного хранилища всеми подзадачами. Единица: МБ.
    • in_queue_sec: Общее время пребывания всех подзадач в очереди. Единица: Секунды.

Просмотр деталей выполнения задач compaction

Каждая задача compaction разделена на несколько подзадач, каждая из которых соответствует tablet. Вы можете просмотреть детали выполнения каждой подзадачи, запросив системное представление information_schema.be_cloud_native_compactions.

Пример:

mysql> SELECT * FROM information_schema.be_cloud_native_compactions;
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| BE_ID | TXN_ID | TABLET_ID | VERSION | SKIPPED | RUNS | START_TIME | FINISH_TIME | PROGRESS | STATUS | PROFILE |
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10001 | 51047 | 43034 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51048 | 43032 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":32,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51049 | 43033 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51051 | 43038 | 9 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 84 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51052 | 43036 | 12 | 0 | 0 | NULL | NULL | 0 | | |
| 10001 | 51053 | 43035 | 12 | 0 | 1 | 2024-09-24 19:15:16 | NULL | 2 | | {"read_local_sec":0,"read_local_mb":1,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":100,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Возвращаются следующие поля:

  • BE_ID: ID CN.
  • TXN_ID: ID транзакции, к которой принадлежит подзадача.
  • TABLET_ID: ID tablet, к которому принадлежит подзадача.
  • VERSION: Версия tablet.
  • RUNS: Количество раз выполнения подзадачи.
  • START_TIME: Время начала подзадачи.
  • FINISH_TIME: Время завершения подзадачи.
  • PROGRESS: Прогресс compaction tablet в процентах.
  • STATUS: Статус подзадачи. Сообщения об ошибках будут возвращены в этом поле при наличии ошибки.
  • PROFILE: (поддерживается с v3.2.12 и v3.3.4) Профиль времени выполнения подзадачи.
    • read_local_sec: Время потребления подзадачи на чтение данных из локального кэша. Единица: Секунды.
    • read_local_mb: Размер данных, прочитанных из локального кэша подзадачей. Единица: МБ.
    • read_remote_sec: Время потребления подзадачи на чтение данных из удаленного хранилища. Единица: Секунды.
    • read_remote_mb: Размер данных, прочитанных из удаленного хранилища подзадачей. Единица: МБ.
    • read_local_count: Количество раз чтения данных подзадачей из локального кэша.
    • read_remote_count: Количество раз чтения данных подзадачей из удаленного хранилища.
    • in_queue_sec: Время пребывания подзадачи в очереди. Единица: Секунды.

Настройка задач compaction

Вы можете настроить задачи compaction, используя эти параметры FE и CN (BE).

Параметр FE

Вы можете динамически настроить следующий параметр FE.

ADMIN SET FRONTEND CONFIG ("lake_compaction_max_tasks" = "-1");
lake_compaction_max_tasks
  • По умолчанию: -1
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество одновременных задач Compaction, разрешенных в кластере shared-data. Установка этого элемента в -1 указывает на расчет количества одновременных задач адаптивным способом, то есть количество выживших узлов CN, умноженное на 16. Установка этого значения в 0 отключит compaction.
  • Введен в: v3.1.0
ADMIN SET FRONTEND CONFIG ("lake_compaction_disable_tables" = "11111;22222");
lake_compaction_disable_tables
  • По умолчанию: ""
  • Тип: String
  • Единица: -
  • Изменяемый: Да
  • Описание: Отключить compaction для определенных таблиц. Это не повлияет на уже начавшийся compaction. Значение этого элемента - ID таблицы. Несколько значений разделяются ';'.
  • Введен в: v3.2.7

Параметры CN

Вы можете динамически настроить следующий параметр CN.

UPDATE information_schema.be_configs SET VALUE = 8 
WHERE name = "compact_threads";
compact_threads
  • По умолчанию: 4
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество потоков, используемых для одновременных задач compaction. Эта конфигурация изменена на динамическую с v3.1.7 и v3.2.2 и далее.
  • Введен в: v3.0.0

ПРИМЕЧАНИЕ

В продакшене рекомендуется установить compact_threads на 25% от количества ядер CPU BE/CN.

max_cumulative_compaction_num_singleton_deltas
  • По умолчанию: 500
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество сегментов, которые могут быть объединены в одном Cumulative Compaction. Вы можете уменьшить это значение, если во время compaction возникает OOM.
  • Введен в: -

ПРИМЕЧАНИЕ

В продакшене рекомендуется установить max_cumulative_compaction_num_singleton_deltas на 100 для ускорения задач compaction и уменьшения их потребления ресурсов.

lake_pk_compaction_max_input_rowsets
  • По умолчанию: 500
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество входных rowsets, разрешенных в задаче compaction таблицы Primary Key в кластере shared-data. Значение по умолчанию этого параметра изменено с 5 на 1000 с v3.2.4 и v3.1.10, и на 500 с v3.3.1 и v3.2.9. После включения политики Sized-tiered Compaction для таблиц Primary Key (установкой enable_pk_size_tiered_compaction_strategy в true), Selena не нужно ограничивать количество rowsets для каждого compaction для уменьшения усиления записи. Поэтому значение по умолчанию этого параметра увеличено.
  • Введен в: v3.1.8, v3.2.3

Ручной запуск задач compaction

-- Запустить compaction для всей таблицы.
ALTER TABLE <table_name> COMPACT;
-- Запустить compaction для конкретного раздела.
ALTER TABLE <table_name> COMPACT <partition_name>;
-- Запустить compaction для нескольких разделов.
ALTER TABLE <table_name> COMPACT (<partition_name>, <partition_name>, ...);

Отмена задач compaction

Вы можете вручную отменить задачу compaction, используя ID транзакции задачи.

CANCEL COMPACTION WHERE TXN_ID = <TXN_ID>;

ПРИМЕЧАНИЕ

  • Оператор CANCEL COMPACTION должен быть отправлен с узла Leader FE.
  • Оператор CANCEL COMPACTION применяется только к транзакциям, которые не были закоммичены, то есть CommitTime равно NULL в возврате SHOW PROC '/compactions'.
  • CANCEL COMPACTION - это асинхронный процесс. Вы можете проверить, отменена ли задача, выполнив SHOW PROC '/compactions'.

Лучшие практики

Поскольку Compaction критически важен для производительности запросов, рекомендуется регулярно отслеживать статус объединения данных таблиц и разделов. Вот некоторые лучшие практики и рекомендации:

  • Старайтесь увеличивать временной интервал между загрузками (избегайте сценариев с интервалами менее 10 секунд) и увеличивайте размер пакета на загрузку (избегайте размеров пакетов менее 100 строк данных).
  • Настройте количество параллельных рабочих потоков compaction на CN для ускорения выполнения задач. Рекомендуется установить compact_threads на 25% от количества ядер CPU BE/CN в продакшн-среде. Когда кластер простаивает (например, выполняет только compaction и не обрабатывает запросы), вы можете временно увеличить это значение до 50% и вернуть к 25% после завершения задачи.
  • Отслеживайте статус задач Compaction, используя show proc '/compactions' и select * from information_schema.be_cloud_native_compactions;.
  • Отслеживайте Compaction Score и настройте оповещения на его основе. Встроенный шаблон мониторинга Grafana Selena включает эту метрику.
  • Обращайте внимание на потребление ресурсов во время compaction, особенно на использование памяти. Шаблон мониторинга Grafana также включает эту метрику.