Создание разностных таблиц

Завершено

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

Функция OptimizeWrite

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

Схема, показывающая, как оптимизация записи записывает меньше больших файлов.

В Microsoft Fabric OptimizeWrite включена по умолчанию. Его можно включить или отключить на уровне сеанса Spark:

# Disable Optimize Write at the Spark session level
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", False)

# Enable Optimize Write at the Spark session level
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", True)

print(spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled"))

Примечание.

OptimizeWrite также можно задать в свойствах таблицы и для отдельных команд записи.

Оптимизация

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

  • меньше больших файлов
  • лучшее сжатие
  • эффективное распределение данных между узлами

Схема, показывающая, как оптимизация объединяет файлы Parquet.

Чтобы выполнить оптимизацию, выполните следующую команду:

  1. В Lakehouse Explorer выберите ... меню рядом с именем таблицы и выберите "Обслуживание".
  2. Выберите команду Run OPTIMIZE. ( Выполнить оптимизацию).
  3. При необходимости выберите "Применить V-порядок", чтобы максимально увеличить скорость чтения в Fabric.
  4. Выберите Запустить сейчас.

Функция V-Order

При запуске Optimize можно при необходимости запустить V-Order, который предназначен для формата файла Parquet в Fabric. V-Order обеспечивает молниеносное чтение с использованием времени доступа к данным в памяти. Кроме того, она повышает эффективность затрат, так как она уменьшает сетевые ресурсы, диски и ресурсы ЦП во время чтения.

V-Order включен по умолчанию в Microsoft Fabric и применяется как данные записываются. Это вызывает небольшую нагрузку около 15% делает запись немного медленнее. Однако V-Order позволяет быстрее считывать данные из вычислительных подсистем Microsoft Fabric, таких как Power BI, SQL, Spark и другие.

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

V-Order работает путем применения специальных сортировки, распределения групп строк, кодирования словаря и сжатия в файлах Parquet. Это 100 % соответствует формату Parquet с открытым исходным кодом, и все обработчики Parquet могут читать его.

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

Примените V-Order к отдельным таблицам с помощью функции обслуживания таблиц, выполнив OPTIMIZE команду.

Изображение экрана обслуживания таблицы с выбранным вариантом V-order

Vacuum

Команда VACUUM позволяет удалить старые файлы данных.

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

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

Схема, показывающая, как работает вакуум.

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

  • требования к хранению данных.
  • Объем данных и затраты на хранение
  • Частота изменения данных
  • Нормативные требования

Срок хранения по умолчанию составляет 7 дней (168 часов), а система запрещает использовать более короткий период хранения.

Вы можете запустить VACUUM на нерегламентированном или запланированном режиме с помощью записных книжек Fabric.

Запустите VACUUM в отдельных таблицах с помощью функции обслуживания таблиц:

  1. В Lakehouse Explorer выберите ... меню рядом с именем таблицы и выберите "Обслуживание".
  2. Выберите команду Run VACUUM с помощью порогового значения хранения и задайте пороговое значение хранения.
  3. Выберите Запустить сейчас.

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

Вы также можете запустить VACUUM в качестве команды SQL в записной книжке:

%%sql
VACUUM lakehouse2.products RETAIN 168 HOURS;

ВАКУУМ фиксирует журнал транзакций Delta, чтобы просмотреть предыдущие запуски в ЖУРНАЛЕ ОПИСАНИЙ.

%%sql
DESCRIBE HISTORY lakehouse2.products;

Секционирование разностных таблиц

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

Рассмотрим ситуацию, когда хранятся большие объемы данных о продажах. Вы можете секционирование данных о продажах по годам. Секции хранятся в вложенных папках с именем Year=2021, Year=2022 и т. д. Если вы хотите сообщить только о данных о продажах за 2024 год, можно пропустить секции в течение других лет, что повышает производительность чтения.

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

Используйте секционирование, если:

  • У вас есть очень большие объемы данных.
  • Таблицы можно разделить на несколько больших секций.

Не используйте секционирование, если:

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

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

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

В этом примере кадр данных, содержащий данные продукта, секционируется по категориям:

df.write.format("delta").partitionBy("Category").saveAsTable("partitioned_products", path="abfs_path/partitioned_products")

В обозревателе Lakehouse можно увидеть, что данные являются секционированной таблицей.

  • В таблице есть одна папка с именем "partitioned_products".
  • Существуют вложенные папки для каждой категории, например "Category=Bike Racks", и т. д.

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

С помощью SQL можно создать аналогичную секционированную таблицу:

%%sql
CREATE TABLE partitioned_products (
    ProductID INTEGER,
    ProductName STRING,
    Category STRING,
    ListPrice DOUBLE
)
PARTITIONED BY (Category);