Компактирование Delta-таблиц

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

Команда OPTIMIZE является основной операцией сжатия. Он группирует небольшие файлы в ячейки, посвященные идеальному размеру файла, а затем записывает их в хранилище.

Для рекомендаций по стратегиям уплотнения между SQL-аналитикой — Power BI Direct Lake и Spark — см. раздел Кросс-нагрузочная таблица поддержки и оптимизации.

Методы сжатия

Fabric предлагает несколько подходов для поддержания оптимальных размеров файлов в таблицах Delta:

Команда OPTIMIZE

Эта OPTIMIZE команда является базовой операцией для сжатия таблиц Delta. Он переформатирует небольшие файлы в большие, чтобы улучшить структуру данных в таблицах Delta.

OPTIMIZE dbo.table_name
Недвижимость Description Значение по умолчанию Конфигурация сеанса
minFileSize Файлы, которые меньше этого порогового значения, группируются и перезаписываются в виде больших файлов. 1073741824 (1 ГБ) spark.databricks.delta.optimize.minFileSize
maxFileSize Целевой размер файла, созданный командой OPTIMIZE . 1073741824 (1 ГБ) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE является идемпотентным, но чрезмерно большой minFileSize может увеличить амплификацию записи. Например, если minFileSize задано значение 1 ГБ, файл размером 900 МБ может быть перезаписан после небольшой дополнительной записи. Инструкции по автоматическому управлению размером файлов см. в статье адаптивный размер целевого файла.

OPTIMIZE с упорядочением по Z-Order

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

  • Ваши запросы часто фильтруются по двум или нескольким столбцам одновременно (например, дата и идентификатор клиента), и
  • Эти предикаты достаточно выборочные, так что пропуск на уровне файлов снижает количество сканируемых файлов.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE с V-порядком

Эта VORDER клауза приводит к применению оптимизации V-порядка для сжатия файлов. Для получения дополнительной информации о V-порядке см. подробную документацию.

OPTIMIZE dbo.table_name VORDER

Вы можете объединить Z-Order и V-order в одной команде. Spark применяет операции в следующем порядке: уплотнение контейнера → Z-порядка → V-порядка.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

Поведение V-порядка во время OPTIMIZE зависит от того, как вы вызываете команду:

Инвокация Behavior
OPTIMIZE table VORDER Заставляет V-order переписывать файлы, независимо от настроек сессии или таблицы.
OPTIMIZE table (без VORDER ключевого слова) Наследует поведение порядка V, если TBLPROPERTIES("delta.parquet.vorder.enabled") установлено, иначе возвращается к конфигурации spark.sql.parquet.vorder.defaultсессии .

OPTIMIZE с кластеризацией жидкостей

Кластеризация liquid указывается как параметр таблицы; Дополнительные сведения см. в разделе "Включение кластеризации жидкости ". При включенной кластеризации жидкости, OPTIMIZE выполняет физическую перезапись, применяя политику кластеризации.

Это важно

Данные кластеризуются только при OPTIMIZE запуске на таблицах с поддержкой кластеризации. Обычные операции записи не кластерят данные. При наличии стратегии уплотнения, такой как использование автоматического уплотнения или ручное планирование заданий оптимизации, важно обеспечить реализацию преимуществ кластеризованных данных (например, улучшенное пропускание Delta-файлов).

OPTIMIZE FULL

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

OPTIMIZE FULL принудительно запускает проход рекластеризации для всей таблицы. Он рекластеризует каждый файл — включая те, которые ранее были сгруппированы с другими ключами или другим провайдером — чтобы вся таблица отражала последнюю стратегию кластеризации.

Замечание

OPTIMIZE FULLдоступна начиная с Fabric Spark runtime 2.0 (Delta 4.2).

Используйте OPTIMIZE FULL, когда вы:

  • Измените столбцы кластеризации в жидкой кластерной таблице.
  • Переместите таблицу между платформами или поставщиками кластеризации.
OPTIMIZE dbo.table_name FULL

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

Быстрая оптимизация

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

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

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

Быстрая оптимизация может быть точно настроена в соответствии с вашими ожиданиями относительно сжатия:

Недвижимость Description Значение по умолчанию Конфигурация сеанса
minNumFiles Количество небольших файлов, которые должны существовать в контейнере для выполнения оптимизации, если контейнер не содержит достаточно данных, чтобы, по оценкам, создать уплотненный файл. 50 spark.microsoft.delta.optimize.fast.minNumFiles
ParquetCoefficient Умножено на минимальный размер файла в условиях оптимизации, чтобы определить минимальный объем данных небольшого файла, который должен существовать в контейнере для включения в область применения сжатия. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Замечание

