Оптимизация таблицы Delta Lake и V-Order

Формат таблицы Lakehouse и Delta Lake являются центральными для Microsoft Fabric, гарантируя, что таблицы оптимизированы для аналитики является ключевым требованием. В этом руководстве рассматриваются основные понятия оптимизации таблиц Delta Lake, конфигурации и способы его применения к наиболее распространенным шаблонам использования больших данных.

Что такое V-Order?

V-Order — это оптимизация времени записи в формат файла parquet, который позволяет быстро считывать данные в вычислительных модулях Microsoft Fabric, таких как Power BI, SQL, Spark и другие.

Подсистемы Power BI и SQL используют технологию Microsoft Verti-Scan и Упорядоченные файлы parquet для достижения времени доступа к данным в памяти. Spark и другие вычислительные подсистемы, отличные от Verti-Scan, также получают преимущества от V-Упорядоченных файлов со средним временем чтения на 10 % быстрее с некоторыми сценариями до 50 %.

V-Order работает путем применения специальных сортировки, распределения групп строк, кодирования словаря и сжатия файлов parquet, поэтому требуется меньше сетевых, дисковых ресурсов и ресурсов ЦП в вычислительных модулях для чтения, обеспечивая экономичность и производительность. Сортировка по заказу V-Order влияет на среднее время записи на 15 %, но обеспечивает до 50 % больше сжатия.

Это 100% формат с открытым исходным кодом, соответствующий формату parquet; все обработчики parquet могут читать его как обычные файлы parquet. Разностные таблицы более эффективны, чем когда-либо; такие функции, как Z-Order, совместимы с V-Order. Свойства таблицы и команды оптимизации можно использовать для управления V-Order в своих разделах.

V-Order применяется на уровне файла parquet. Разностные таблицы и ее функции, такие как Z-Order, сжатие, вакуум, путешествие по времени и т. д. являются ортогональными для V-Order, как это так, совместимы и могут использоваться вместе для дополнительных преимуществ.

Управление записью V-Order

V-Order включен по умолчанию в Microsoft Fabric и в Apache Spark управляется следующими конфигурациями.

Настройка Значение по умолчанию Description
spark.sql.parquet.vorder.enabled true Управляет записью на уровне сеанса V-Order.
TBLPROPERTIES("delta.parquet.vorder.enabled") false Режим V-Order по умолчанию для таблиц
Параметр записи кадра данных: parquet.vorder.enabled unset Управление записью V-Order с помощью средства записи кадра данных

Используйте следующие команды для управления использованием операций записи V-Order.

Проверка конфигурации V-Order в сеансе Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled 

Отключение записи V-Order в сеансе Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled=FALSE 

Включение записи V-Order в сеансе Apache Spark

Внимание

Если этот параметр включен на уровне сеанса. Все записи parquet создаются с поддержкой V-Order. К ним относятся таблицы, не относящиеся к delta parquet, и таблицы Delta со свойством parquet.vorder.enabled таблицы, равным либо true false.

%%sql 
SET spark.sql.parquet.vorder.enabled=TRUE 

Управление виртуальным порядком с помощью свойств таблицы Delta

Включите свойство таблицы V-Order во время создания таблицы:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

Внимание

Если для свойства таблицы задано значение true, команды INSERT, UPDATE и MERGE будут вести себя должным образом и выполнять оптимизацию во время записи. Если для конфигурации сеанса V-Order задано значение true, или spark.write включает его, записи будут иметь значение V-Order, даже если для TBLPROPERTIES задано значение false.

Включите или отключите V-Order, изменив свойство таблицы:

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

После включения или отключения V-Order с помощью свойств таблицы затрагиваются только будущие записи в таблицу. Файлы Parquet сохраняют порядок, используемый при создании. Чтобы изменить текущую физическую структуру для применения или удаления V-Order, ознакомьтесь с разделом "Управление виртуальным порядком при оптимизации таблицы" ниже.

Управление виртуальным порядком непосредственно при операциях записи

