0. Введение в StarRocks
StarRocks — это высокопроизводительная колонночная аналитическая MPP (масштабно-параллельная обработка) СУБД для широкого круга сценариев. Благодаря колонночному хранению и векторизованному движку (для x86 — инструкции AVX) она достигает предельной производительности на агрегирующих операциях, таких как GROUP BY (на одном узле: сотни миллионов строк — результат за секунды).
1. Чем StarRocks отличается от ClickHouse?
ClickHouse не оптимален для многотабличных JOIN-ов, тогда как StarRocks устраняет это узкое место.
2. Чем StarRocks отличается от Greenplum?
StarRocks — колонночный движок. На колонночном движке StarRocks значительно быстрее Greenplum. При этом сильные стороны Greenplum — строчный формат хранения и полноценная поддержка транзакций, тогда как StarRocks обеспечивает лишь атомарность операций; сложные транзакции не поддерживаются.
1 Описание Tablet
1.1 Что такое Tablet
Tablet — это логический шард таблицы. Одна таблица может иметь несколько Tablet. По умолчанию каждый Tablet имеет 3 реплики (управляется параметром FE
default_replication_num, параметр динамический; изменить можно так:ADMIN SET FRONTEND CONFIG ("default_replication_num" = "2");— применяется немедленно).StarRocks использует технологию MVCC (многоверсионное управление конкурентным доступом). За счет копирования физических реплик многоверсионных данных обеспечивается эффективное восстановление версий. Управление данными в StarRocks ведется на уровне Tablet.
1.2 Процесс записи данных
Клиент отправляет запрос на импорт данных на узел FE.
Узел FE выбирает один узел BE в качестве узла‑координатора (Coordinator BE) для данной импортной транзакции и генерирует план выполнения.
Узел‑координатор считывает у клиента данные для импорта.
Узел‑координатор распределяет данные по всем репликам соответствующих Tablet.
После загрузки и сохранения данных во все Tablet узел FE делает загруженные данные видимыми.
FE возвращает клиенту успешный результат импорта.
1.3 Управление Tablet
Метаданными Tablet управляет узел FE; при росте числа Tablet требуется соответствующим образом настраивать объём памяти JVM, чтобы обеспечить их управление.
Слишком большое количество Tablet увеличивает затраты ресурсов на управление метаданными и диспетчеризацию как на FE, так и на BE.
Рекомендации по памяти FE в зависимости от количества Tablet:
До 1 млн: 16 GB
1–2 млн: 32 GB (рекомендовано для инициализации;
-Xmsи-Xmxодинаковые; для всех FE одинаково)2–5 млн: 64 GB
5–10 млн: 128 GB
1.4 Обработка проблем, связанных с Tablet
Сбой узла BE или неудачный импорт могут привести к аномалиям реплик. StarRocks автоматически восстанавливает такие реплики.
Если таблица одно‑репликовая (фактор репликации = 1), и часть её Tablet расположена на BE, который планируется удалить, удаление такого BE запрещено.
Каждые
tablet_sched_checker_interval_seconds(по умолчанию 20 секунд) узел FE выполняет проверку (Tablet Checker) всех реплик Tablet в кластере StarRocks.При удалении таблицы команда
SHOW PROC '/statistic';покажет, что количество Tablet уменьшилось сразу, но вSHOW BACKENDS;полеTabletNumне уменьшится, потому что корзина (Recycle Bin) SR по умолчанию хранит удалённые данные сутки (управляется динамическим параметром FEcatalog_trash_expire_second, по умолчанию 86400 секунд).При добавлении или выводе из эксплуатации узлов BE система автоматически выполняет ребалансировку Tablet исходя из нагрузки. В этот момент в
SHOW BACKENDS;видно, чтоTabletNumменяется: при добавлении BE часть Tablet переносится на новый узел, при выводе узла — наоборот.Чтобы ускорить или снизить влияние балансировки Tablet на текущий кластер, можно настроить следующие параметры FE:
tablet_sched_slot_num_per_path(по умолчанию: 8): число задач по Tablet, которые может одновременно выполнять один каталог хранения BE (полезно для снижения влияния миграции Tablet при масштабировании).tablet_sched_max_scheduling_tablets(по умолчанию: 10000): максимально допустимое количество одновременно планируемых Tablet. Если текущее число планируемых Tablet превышает это значение, шаги балансировки и проверки восстановления пропускаются.tablet_sched_max_balancing_tablets(по умолчанию: 500): максимальное число Tablet, одновременно находящихся в балансировке. При превышении этого значения ребалансировка новых Tablet пропускается.
1.5 Запросы, связанные с Tablet
1.5.1 Просмотр статистики базы данных
Просмотр статистики по всем базам текущего кластера:
SHOW PROC '/statistic';

