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


Оптимизация таблицы 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 VertiPaq и файлы формата Parquet для достижения времени доступа к данным, сравнимого с доступом к памяти. Spark и другие вычислительные подсистемы, отличные от Verti-Scan, также получают преимущества от V-Упорядоченных файлов со средним временем чтения на 10 % быстрее с некоторыми сценариями до 50 %.

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

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

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

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

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

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

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

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

%%sql 
SET spark.sql.parquet.vorder.default 

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

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

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

Внимание

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

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

Управление V-Order с помощью свойств таблицы Delta

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

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.default" = "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.default" = "true");

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

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

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

Управление V-порядком непосредственно при операциях записи

Все команды записи 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.default не задано или установлено в 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.default ","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.default","true")\
  .location("Files/people")\
  .execute()

Что такое Optimize Write?

Аналитические рабочие нагрузки в модулях обработки больших данных, таких как 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 Merge см. в статье «Оптимизация Low Shuffle Merge» в таблицах Delta.

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

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

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

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

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

Внимание

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

Управление порядком V-Order при оптимизации таблицы

Следующие команды структурируют 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, ...)];