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 | Время последнего изменения файла данных. |
| blockId | ID, который Selena присваивает блоку при разделении файла данных. ID уникален в рамках одного файла данных, но не уникален в пределах вашего кластера Selena. |
Если запрос попадает в блок [1 МБ, 2 МБ), Selena выполняет следующие операции:
- Проверяет, существует ли блок в кэше.
- Если блок существует, 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и параметр BEdatacache_enableустановлены вtrueпо умолчанию. - Если путь к диску кэша, размер памяти и емкость диска не настроены, система автоматически выберет путь и установит ограничения памяти и диска, следуя этим правилам:
- Создается каталог datacache в качестве каталога кэша под
storage_root_path. (Вы можете изменить это с помощью параметра BEdatacache_disk_path.) - Система включает автоматическую настройку дискового пространства для Data Cache. Она устанавливает ограничение, чтобы общее использование диска составляло около 70%, и динамически корректирует в соответствии с последу ющим использованием диска. (Вы можете изменить это поведение с помощью параметров BE
datacache_disk_high_level,datacache_disk_safe_levelиdatacache_disk_low_level.) - Ограничение памяти по умолчанию для Data Cache составляет
0. (Вы можете изменить это с помощью параметра BEdatacache_mem_size.)
- Создается каталог datacache в качестве каталога кэша под
- Система по умолчанию использует асинхронное заполнение кэша, чтобы минимизировать его влияние на операции чтения данных.
- Функция 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.
Footer Cache
В дополнение к кэшированию данных из файлов в удаленном хранилище во время запросов к озерам данных, 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.
Системные переменные
- populdate_datacache_mode
- enable_datacache_io_adaptor
- enable_file_metacache
- enable_datacache_async_populate_mode
Параметры BE
- datacache_enable
- datacache_disk_path
- datacache_meta_path
- datacache_mem_size
- datacache_disk_size
- datacache_auto_adjust_enable
- datacache_disk_high_level
- datacache_disk_safe_level
- datacache_disk_low_level
- datacache_disk_adjust_interval_seconds
- datacache_disk_idle_seconds_for_expansion
- datacache_min_disk_quota_for_adjustment