Все команды записи Apache Spark наследуют параметр сеанса, если не явный. Все следующие команды записываются с помощью V-Order, неявно наследуя конфигурацию сеанса.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

Внимание

V-Order применяется только к файлам, затронутым предикатом.

В сеансе, где spark.sql.parquet.vorder.enabled не задано значение false, следующие команды будут записываться с помощью V-Order:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .option("parquet.vorder.enabled ","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()

Что такое оптимизация записи?

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

Оптимизация записи — это функция Delta Lake в Microsoft Fabric и Azure Synapse Analytics в подсистеме Apache Spark, которая уменьшает количество файлов, записанных и направленная на увеличение размера отдельных файлов записанных данных. Размер целевого файла можно изменить для каждой рабочей нагрузки с помощью конфигураций.

Эта функция включена по умолчанию в среде выполнения Microsoft Fabric для Apache Spark. Дополнительные сведения о сценариях оптимизации использования записи см. в статье о необходимости оптимизации записи в Apache Spark.

Оптимизация слияния

Команда Delta Lake MERGE позволяет пользователям обновлять разностную таблицу с расширенными условиями. Он может обновлять данные из исходной таблицы, представления или кадра данных в целевую таблицу с помощью команды MERGE. Однако текущий алгоритм в открытый код распределении Delta Lake не полностью оптимизирован для обработки неизмененных строк. Команда Microsoft Spark Delta реализовала пользовательскую оптимизацию слияния Low Shuffle, неизмененные строки исключаются из дорогостоящей операции перетасовки, необходимой для обновления сопоставленных строк.

Реализация управляется spark.microsoft.delta.merge.lowShuffle.enabled конфигурацией, включенной по умолчанию в среде выполнения. Он не требует изменений кода и полностью совместим с дистрибутивом Delta Lake с открытым исходным кодом. Дополнительные сведения о сценариях использования слиянием low Shuffle см. в статье "Оптимизация слияния low Shuffle" в таблицах Delta.

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

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

  • Новые данные, добавленные в таблицу, могут сложить данные.
  • Скорость приема данных пакетной и потоковой передачи может привести к большому объему небольших файлов.
  • Операции обновления и удаления в конечном итоге создают затраты на чтение; Файлы parquet неизменяемы по дизайну, поэтому разностные таблицы добавляют новые файлы parquet с набором изменений, что еще больше увеличивает проблемы, введенные первыми двумя элементами.
  • Больше не нужны файлы данных и файлы журналов, доступные в хранилище.

Чтобы сохранить таблицы в лучшем состоянии для оптимальной производительности, выполнять операции с сжатием двоичных объектов и вакуумными операциями в таблицах Delta. Bin-compaction достигается командой OPTIMIZE ; она объединяет все изменения в большие консолидированные файлы parquet. Очистка хранилища разыменовывается с помощью команды VACUUM .

Команды обслуживания таблиц OPTIMIZE и VACUUM можно использовать в записных книжках и определениях заданий Spark, а затем управлять с помощью возможностей платформы. Lakehouse в Fabric предоставляет функциональные возможности для использования пользовательского интерфейса для выполнения нерегламентированного обслуживания таблиц, как описано в статье обслуживания таблиц Delta Lake.

Внимание

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

Управление виртуальным порядком при оптимизации таблицы

Следующие команды структурируют bin-compact и перезаписывают все затронутые файлы с помощью V-Order, независимо от параметра TBLPROPERTIES или параметра конфигурации сеанса:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

При совместном использовании ZORDER и VORDER Apache Spark выполняет последовательное выполнение bin-compaction, ZORDER, VORDER.

Следующие команды bin-compact и перезаписывают все затронутые файлы с помощью параметра TBLPROPERTIES. Если для TBLPROPERTIES задано значение V-Order, все затронутые файлы записываются как V-Order. Если TBLPROPERTIES не задан или имеет значение false v-Order, он наследует параметр сеанса; Чтобы удалить V-Order из таблицы, задайте для конфигурации сеанса значение false.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];