parquetCoefficient Это приводит к тому, что целевой размер ячейки превышает минимальный целевой размер файла в контексте оптимизации. Этот коэффициент учитывает реальность, что объединение нескольких небольших файлов «parquet» улучшает сжатие и, следовательно, данных получается меньше, чем сумма небольших файлов. Увеличьте значение, чтобы fast optimize реже пропускала бины, или уменьшите его, чтобы разрешить более частый пропуск бинов.

Принцип работы

"Fast Optimize" вводит дополнительные проверки перед сжатием контейнеров. Для каждой ячейки кандидата выполняется быстрая оптимизация:

  • Предполагаемый объем необработанных данных в ячейке (сумма небольших размеров файлов)
  • Как оценивается объединение небольших файлов для создания собрания файла с настроенным минимальным целевым размером
  • Содержит ли контейнер по крайней мере минимально настроенное количество небольших файлов

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

Снимок экрана, на котором показано, как быстро функция оптимизации оценивает, уплотнена ли корзина.

Замечание

Точную реализацию можно развивать с течением времени.

Быстрая оптимизация может уменьшить количество перезаписанных данных в течение жизненного цикла Delta-таблицы. Как показано на следующей схеме, быстрая оптимизация пропускает неоптимальные ячейки, что приводит к более быстрым и идемпотентным OPTIMIZE заданиям с меньшим увеличением объема записи.

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

Замечание

В целях иллюстрации предполагается, что размер файла, написанного из сжатия, — это сумма размера небольших файлов. Это также подразумевает наличие parquetCoefficient равного 1.

Ограничения
  • Неприменимо к операциям кластеризации жидкости и Z-Order
  • Быстрая оптимизация не изменяет поведение автоматического сжатия

Целевые объекты сжатия на уровне файлов

Чтобы избежать перезаписи данных, которые ранее считались компактными (достаточно большими) на основе изменения целевых значений минимального и максимального размера файлов, spark.microsoft.delta.optimize.fileLevelTarget.enabled можно включить, чтобы предотвратить повторную компиляцию уже сжатых файлов. При включении файлы не перекомпактируются, если они ранее достигли как минимум половины целевого размера файла на момент предыдущей компактизации. Поддержание целевых объектов на уровне файлов минимизирует усиление записи по мере изменения целевого размера уплотнения с течением времени (например, в результате оценки и установки более крупного целевого размера адаптивным образом). Если включено, тег OPTIMIZE_TARGET_SIZE добавляется в новые файлы при выполнении команды OPTIMIZE или для любой операции записи, если задано свойство таблиц delta.targetFileSize или delta.targetFileSize.adaptive.

Замечание

Хотя она не включена по умолчанию, корпорация Майкрософт рекомендует включить целевые объекты сжатия на уровне файлов , чтобы ограничить потенциальное увеличение объема записи.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Автоматическое сжатие

Автоматическое сжатие оценивает работоспособности секций после каждой операции записи. При обнаружении чрезмерной фрагментации файлов (слишком большого количества небольших файлов) в секции он запускает синхронную OPTIMIZE операцию сразу после фиксации записи. Подход, управляемый писателем, к обслуживанию файлов является оптимальным, так как сжатие выполняется только при программном определении целесообразности.

Включение на уровне сеанса

Установите spark.databricks.delta.autoCompact.enabled на уровне сеанса, чтобы включить автоматическое сжатие для новых таблиц, создаваемых в этом сеансе Spark.

SET spark.databricks.delta.autoCompact.enabled = TRUE

Включение на уровне таблицы

Задайте свойство delta.autoOptimize.autoCompact таблицы, чтобы включить автоматическое сжатие для определенных таблиц:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Используйте параметр delta.autoOptimize.autoCompact DataFrameWriter, чтобы включить автоматическое сжатие при создании таблицы:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

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

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Сокращение затрат на оценку

Начиная с версии 2.0 среды выполнения Fabric Spark (Delta 4.1), можно включить режим onCheckpointOnly автоматического уплотнения. По умолчанию автоматическое сжатие вычисляет метаданные файла после каждой операции записи, чтобы определить, имеет ли таблица слишком много небольших файлов. При этом onCheckpointOnly, вычисление откладывается до операций создания контрольной точки журнала (обычно каждые 10 коммитов). Во время контрольной точки моментальный снимок таблицы уже полностью восстановлен, поэтому оценка считывается из метаданных, которые уже в памяти, а не требуют дополнительного сканирования. Отложенное вычисление уменьшает накладные расходы на каждый коммит, при этом обеспечивая периодическое сжатие таблиц.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE