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

Сжатие данных

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

Краткое руководство по выбору​

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

Пользовательский сценарийРекомендуемый алгоритмПричина
Высокопроизводительная аналитика в реальном времени, большое число одновременных запросовLZ4, SnappyЧрезвычайно быстрая распаковка с низкой нагрузкой на CPU
Баланс затрат на хранение и производительности запросовZSTD, LZ4FВысокий коэффициент сжатия при сохранении быстрой распаковки
Приоритет эффективности хранения, задержка запросов некритичнаZSTD, ZlibНаивысший коэффициент сжатия, экономия дискового пространства
Архивирование и хранение холодных данныхZlib, LZ4HCМаксимальный коэффициент сжатия, подходит для данных, к которым редко обращаются

По умолчанию рекомендуется ZSTD: в большинстве сценариев он обеспечивает и хороший коэффициент сжатия, и высокую скорость распаковки.

Зачем нужно сжатие​

В Doris сжатие данных решает две основные задачи:

  1. Снижение затрат на хранение: уменьшение дискового пространства, необходимого для хранения данных, позволяет разместить больше данных на тех же физических ресурсах.
  2. Повышение производительности запросов: сжатые данные занимают меньше места, поэтому при выполнении запросов требуется меньше операций ввода-вывода. Современные алгоритмы сжатия обеспечивают чрезвычайно быструю распаковку, позволяя экономить место и одновременно сокращать время ответа на запросы.

Поддерживаемые алгоритмы сжатия​

Doris поддерживает следующие алгоритмы сжатия. Каждый из них обеспечивает своё соотношение коэффициента сжатия и скорости распаковки:

Тип сжатияХарактеристикиСценарии применения
Без сжатияДанные не сжимаются.Данные уже сжаты либо объём хранилища не является ограничивающим фактором.
LZ4Чрезвычайно высокая скорость сжатия и распаковки при умеренном коэффициенте сжатия.Запросы в реальном времени, нагрузки с большим числом одновременных запросов и другие сценарии, требующие быстрой распаковки.
LZ4FРасширенная версия LZ4, поддерживающая более гибкую настройку сжатия; высокая скорость при умеренном коэффициенте сжатия.Сценарии, требующие быстрого сжатия с возможностью детальной настройки.
LZ4HCБолее высокий коэффициент сжатия, чем у LZ4, но меньшая скорость сжатия; скорость распаковки сопоставима с LZ4.Сценарии, в которых важна скорость распаковки, но требуется более высокий коэффициент сжатия.
ZSTD (Zstandard)Высокий коэффициент сжатия с гибкой настройкой уровня сжатия; распаковка остаётся быстрой даже при высоких коэффициентах сжатия.Сценарии, требующие высокой эффективности хранения и хорошей производительности запросов.
SnappyРазработан прежде всего для быстрой распаковки; обеспечивает умеренный коэффициент сжатия.Сценарии, требующие быстрой распаковки при ограниченных ресурсах CPU.
ZlibОбеспечивает хороший баланс между коэффициентом сжатия и скоростью; сжатие и распаковка выполняются медленнее, но коэффициент сжатия выше.Архивирование, хранение холодных данных и другие сценарии, в которых скорость распаковки некритична.

Как работает сжатие​

Сжатие в Doris реализуется за счёт согласованной работы нескольких уровней:

Сжатие по столбцам​

Поскольку Doris использует колоночное хранение, каждый столбец таблицы сжимается независимо. Данные в одном столбце обычно имеют схожие характеристики распределения, поэтому сжатие по столбцам эффективнее сжатия по строкам.

Кодирование перед сжатием​

Перед сжатием Doris кодирует данные столбца, преобразуя их в более подходящую для сжатия форму и дополнительно повышая коэффициент сжатия. К распространённым методам кодирования относятся:

  • Словарное кодирование: заменяет повторяющиеся строковые значения более короткими идентификаторами в словаре.
  • Кодирование длин серий (RLE): представляет последовательности одинаковых значений в виде «значение + число повторений».

Сжатие по страницам​

Doris использует стратегию сжатия на уровне страниц:

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

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

Оптимизация в формате хранения V3​

Начиная с формата хранения V3 в Doris стратегия кодирования числовых типов была дополнительно оптимизирована:

  • Для целочисленных типов по умолчанию используется PLAIN_ENCODING.
  • В сочетании со сжатием LZ4 или ZSTD это обеспечивает более высокую пропускную способность при чтении и меньшую нагрузку на CPU.

Подробнее см. в разделе Формат хранения V3.

Настраиваемая стратегия сжатия​

При создании таблицы можно указать алгоритм сжатия, выбрав оптимальное соотношение эффективности сжатия и производительности запросов с учётом конкретной рабочей нагрузки.

Факторы, влияющие на сжатие​

Эффективность сжатия зависит не только от выбранного алгоритма, но и от характеристик самих данных:

ФакторОписание
Упорядоченность данныхЧем более закономерен порядок данных (например, временных меток или последовательных числовых значений), тем проще алгоритму сжатия выявлять повторяющиеся шаблоны и тем выше коэффициент сжатия.
Избыточность данныхЧем больше повторяющихся значений в столбце, тем эффективнее сжатие; словарное кодирование особенно эффективно для данных с высокой избыточностью.
Тип данныхЧисловые типы (целые числа, числа с плавающей точкой) обычно сжимаются легче, чем строковые; чем шире диапазон значений, тем сильнее его влияние на сжатие.
Длина столбцаКороткие столбцы обычно сжимаются легче, чем длинные, поскольку алгоритмы сжатия эффективнее находят повторяющиеся шаблоны в небольших блоках данных.
Доля значений NULLПри высокой доле значений NULL алгоритм сжатия может кодировать их с помощью специального шаблона, дополнительно сокращая занимаемое место в хранилище.

Настройка сжатия в Doris​

При создании таблицы укажите алгоритм сжатия с помощью параметра compression в PROPERTIES:

CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);

Поддерживаемые значения compression: none, lz4, lz4f, lz4hc, zstd, snappy и zlib. Если значение не указано явно, Doris использует алгоритм сжатия по умолчанию ZSTD (задаётся параметром конфигурации FE default_compression_type).