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


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

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

Внимание

Команды OPTIMIZE , приведенные в этой статье, являются командами Spark SQL и должны выполняться в средах Spark, таких как:

Эти команды не поддерживаются в редакторе запросов SQL Analytics Endpoint or Warehouse SQL, которые поддерживают только команды T-SQL. Для обслуживания таблиц с помощью конечной точки аналитики SQL используйте параметры пользовательского интерфейса Maintenance Lakehouse или выполните команды в записной книжке Fabric.

Что такое 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 с помощью сортировки, распределения групп строк, кодирования и сжатия, уменьшая использование ресурсов и повышая производительность и эффективность затрат. Хотя это увеличивает время записи примерно на 15%, сжатие может повыситься до 50%. Сортировка по заказу 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 используется для оптимизации макета файла Parquet для повышения производительности запросов, особенно в сценариях с большим количеством операций чтения. В Microsoft Fabric V-Order по умолчанию отключен для всех созданных рабочих областей для оптимизации производительности рабочих нагрузок разработки данных с высокой нагрузкой на запись.

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

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

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

Внимание

  • V-Order отключен по умолчанию в новых рабочих областях Fabric (spark.sql.parquet.vorder.default=false) для повышения производительности конвейеров приема и преобразования данных.

  • Если ваша рабочая нагрузка ориентирована на чтение, например, на интерактивные запросы или на панели мониторинга, включите V-Order с помощью следующих конфигураций:

    • Задайте для свойства spark.sql.parquet.vorder.default Spark значение true.
    • Переключите профили ресурсов на readHeavyforSpark или ReadHeavy. Этот профиль автоматически включает V-Order для повышения производительности чтения.

В среде выполнения Fabric 1.3 и более поздних версий spark.sql.parquet.vorder.enable параметр удаляется. Так как V-Order применяется автоматически во время оптимизации delta с помощью инструкций OPTIMIZE, не требуется вручную включить этот параметр в более новых версиях среды выполнения. Если вы переносите код из более ранней версии среды выполнения, вы можете удалить этот параметр, так как модуль теперь обрабатывает его автоматически.

Проверка конфигурации 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, что включает как таблицы в формате parquet, отличные от Delta, так и таблицы Delta, в которых свойство таблицы установлено либо на parquet.vorder.enabled, либо на true.

%%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.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, см. как управлять 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.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()

Что такое Optimize Write?

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

Оптимизация записи — это функция Delta Lake в Fabric и Synapse, которая уменьшает количество файлов и увеличивает отдельный размер файла во время записи в 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 добавляют новые файлы 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 из таблицы, задайте для конфигурации сеанса значение false.

Замечание

При использовании этих команд в записных книжках Fabric убедитесь, что между %%sql и командой OPTIMIZE есть пробел. Правильный синтаксис:

%%sql 
OPTIMIZE table_name;

Не:%%sqlOPTIMIZE table_name; (это приведет к ошибке синтаксиса)

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

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