Рекомендации по использованию Delta Lake

В этой статье приведены рекомендации по использованию Delta Lake.

Обзор лучших практик

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

Удаление устаревших конфигураций Delta

Databricks рекомендует удалять наиболее явные устаревшие конфигурации Delta из конфигураций Spark и свойств таблицы при обновлении до новой версии среды выполнения Databricks. Устаревшие конфигурации могут препятствовать новым оптимизации и значениям по умолчанию, введенным Databricks, применяться к перенесенным рабочим нагрузкам.

Сжатие файлов

Прогнозная оптимизация автоматически выполняет команды OPTIMIZE и VACUUM в управляемых таблицах каталога Unity. См. прогнозную оптимизацию для управляемых каталогом Unity таблиц.

Databricks рекомендует часто выполнять команду OPTIMIZE для сжатия небольших файлов.

Примечание.

Эта операция не удаляет старые файлы. Чтобы удалить их, выполните команду VACUUM.

Не используйте кэширование Spark с Delta Lake

Databricks не рекомендует использовать кэширование Spark по следующим причинам:

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

Различия между Delta Lake и Parquet в Apache Spark

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

  • REFRESH TABLE: таблицы Delta всегда возвращают самые актуальные сведения, поэтому нет необходимости вручную вызывать REFRESH TABLE после изменений.
  • Добавление и удаление секций: Delta Lake автоматически отслеживает набор имеющихся в таблице секций и обновляет список по мере добавления или удаления данных. В результате нет необходимости выполнять ALTER TABLE [ADD|DROP] PARTITION или MSCK.
  • Загрузка одной секции: не требуется выполнять чтение секций напрямую. Например, не нужно запускать spark.read.format("parquet").load("/data/date=2017-01-01"). Вместо этого используйте условие WHERE для пропуска данных, например spark.read.table("<table-name>").where("date = '2017-01-01'").
  • Не изменяйте файлы данных вручную: Delta Lake использует журнал транзакций для фиксации изменений в таблице атомарным образом. Не изменяйте, не добавляйте и не удаляйте файлы данных Parquet напрямую в таблице Delta, так как это может привести к потере данных или повреждению таблицы.

Повышение производительности операции слияния в Delta Lake

Вы можете сократить время слияния с помощью следующих подходов:

  • Уменьшить область поиска для совпадений. по умолчанию операция merge выполняет поиск по всей таблице Delta, чтобы найти совпадения в исходной таблице. Один из способов ускорения merge — уменьшить область поиска, добавив известные ограничения в условие соответствия. Например, предположим, что имеется таблица, секционированная по country и date, и вы хотите использовать merge для обновления сведений за последний день и определенную страну. При добавлении следующего условия запрос ускоряется, так как он ищет совпадения только в соответствующих разделах:

    events.date = current_date() AND events.country = 'USA'
    

    Кроме того, этот запрос также снижает вероятность конфликтов с другими параллельными операциями. Дополнительные сведения см. в разделе "Уровни изоляции" и "Конфликты записи ".

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

  • Управлять секциями перемешивания для записи. Операция mergeнесколько раз перемешивает данные для вычислений и записывает обновленные данные. Количество задач, используемых для случайного перемещения, управляется конфигурацией сеанса Spark spark.sql.shuffle.partitions. Установка этого параметра не только управляет параллелизмом, но и определяет количество выходных файлов. Увеличение значения увеличивает параллелизм, но также создает большее количество файлов данных меньшего размера.

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

  • Настройка размеров файлов в таблице: Azure Databricks автоматически настраивает размеры файлов на основе размера таблицы, используя небольшие файлы для небольших таблиц и больших файлов для больших таблиц. Дополнительные сведения см. в разделе о настройке размеров файлов.

  • Low Shuffle Merge: Low Shuffle Merge обеспечивает оптимизированную реализацию MERGE, которая обеспечивает более высокую производительность для большинства распространенных рабочих нагрузок. Кроме того, он сохраняет существующие оптимизации макета данных, такие как кластеризация жидкости на неизмененных данных.