Возвращаемые поля и описания:
DbId — ID базы данных.
DbName — имя базы данных.
TableNum — количество таблиц в базе данных.
PartitionNum — количество партиций в базе данных.
IndexNum — количество индексов в базе дан��ых.
TabletNum — количество Tablet в базе данных.
ReplicaNum — количество реплик в базе данных (TabletNum × число реплик).
UnhealthyTabletNum — количество «нездоровых» Tablet (в т.ч. находящихся в процессе перераспределения/восстановления).
InconsistentTabletNum — количество несогласованных Tablet в базе данных.
CloningTabletNum — количество Tablet, для которых выполняется операция клонирования (Clone).
ErrorStateTabletNum — количество Tablet с ошибочным состоянием в таблицах с первичным ключом.
ErrorStateTablets — ID Tablet с ошибочным состоянием в таблицах с первичным ключом.
Более детальный просмотр статуса Tablet для конкретной БД:
SHOW PROC '/statistic/dbid';
Пример:
mysql> show proc '/statistic/356645'; +------------------+---------------------+----------------+-------------------+ | UnhealthyTablets | InconsistentTablets | CloningTablets | ErrorStateTablets | +------------------+---------------------+----------------+-------------------+ | [] | [] | [] | [] | +------------------+---------------------+----------------+-------------------+ 1 row in set (0.01 sec)
1.5.2 Состояние реплик таблицы
1.5.2.1 Запрос всех реплик
Просмотр Tablet в конкретной таблице с возможностью фильтрации по полям:
mysql> show tablet from db2.tbl2 where BackendId=10170\G *************************** 1. row *************************** TabletId: 371281 ReplicaId: 371282 BackendId: 10170 SchemaHash: 0 Version: 4 VersionHash: 0 LstSuccessVersion: 4 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL DataSize: 1.7GB RowCount: 90000000 State: NORMAL LstConsistencyCheckTime: NULL CheckVersion: -1 CheckVersionHash: 0 VersionCount: 1 PathHash: -1 MetaUrl: http://10.197.165.202:8040/api/meta/header/371281 CompactionStatus: http://10.197.165.202:8040/api/compaction/show?tablet\_id=371281 DiskRootPath: Unknown IsConsistent: true Checksum: -1 1 row in set (0.00 sec)
1.5.2.2 Статус синхронизации реплик
-- Просмотр статуса синхронизации реплик таблицы ADMIN SHOW REPLICA STATUS FROM db2.tbl2 WHERE STATUS != "OK";
1.5.2.3 Распределение реплик
-- Просмотр распределения всех реплик таблицы с возможностью фильтрации ADMIN SHOW REPLICA DISTRIBUTION FROM test.t1; +-----------+------------+-------+---------+ | BackendId | ReplicaNum | Graph | Percent | +-----------+------------+-------+---------+ | 10002 | 3 | > | 33.33 % | | 10170 | 3 | > | 33.33 % | | 10171 | 3 | > | 33.33 % | +-----------+------------+-------+---------+ 3 rows in set (0.01 sec)
1.5.2.4 Запрос конкретного Tablet
-- Сначала узнать, какие Tablet у таблицы SHOW tablet from db2.tbl2\G -- Запрос конкретного Tablet SHOW tablet 371281\G DbName: db2 TableName: tbl2 PartitionName: tbl2 IndexName: tbl2 DbId: 356645 TableId: 371279 PartitionId: 371278 IndexId: 371280 IsSync: true DetailCmd: SHOW PROC '/dbs/356645/371279/partitions/371278/371280/371281'; 1 row in set (0.00 sec) -- Запрос детальной информации по Tablet mysql> SHOW PROC '/dbs/356645/371279/partitions/371278/371280/371281'\G *************************** 1. row *************************** ReplicaId: 371282 BackendId: 10170 Version: 4 VersionHash: 0 LstSuccessVersion: 4 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL SchemaHash: -1 DataSize: 1898090776 RowCount: 90000000 State: NORMAL IsBad: false IsSetBadForce: false VersionCount: 1 PathHash: -1 MetaUrl: http://10.197.165.202:8040/api/meta/header/371281 CompactionStatus: http://10.197.165.202:8040/api/compaction/show?tablet\_id=371281&schema\_hash=-1 IsErrorState: false 1 row in set (0.00 sec)
1.5.2.5 Число реплик
SELECT table_schema, table_name, SUBSTRING_INDEX(SUBSTRING_INDEX(PROPERTIES, '"replication_num":"', -1), '"', 1) AS replication_num FROM information_schema.tables_config WHERE table_schema IN('test','db1','db2') -- Выбор баз данных AND PROPERTIES LIKE '%"replication_num":"3"}%'; -- Выбор количества реплик +--------------+------------+-----------------+ | table_schema | table_name | replication_num | +--------------+------------+-----------------+ | db1 | t2 | 3 | | test | t1 | 3 | +--------------+------------+-----------------+ 2 rows in set (0.05 sec)
1.5.3 Статус миграции Tablet
cluster_load_stat: состояние текущей загрузки кластера.working_slots: текущее количество доступных рабочих слотов.sched_stat: текущее состояние системы планирования.priority_repair: число задач на восстановление Tablet с повышенным приоритетом.pending_tablets: количество Tablet в ожидании обработки.running_tablets: количество Tablet, находящихся в процессе восстановления.history_tablets: количество Tablet, которые были восстановлены ранее.
1.5.3.1 До добавления узла BE
mysql> SHOW PROC '/cluster_balance'; +-------------------+--------+ | Item | Number | +-------------------+--------+ | cluster_load_stat | 1 | | working_slots | 3 | | sched_stat | 1 | | priority_repair | 0 | | pending_tablets | 0 | | running_tablets | 0 | | history_tablets | 0 | | all_tablets | 0 | +-------------------+--------+ 8 rows in set (10.19 sec)
1.5.3.2 После добавления узла BE
Видно, что выполняется только 8 задач (соответствует значению по умолчанию параметра tablet_sched_slot_num_per_path):
mysql> SHOW PROC '/cluster_balance'; +-------------------+--------+ | Item | Number | +-------------------+--------+ | cluster_load_stat | 1 | | working_slots | 4 | | sched_stat | 1 | | priority_repair | 0 | | pending_tablets | 471 | | running_tablets | 8 | | history_tablets | 1000 | | all_tablets | 479 | +-------------------+--------+ 8 rows in set (0.00 sec)
2 Тест по созданию и удалению Tablet
2.1 Тест на создание и удаление таблиц
2.1.1 До создания таблицы
Текущее количество Tablet:
mysql> show backends\G *************************** 1. row *************************** BackendId: 10002 IP: 10.197.165.201 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2025-09-01 16:27:49 LastHeartbeat: 2025-09-01 17:08:36 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 3755 DataUsedCapacity: 605.218 MB AvailCapacity: 13.919 GB TotalCapacity: 29.485 GB UsedPct: 52.79 % MaxDiskUsedPct: 52.79 % ErrMsg: Version: 3.3.17-3eac4a9 Status: {"lastSuccessReportTabletsTime":"2025-09-01 17:07:56"} DataTotalCapacity: 14.510 GB DataUsedPct: 4.07 % CpuCores: 4 MemLimit: 3.654GB NumRunningQueries: 0 MemUsedPct: 13.55 % CpuUsedPct: 20.2 % DataCacheMetrics: Status: Normal, DiskUsage: 0B/0B, MemUsage: 0B/0B Location:
2.1.2 Генерация большого числа Tablet
-- Генерация большого количества Tablet CREATE TABLE partitioned_table ( event_day DATE, id BIGINT ) PARTITION BY RANGE(event_day) ( START ("2024-01-01") END ("2025-01-01") EVERY (INTERVAL 1 DAY) ) DISTRIBUTED BY HASH(id) BUCKETS 10; -- Будет создано 366*10 Tablet
2.1.3 После создания таблицы
Текущее количество Tablet:
mysql> show backends\G *************************** 1. row *************************** BackendId: 10002 IP: 10.197.165.201 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2025-09-01 16:27:49 LastHeartbeat: 2025-09-01 17:09:56 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 7415 DataUsedCapacity: 605.218 MB AvailCapacity: 13.919 GB TotalCapacity: 29.485 GB UsedPct: 52.79 % MaxDiskUsedPct: 52.79 % ErrMsg: Version: 3.3.17-3eac4a9 Status: {"lastSuccessReportTabletsTime":"2025-09-01 17:09:56"} DataTotalCapacity: 14.510 GB DataUsedPct: 4.07 % CpuCores: 4 MemLimit: 3.654GB NumRunningQueries: 0 MemUsedPct: 14.07 % CpuUsedPct: 0.7 % DataCacheMetrics: Status: Normal, DiskUsage: 0B/0B, MemUsage: 0B/0B Location:
2.1.4 Удаление таблицы
Здесь видно, что Tablet пока не удалены, так как SR по умолчанию хранит данные в корзине сутки (catalog_trash_expire_second: по умолчанию 86400 секунд):
mysql> drop table db2.partitioned_table; Query OK, 0 rows affected (0.06 sec) mysql> show backends\G *************************** 1. row *************************** BackendId: 10002 IP: 10.197.165.201 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2025-09-01 16:27:49 LastHeartbeat: 2025-09-01 17:10:16 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 7415 DataUsedCapacity: 605.218 MB AvailCapacity: 13.919 GB TotalCapacity: 29.485 GB UsedPct: 52.79 % MaxDiskUsedPct: 52.79 % ErrMsg: Version: 3.3.17-3eac4a9 Status: {"lastSuccessReportTabletsTime":"2025-09-01 17:09:56"} DataTotalCapacity: 14.510 GB DataUsedPct: 4.07 % CpuCores: 4 MemLimit: 3.654GB NumRunningQueries: 0 MemUsedPct: 14.07 % CpuUsedPct: 0.2 % DataCacheMetrics: Status: Normal, DiskUsage: 0B/0B, MemUsage: 0B/0B Location:
Временно изменим catalog_trash_expire_second:
mysql> ADMIN SHOW FRONTEND CONFIG like 'catalog_trash_expire_second'; +-----------------------------+------------+-------+------+-----------+---------+ | Key | AliasNames | Value | Type | IsMutable | Comment | +-----------------------------+------------+-------+------+-----------+---------+ | catalog_trash_expire_second | [] | 86400 | long | true | | +-----------------------------+------------+-------+------+-----------+---------+ 1 row in set (0.00 sec) mysql> ADMIN SET FRONTEND CONFIG ("catalog_trash_expire_second" = "0"); Query OK, 0 rows affected (0.05 sec) mysql> ADMIN SHOW FRONTEND CONFIG like 'catalog_trash_expire_second'; +-----------------------------+------------+-------+------+-----------+---------+ | Key | AliasNames | Value | Type | IsMutable | Comment | +-----------------------------+------------+-------+------+-----------+---------+ | catalog_trash_expire_second | [] | 0 | long | true | | +-----------------------------+------------+-------+------+-----------+---------+ 1 row in set (0.00 sec)
Видно, что Tablet удалились сразу:
mysql> show backends\G *************************** 1. row *************************** BackendId: 10002 IP: 10.197.165.201 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2025-09-01 16:27:49 LastHeartbeat: 2025-09-01 17:10:51 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 3755 DataUsedCapacity: 605.218 MB AvailCapacity: 13.913 GB TotalCapacity: 29.485 GB UsedPct: 52.81 % MaxDiskUsedPct: 52.81 % ErrMsg: Version: 3.3.17-3eac4a9 Status: {"lastSuccessReportTabletsTime":"2025-09-01 17:09:56"} DataTotalCapacity: 14.504 GB DataUsedPct: 4.08 % CpuCores: 4 MemLimit: 3.654GB NumRunningQueries: 0 MemUsedPct: 14.06 % CpuUsedPct: 0.0 % DataCacheMetrics: Status: Normal, DiskUsage: 0B/0B, MemUsage: 0B/0B Location:
2.2 Соответствие Tablet физическим файлам
2.2.1 Описание физических файлов
Физическое хранение на узлах BE: путь для Tablet задается в каталоге, указанном в конфигурации
be.confпараметромstorage_root_path; соответствующие данные Tablet находятся под${storage_root_path}/data.Tablet — логическое понятие шарда; на уровне физического хранения данные представлены segment‑файлами. Иерархия каталогов и примеры файлов:
[root@zyf-sr-02 1374885024]# du -sh * 1022M 0200000000003645be4fec146c4c1883227773a343c970af_0.dat (rowset_id + "_" + segment_id + ".dat") 178M 0200000000003645be4fec146c4c1883227773a343c970af_1.dat [root@zyf-sr-02 1374885024]# pwd /data/other/starrocks/data/data/374 (shard_id)/371281 (tablet id)/1374885024 (schema_hash)
2.2.2 Тест создания таблицы
2.2.2.1 Генерация данных в БД PG
-- Генерация исходных данных в БД PG drop table if exists tbl1; create table tbl1 ( id int primary key, info text, c1 int, c2 float, ts timestamp ); insert into tbl1 selectid,md5(random()::text),random()*1000,random()*100,clock_timestamp() from generate_series(1,60000000) id; \dt+ tbl1 List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+----------+---------+------------- public | tbl1 | table | postgres | 2664 MB | (1 row) copy tbl1 to '/tmp/tbl1.csv' delimiter ',';
2.2.2.2 Создание таблицы и загрузка в SR (автоматическая бакетизация)
-- Здесь создаем данные с одной репликой, чтобы удобнее наблюдать create table tbl1 (id int ,info text,c1 int,c2 float,ts datetime) PROPERTIES ("replication_num" = "1");
Загрузка данных (Stream Load):
curl --location-trusted -u root:root -H "column_separator:," \ -H "Expect:100-continue" \ -H "columns:id,info,c1,c2,ts" \ -T /tmp/tbl1.csv -XPUT \ http://10.197.165.201:8030/api/db2/tbl1/\_stream\_load
2.2.2.3 Наблюдение за файловой структурой
Сначала проверим, какие Tablet у таблицы (видно, что система с автоматической бакетизацией создала 3 Tablet):
SHOW tablet from db2.tbl1\G *************************** 1. row *************************** TabletId: 556040 ReplicaId: 556041 BackendId: 10002 SchemaHash: 0 Version: 2 VersionHash: 0 LstSuccessVersion: 2 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL DataSize: 403.5MB RowCount: 10000018 State: NORMAL LstConsistencyCheckTime: NULL CheckVersion: -1 CheckVersionHash: 0 VersionCount: 1 PathHash: -1 MetaUrl: http://10.197.165.201:8040/api/meta/header/556040 CompactionStatus: http://10.197.165.201:8040/api/compaction/show?tablet\_id=556040 DiskRootPath: Unknown IsConsistent: true Checksum: -1 *************************** 2. row *************************** TabletId: 556042 ReplicaId: 556043 BackendId: 10170 SchemaHash: 0 Version: 2 VersionHash: 0 LstSuccessVersion: 2 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL DataSize: 403.4MB RowCount: 9999967 State: NORMAL LstConsistencyCheckTime: NULL CheckVersion: -1 CheckVersionHash: 0 VersionCount: 1 PathHash: -1 MetaUrl: http://10.197.165.202:8040/api/meta/header/556042 CompactionStatus: http://10.197.165.202:8040/api/compaction/show?tablet\_id=556042 DiskRootPath: Unknown IsConsistent: true Checksum: -1 *************************** 3. row *************************** TabletId: 556044 ReplicaId: 556045 BackendId: 10171 SchemaHash: 0 Version: 2 VersionHash: 0 LstSuccessVersion: 2 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL DataSize: 403.4MB RowCount: 10000015 State: NORMAL LstConsistencyCheckTime: NULL CheckVersion: -1 CheckVersionHash: 0 VersionCount: 1 PathHash: -1 MetaUrl: http://10.197.165.203:8040/api/meta/header/556044 CompactionStatus: http://10.197.165.203:8040/api/compaction/show?tablet\_id=556044 DiskRootPath: Unknown IsConsistent: true Checksum: -1 3 rows in set (0.00 sec)
Найдём соответствующие файлы данных (искать на BackendId 10002 для Tablet 556040):
[root@zyf-sr-01 ~]# find / -name 556040 /data/other/starrocks/data/data/155/556040 [root@zyf-sr-01 ~]# tree /data/other/starrocks/data/data/155/556040 /data/other/starrocks/data/data/155/556040 └── 1374885024 ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_0.dat ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_1.dat ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_2.dat ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_3.dat ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_4.dat ├── 0200000000001cc8e540263d189634598cee6af6d99e56af_5.dat └── 0200000000001cc9e540263d189634598cee6af6d99e56af_0.dat 1 directory, 7 files [root@zyf-sr-01 ~]# cd /data/other/starrocks/data/data/155/556040 [root@zyf-sr-01 556040]# cd 1374885024/ [root@zyf-sr-01 1374885024]# pwd /data/other/starrocks/data/data/155/556040/1374885024 [root@zyf-sr-01 1374885024]# du -sh * 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_1.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_2.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_3.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_4.dat 57M 0200000000001cc8e540263d189634598cee6af6d99e56af_5.dat 404M 0200000000001cc9e540263d189634598cee6af6d99e56af_0.dat
2.2.2.4 Слияние версий (компакция)
Выполним вторую загрузку данных — видно, что число файлов увеличилось:
[root@zyf-sr-01 1374885024]# du -sh * 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_1.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_2.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_3.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_4.dat 57M 0200000000001cc8e540263d189634598cee6af6d99e56af_5.dat 404M 0200000000001cc9e540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_1.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_2.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_3.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_4.dat 57M 0200000000001d3ae540263d189634598cee6af6d99e56af_5.dat 0 0200000000001d3be540263d189634598cee6af6d99e56af_0.dat
После нескольких запусков Stream Load информация SHOW TABLET FROM db2.tbl1; может обновиться не сразу, а файлы окажутся фрагментированными. Выполним команду компакции (слияние версий) — мелкие файлы объединяются в крупные, но исходные файлы не удаляются:
ALTER TABLE db2.tbl1 COMPACT;
Видно, что файлы объединились, но исходные ещё не удалены:
[root@zyf-sr-01 1374885024]# du -sh * 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_1.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_2.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_3.dat 70M 0200000000001cc8e540263d189634598cee6af6d99e56af_4.dat 57M 0200000000001cc8e540263d189634598cee6af6d99e56af_5.dat 404M 0200000000001cc9e540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_0.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_1.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_2.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_3.dat 70M 0200000000001d3ae540263d189634598cee6af6d99e56af_4.dat 57M 0200000000001d3ae540263d189634598cee6af6d99e56af_5.dat 723M 0200000000001d3be540263d189634598cee6af6d99e56af_0.dat
2.2.2.5 Создание таблицы в SR (ручная бакетизация)
CREATE TABLE tbl3 ( id int, info text, c1 int, c2 float, ts datetime ) DISTRIBUTED BY RANDOM BUCKETS 1 PROPERTIES ("replication_num" = "1");
Видно, что здесь будет создан только один Tablet:
mysql> show tablet from db2.tbl3\G *************************** 1. row *************************** TabletId: 556065 ReplicaId: 556066 BackendId: 10002 SchemaHash: 0 Version: 1 VersionHash: 0 LstSuccessVersion: 1 LstSuccessVersionHash: 0 LstFailedVersion: -1 LstFailedVersionHash: 0 LstFailedTime: NULL DataSize: 0B RowCount: 0 State: NORMAL LstConsistencyCheckTime: NULL CheckVersion: -1 CheckVersionHash: 0 VersionCount: -1 PathHash: -1 MetaUrl: http://10.197.165.201:8040/api/meta/header/556065 CompactionStatus: http://10.197.165.201:8040/api/compaction/show?tablet\_id=556065 DiskRootPath: Unknown IsConsistent: true Checksum: -1 1 row in set (0.00 sec)
3 Бакетизация данных
3.1 Пояснение по бакетизации
При создании таблиц вы можете задать разумные партиции и бакеты, чтобы обеспечить равномерное распределение данных и повысить производительность запросов. Равномерное распределение означает разделение данных н�� подмножества по правилам и их сбалансированное размещение на разных узлах. Это уменьшает объём сканируемых данных при запросах и максимально использует параллелизм кластера.
Начиная с версии 2.5.7, при создании таблицы и добавлении партиций можно не задавать количество бакетов (BUCKETS). StarRocks автоматически определяет количество бакетов. Если производительность не соответствует ожиданиям и вы хорошо знакомы с механизмом бакетов, можно вручную задать количество бакетов.
Бакет — единица физической организации файлов.
Слишком много Tablet увеличивает затраты FE/BE на управление метаданными и диспетчеризацию.
Партиции и бакеты следует, по возможности, выбирать так, чтобы они покрывали условия запросов — это снижает объём сканирования и повышает параллелизм.
Просмотр количества бакетов:
SHOW PARTITIONS.Ручная настройка количества бакетов:
Если ожидаемый объём исходных данных в одной партиции таблицы превышает 100 GB, рекомендуется вручную задать количество бакетов в партиции.
По одному Tablet на каждые 10 GB:
DISTRIBUTED BY HASH(site_id,city_code) BUCKETS 30;— если объём данных для одной партиции 300 GB, то по правилу 10 GB на один Tablet число бакетов в партиции — 30.
Для включения внутреннего параллелизма сканирования Tablet убедитесь, что системная переменная
enable_tablet_internal_parallelустановлена глобально:
SET GLOBAL enable_tablet_internal_parallel = true;
Примеры:
-- При создании таблицы CREATE TABLE site_access ( site_id INT DEFAULT '10', city_code SMALLINT, user_name VARCHAR(32) DEFAULT '', event_day DATE, pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(site_id, city_code, user_name, event_day) PARTITION BY date_trunc('day', event_day) DISTRIBUTED BY HASH(site_id,city_code); -- Нет необходимости вручную задавать число бакетов в партиции -- После создания таблицы -- Автоматически задать число бакетов для всех партиций и не включать динамическое увеличение по требованию (число бакетов фиксировано). ALTER TABLE details DISTRIBUTED BY RANDOM; -- Автоматически задать число бакетов для всех партиций и включить динамическое увеличение по требованию. ALTER TABLE details SET("bucket_size"="1073741824"); -- Автоматически задать число бакетов для указанных партиций. ALTER TABLE details PARTITIONS (p20230103, p20230104) DISTRIBUTED BY RANDOM; -- Автоматически задать число бакетов для добавляемой партиции. ALTER TABLE details ADD PARTITION p20230106 VALUES [('2023-01-06'), ('2023-01-07')) DISTRIBUTED BY RANDOM;
3.2 Случайная бакетизация
Начиная с версии 3.1, при создании таблицы и добавлении партиций можно не задавать ключ бакетизации (то есть не указывать предложение
DISTRIBUTED BY). StarRocks по умолчанию использует случайную бакетизацию и случайно распределяет данные между всеми бакетами в партиции.Однако если вы часто выполняете запросы по массивам данных, где одни и те же столбцы используются как условия отбора, случайная бакетизация может быть недостаточно эффективна. В таких случаях рекомендуются хеш‑бакеты: тогда при запросе, использующем эти столбцы, необходимо сканировать лишь небольшое число соответствующих бакетов, что существенно повышает производительность.
Ограничения:
Поддерживаются только таблицы модели Detail (detail model).
Нельзя указывать Colocation Group.
Не поддерживается Spark Load.
3.3 Хеш‑бакетизация
Данные распределяются по бакетам по значению ключа бакетизации. Выбор столбцов, часто используемых в условиях запроса, в качестве ключа бакетизации повышает эффективность запросов.
Столбцы, одновременно обладающие высокой кардинальностью (много уникальных значений) и используемые в условиях запросов, подходят для хеш‑бакетизации.
Преимущества:
Повышение производительности запросов: строки с одинаковым значением ключа бакетизации попадают в один бакет, что снижает объём сканируемых данных.
Равномерное распределение данных: выбор столбцов с высокой кардинальностью в качестве ключей бакетизации помогает сбалансировать данные по бакетам.
Как выбирать ключ бакетизации:
Для сложных запросов рекомендуется выбирать столбцы с высокой кардинальностью, чтобы обеспечить равномерное распределение и повысить утилизацию ресурсов кластера.
Для простых запросов рекомендуется выбирать столбцы, часто используемые в условиях запросов, чтобы повысить эффективность.
При серьёзном перекосе данных можно использовать несколько столбцов в качестве ключа бакетизации, но рекомендуется не более трёх.
Замечания:
Ключ бакетизации поддерживает типы: целочисленные, DECIMAL, DATE/DATETIME, CHAR/VARCHAR/STRING.
Начиная с версии 3.2, после создания таблицы можно менять ключ бакетизации через
ALTER TABLE.Если в таблице с первичным ключом новый ключ бакетизации не включает столбцы первичного ключа, SQL выполнится, но в
SHOW ALTER TABLE OPTIMIZE\Gпоявится сообщение:create temp partitions failed java.lang.RuntimeException: create partitions failed: Distribution column[id2] is not key column
