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

Data Cache

Эта тема описывает принципы работы Data Cache и способы включения Data Cache для улучшения производительности запросов к внешним данным. Начиная с версии 1.5.0, Data Cache включен по умолчанию.

В аналитике озера данных Selena работает как OLAP-движок для сканирования файлов данных, хранящихся во внешних системах хранения, таких как HDFS и Amazon S3. Накладные расходы на ввод-вывод увеличиваются по мере роста количества файлов для сканирования. Кроме того, в некоторых ad hoc сценариях частый доступ к одним и тем же данным удваивает накладные расходы на ввод-вывод.

Для оптимизации производительности запросов в этих сценариях Selena 2.5 предоставляет функцию Data Cache. Эта функция разделяет данные во внешней системе хранения на несколько блоков на основе предопределенных политик и кэширует данные на бэкендах Selena (BE). Это устраняет необходимость извлекать данные из внешних систем для каждого запроса доступа и ускоряет запросы и анализ горячих данных. Data Cache работает только при запросе данных из внешних систем хранения с использованием external catalog или внешних таблиц (исключая внешние таблицы для JDBC-совместимых баз данных). Он не работает при запросе нативных таблиц Selena.

Как это работает

Selena разделяет данные во внешней системе хранения на несколько блоков одинакового размера (по умолчанию 1 МБ) и кэширует данные на BE. Блок является наименьшей единицей кэша данных, которая настраивается.

Например, если вы установите размер блока 1 МБ и хотите запросить файл Parquet размером 128 МБ из Amazon S3, Selena разделит файл на 128 блоков. Блоки будут [0, 1 МБ), [1 МБ, 2 МБ), [2 МБ, 3 МБ) ... [127 МБ, 128 МБ). Selena присваивает каждому блоку глобально уникальный ID, называемый ключом кэша. Ключ кэша состоит из следующих трех частей.

hash(filename) + fileModificationTime + blockId

В следующей таблице приведены описания каждой части.

КомпонентОписание
filenameИмя файла данных.
fileModificationTimeВремя последнего изменения файла данных.
blockIdID, который Selena присваивает блоку при разделении файла данных. ID уникален в рамках одного файла данных, но не уникален в пределах вашего кластера Selena.

Если запрос попадает в блок [1 МБ, 2 МБ), Selena выполняет следующие операции:

  1. Проверяет, существует ли блок в кэше.
  2. Если блок существует, Selena читает блок из кэша. Если блок не существует, Selena читает блок из Amazon S3 и кэширует его на BE.

После включения Data Cache Selena кэширует блоки данных, прочитанные из внешних систем хранения.

Носители хранения блоков

Selena использует память и диски машин BE для кэширования блоков. Поддерживается кэширование только в памяти или как в памяти, так и на дисках.

Если вы используете диски в качестве носителей хранения, скорость кэширования напрямую зависит от производительности дисков. Поэтому мы рекомендуем использовать высокопроизводительные диски, такие как NVMe диски, для кэша данных. Если у вас нет высокопроизводительных дисков, вы можете добавить больше дисков для снижения нагрузки на дисковый ввод-вывод.

Политики замещения кэша

Selena использует политику least recently used (LRU) для кэширования и удаления данных.

  • Selena сначала читает данные из памяти. Если данные не найдены в памяти, Selena будет читать данные с дисков и попытается загрузить данные, прочитанные с дисков, в память.
  • Данные, удаленные из памяти, будут записаны на диски. Данные, удаленные с дисков, будут удалены.

Включение Data Cache

Начиная с версии 1.5.0, Data Cache включен по умолчанию.

По умолчанию система кэширует данные следующими способами:

  • Системные переменные enable_scan_datacache и параметр BE datacache_enable установлены в true по умолчанию.
  • Если путь к диску кэша, размер памяти и емкость диска не настроены, система автоматически выберет путь и установит ограничения памяти и диска, следуя этим правилам:
    • Создается каталог datacache в качестве каталога кэша под storage_root_path. (Вы можете изменить это с помощью параметра BE datacache_disk_path.)
    • Система включает автоматическую настройку дискового пространства для Data Cache. Она устанавливает ограничение, чтобы общее использование диска составляло около 70%, и динамически корректирует в соответствии с последующим использованием диска. (Вы можете изменить это поведение с помощью параметров BE datacache_disk_high_level, datacache_disk_safe_level и datacache_disk_low_level.)
    • Ограничение памяти по умолчанию для Data Cache составляет 0. (Вы можете изменить это с помощью параметра BE datacache_mem_size.)
  • Система по умолчанию использует асинхронное заполнение кэша, чтобы минимизировать его влияние на операции чтения данных.
  • Функция I/O адаптера включена по умолчанию. Когда нагрузка на дисковый ввод-вывод высока, система автоматически перенаправит некоторые запросы в удаленное хранилище для снижения нагрузки на диск.

