Поделиться через


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

Как и в файловых системах и реляционных базах данных, данные становятся фрагментированными с течением времени, если они не управляются, что приводит к чрезмерным затратам на вычислительные ресурсы для чтения данных. Delta Lake не является исключением. Файлы данных следует периодически переписать в оптимальный макет, чтобы сократить затраты на отдельные операции файлов, улучшить сжатие данных и оптимизировать параллелизм чтения. Эта OPTIMIZE команда решает эту проблему: она группирует небольшие файлы в секции в ячейки, предназначенные для идеального размера файла и перезаписывает их в хранилище. Результатом является то же самое сжатие данных в меньшее количество файлов.

Подсказка

Полное руководство по перекрестным рабочим нагрузкам и стратегиям оптимизации сжатия для различных сценариев потребления (конечная точка SQL Analytics, Power BI Direct Lake, Spark) см. раздел «Обслуживание и оптимизация таблиц между рабочими нагрузками».

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

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

Команда OPTIMIZE

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

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

Это важно

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

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

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

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

OPTIMIZE с системой V-Order

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

OPTIMIZE dbo.table_name VORDER

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

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

Это важно

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

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

Быстрая оптимизация интеллектуально анализирует файлы таблиц 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" вводит дополнительные проверки перед сжатием контейнеров. Для каждой ячейки кандидата выполняется быстрая оптимизация:

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

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

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

Замечание

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

Быстрая оптимизация может привести к уменьшению объёма данных, перезаписываемых в течение жизненного цикла таблиц 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 операцию сразу после фиксации записи. Подход, управляемый писателем, к обслуживанию файлов является оптимальным, так как сжатие выполняется только при программном определении целесообразности.

Установите на уровне сеанса для включения автоматического сжатия в новых таблицах:

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

Установите на уровне таблицы, чтобы включить только для определённых таблиц.

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

Используйте параметр DataFrameWriter для включения в новых таблицах:

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

Включите существующие таблицы:

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

Поведение автоматического сжатия можно настроить с помощью следующих конфигураций сеанса Spark:

Недвижимость Description Значение по умолчанию Конфигурация сеанса
maxFileSize Максимальный размер целевого файла в байтах для сжатых файлов. 134217728b (128 МБ) spark.databricks.delta.autoCompact.maxFileSize
minFileSize Минимальный размер файла в байтах для файла, который следует считать компактным. Все, что находится ниже этого порога, рассматривается для уплотнения и учитывается в пределах порогового minNumFiles значения. По умолчанию значение не задано и вычисляется как 1/2 от maxFileSize, если вы явно не зададите значение. spark.databricks.delta.autoCompact.minFileSize
minNumFiles Минимальное количество файлов, которое должно существовать ниже порогового значения, чтобы инициировать автоматическое minFileSize сжатие. 50 spark.databricks.delta.autoCompact.minNumFiles

Замечание

Корпорация Майкрософт рекомендует использовать автоматическое сжатие вместо планированияOPTIMIZE заданий. Автоматическое сжатие обычно превосходит запланированные задания сжатия в плане максимизации производительности операций чтения и записи и часто устраняет трудозатраты на обслуживание, такие как написание кода, планирование и оптимизация частоты выполнения запланированных заданий. Автоматическое сжатие рекомендуется, если цели уровня обслуживания обработки данных допускают добавленную задержку от автоматического сжатия при необходимости сжатия. Если требования к задержке данных являются строгими, может оказаться более эффективным планирование оптимизации для запуска в отдельном пуле Spark, чтобы операции записи не отображали периодические пики из-за запуска синхронных операций сжатия.

Это важно

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

Обслуживание таблиц в системе Lakehouse

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

Сводка рекомендаций

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