Чтобы отключить Data Cache, выполните следующий оператор:

SET GLOBAL enable_scan_datacache=false;

Заполнение кэша данных

Правила заполнения

Начиная с версии 1.5.0, для улучшения коэффициента попаданий Data Cache, Selena заполняет Data Cache согласно следующим правилам:

  • Кэш не будет заполняться для операторов, которые не являются SELECT, например, ANALYZE TABLE и INSERT INTO SELECT.
  • Запросы, которые сканируют все разделы таблицы, не будут заполнять кэш. Однако, если таблица имеет только один раздел, заполнение выполняется по умолчанию.
  • Запросы, которые сканируют все столбцы таблицы, не будут заполнять кэш. Однако, если таблица имеет только один столбец, заполнение выполняется по умолчанию.
  • Кэш не будет заполняться для таблиц, которые не являются Hive, Paimon, Delta Lake, Hudi или Iceberg.

Вы можете просмотреть поведение заполнения для конкретного запроса с помощью команды EXPLAIN VERBOSE.

Пример:

mysql> explain verbose select col1 from hudi_table;
| 0:HudiScanNode |
| TABLE: hudi_table |
| partitions=3/3 |
| cardinality=9084 |
| avgRowSize=2.0 |
| dataCacheOptions={populate: false} |
| cardinality: 9084 |
+-----------------------------------------+

dataCacheOptions={populate: false} указывает, что кэш не будет заполняться, поскольку запрос будет сканировать все разделы.

Вы также можете тонко настроить поведение заполнения Data Cache через переменную сессии populdate_datacache_mode.

Режим заполнения

Selena поддерживает заполнение Data Cache в синхронном или асинхронном режиме.

  • Синхронное заполнение кэша

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

  • Асинхронное заполнение кэша

    В режиме асинхронного заполнения система пытается кэшировать доступные данные в фоновом режиме, чтобы минимизировать влияние на производительность чтения. Асинхронное заполнение может снизить влияние заполнения кэша на производительность начальных чтений, но эффективность заполнения ниже, чем у синхронного заполнения. Обычно один запрос не может гарантировать, что все доступные данные могут быть кэшированы. Может потребоваться несколько попыток для кэширования всех доступных данных.

Начиная с версии 1.5.0, асинхронное заполнение кэша включено по умолчанию. Вы можете изменить режим заполнения, установив переменную сессии enable_datacache_async_populate_mode.

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

В настоящее время Selena поддерживает кэширование объектов Parquet Footer.

Вы можете включить Footer Cache, установив следующую системную переменную:

SET GLOBAL enable_file_metacache=true;

ПРИМЕЧАНИЕ

Footer Cache использует модуль памяти Data Cache для кэширования данных. Поэтому вы должны убедиться, что параметр BE datacache_enable установлен в true и настроить разумное значение для datacache_mem_size.

I/O Adaptor

Чтобы предотвратить значительную задержку в доступе к диску из-за высокой нагрузки на дисковый ввод-вывод кэша, что может привести к негативной оптимизации системы кэша, Data Cache предоставляет функцию I/O адаптера. Эта функция перенаправляет некоторые запросы кэша в удаленное хранилище при высокой нагрузке на диск, используя как локальный кэш, так и удаленное хранилище для улучшения пропускной способности ввода-вывода. Эта функция включена по умолчанию.

Вы можете включить I/O Adaptor, установив следующую системную переменную:

SET GLOBAL enable_datacache_io_adaptor=true;

Динамическое масштабирование

Data Cache поддерживает ручную настройку емкости кэша без перезапуска процесса BE, а также поддерживает автоматическую настройку емкости кэша.

Ручное масштабирование

Вы можете изменить ограничение памяти Data Cache или емкость диска, динамически настраивая элементы конфигурации BE.

Примеры:

-- Настройка ограничения памяти Data Cache для конкретного экземпляра BE.
UPDATE be_configs SET VALUE="10G" WHERE NAME="datacache_mem_size" and BE_ID=10005;

-- Настройка ограничения соотношения памяти Data Cache для всех экземпляров BE.
UPDATE be_configs SET VALUE="10%" WHERE NAME="datacache_mem_size";

-- Настройка ограничения диска Data Cache для всех экземпляров BE.
UPDATE be_configs SET VALUE="2T" WHERE NAME="datacache_disk_size";

ПРИМЕЧАНИЕ

  • Будьте осторожны при настройке емкостей таким образом. Убедитесь, что не пропускаете предложение WHERE, чтобы избежать изменения нерелевантных элементов конфигурации.
  • Настройки емкости кэша, сделанные таким образом, не будут сохранены и будут потеряны после перезапуска процесса BE. Поэтому вы можете сначала настроить параметры динамически, как описано выше, а затем вручную изменить файл конфигурации BE, чтобы убедиться, что изменения вступят в силу после следующего перезапуска.

Автоматическое масштабирование

Selena в настоящее время поддерживает автоматическое масштабирование емкости диска. Если вы не указываете путь к диску кэша и ограничение емкости в конфигурации BE, автоматическое масштабирование включено по умолчанию.

Вы также можете включить автоматическое масштабирование, добавив следующий элемент конфигурации в файл конфигурации BE и перезапустив процесс BE:

datacache_auto_adjust_enable=true

После включения автоматического масштабирования:

  • Когда использование диска превышает порог, указанный параметром BE datacache_disk_high_level (значение по умолчанию 80, то есть 80% дискового пространства), система автоматически удалит данные кэша для освобождения дискового пространства.
  • Когда использование диска постоянно ниже порога, указанного параметром BE datacache_disk_low_level (значение по умолчанию 60, то есть 60% дискового пространства), и текущее дисковое пространство, используемое Data Cache, заполнено, система автоматически расширит емкость кэша.
  • При автоматическом масштабировании емкости кэша система будет стремиться настроить емкость кэша до уровня, указанного параметром BE datacache_disk_safe_level (значение по умолчанию 70, то есть 70% дискового пространства).

Проверка попадания запроса в кэш данных

Вы можете проверить, попадает ли запрос в кэш данных, анализируя следующие метрики в профиле запроса:

  • DataCacheReadBytes: количество данных, которые Selena читает непосредственно из своей памяти и дисков.
  • DataCacheWriteBytes: количество данных, загруженных из внешней системы хранения в память и диски Selena.
  • BytesRead: общее количество прочитанных данных, включая данные, которые Selena читает из внешней системы хранения, своей памяти и дисков.

Пример 1: В этом примере Selena читает большое количество данных (7.65 ГБ) из внешней системы хранения и только немного данных (518.73 МБ) из памяти и дисков. Это означает, что было мало попаданий в кэш данных.

 - Table: lineorder
- DataCacheReadBytes: 518.73 MB
- __MAX_OF_DataCacheReadBytes: 4.73 MB
- __MIN_OF_DataCacheReadBytes: 16.00 KB
- DataCacheReadCounter: 684
- __MAX_OF_DataCacheReadCounter: 4
- __MIN_OF_DataCacheReadCounter: 0
- DataCacheReadTimer: 737.357us
- DataCacheWriteBytes: 7.65 GB
- __MAX_OF_DataCacheWriteBytes: 64.39 MB
- __MIN_OF_DataCacheWriteBytes: 0.00
- DataCacheWriteCounter: 7.887K (7887)
- __MAX_OF_DataCacheWriteCounter: 65
- __MIN_OF_DataCacheWriteCounter: 0
- DataCacheWriteTimer: 23.467ms
- __MAX_OF_DataCacheWriteTimer: 62.280ms
- __MIN_OF_DataCacheWriteTimer: 0ns
- BufferUnplugCount: 15
- __MAX_OF_BufferUnplugCount: 2
- __MIN_OF_BufferUnplugCount: 0
- BytesRead: 7.65 GB
- __MAX_OF_BytesRead: 64.39 MB
- __MIN_OF_BytesRead: 0.00

Пример 2: В этом примере Selena читает большое количество данных (46.08 ГБ) из кэша данных и никаких данных из внешней системы хранения, что означает, что Selena читает данные только из кэша данных.

Table: lineitem
- DataCacheReadBytes: 46.08 GB
- __MAX_OF_DataCacheReadBytes: 194.99 MB
- __MIN_OF_DataCacheReadBytes: 81.25 MB
- DataCacheReadCounter: 72.237K (72237)
- __MAX_OF_DataCacheReadCounter: 299
- __MIN_OF_DataCacheReadCounter: 118
- DataCacheReadTimer: 856.481ms
- __MAX_OF_DataCacheReadTimer: 1s547ms
- __MIN_OF_DataCacheReadTimer: 261.824ms
- DataCacheWriteBytes: 0.00
- DataCacheWriteCounter: 0
- DataCacheWriteTimer: 0ns
- BufferUnplugCount: 1.231K (1231)
- __MAX_OF_BufferUnplugCount: 81
- __MIN_OF_BufferUnplugCount: 35
- BytesRead: 46.08 GB
- __MAX_OF_BytesRead: 194.99 MB
- __MIN_OF_BytesRead: 81.25 MB

Конфигурации и переменные

Вы можете настроить Data Cache, используя следующие системные переменные и параметры BE.

Системные переменные

Параметры BE