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


Оптимизация макета файла данных

Прогнозная оптимизация автоматически выполняется OPTIMIZE в управляемых таблицах каталога Unity. Databricks рекомендует включить прогнозную оптимизацию для всех управляемых таблиц каталога Unity, чтобы упростить обслуживание данных и сократить затраты на хранение. См . статью "Прогнозная оптимизация" для Delta Lake.

Команда OPTIMIZE перезаписывает файлы данных для улучшения макета данных для таблиц Delta. Для таблиц с включенным OPTIMIZE кластеризированием жидкости перезаписывает файлы данных в группирование данных по ключам кластеризации жидкости. Для таблиц с определенными секциями, сжатие файлов и макет данных выполняются в разделах.

Таблицы без отказоустойчивой кластеризации могут дополнительно включать ZORDER BY предложение для улучшения кластеризации данных при перезаписи. Databricks рекомендует использовать кластеризацию жидкости вместо секций или других подходов ZORDERк макету данных.

См. раздел "ОПТИМИЗАЦИЯ".

Примеры синтаксиса

Сжатие запускается с помощью команды OPTIMIZE:

SQL

OPTIMIZE delta.`/data/events`

Python

from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

или, кроме того, можно также:

SQL

OPTIMIZE events

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

Если имеется большой объем данных и требуется только оптимизировать подмножество данных, можно указать необязательный предикат секционирования, используя WHERE:

SQL

OPTIMIZE events WHERE date >= '2022-11-18'

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Примечание.

  • Результат оптимизации для упаковки данных в контейнеры идемпотентен. Это значит, что если повторно оптимизировать набор данных этим способом, это никак не повлияет на их расположение.
  • Задача bin-упаковки в том, чтобы равномерно сбалансировать файлы данных в соответствии с их размером на диске, но при этом количество кортежей на файл не обязательно должно учитываться. Однако оба этих показателя часто бывают взаимозависимыми.
  • API Python и Scala для выполнения OPTIMIZE операций доступны в Databricks Runtime 11.3 LTS и более поздних версиях.

Модули чтения таблиц Delta используют изоляцию моментального снимка, то есть, они не прерываются, когда OPTIMIZE удаляет ненужные файлы из журнала транзакций. OPTIMIZE не вносит изменения, связанные с данными, в таблицу, поэтому чтение до и после OPTIMIZE дает те же результаты. Выполнение OPTIMIZE в таблице, которая является источником потоковой передачи, не влияет на текущие или будущие потоки, которые обрабатывают эту таблицу как источник. OPTIMIZE возвращает статистику файла (min, max, total и т. д.) для удаленных файлов и файлов, добавленных этой операцией. Оптимизация статистики также содержит статистику по Z-упорядочению, число пакетов и оптимизированные секции.

Вы также можете автоматически сжимать небольшие файлы с помощью автоматического сжатия. См. раздел "Автоматическое сжатие" для Delta Lake в Azure Databricks.

Как часто я должен работать OPTIMIZE?

Включите прогнозную оптимизацию для управляемых таблиц каталога Unity, OPTIMIZE чтобы обеспечить автоматическое выполнение при экономичности.

При выборе частоты запуска OPTIMIZE учитывается компромисс между производительностью и затратами. Для повышения производительности запросов конечных пользователей запустите OPTIMIZE чаще. Это приведет к более высокой стоимости из-за увеличения использования ресурсов. Чтобы оптимизировать затраты, запустите его реже.

Databricks рекомендует начать работу OPTIMIZE ежедневно, а затем настроить частоту, чтобы сбалансировать затраты и компромиссы производительности.

Какой тип лучшего экземпляра для запуска OPTIMIZE (bin-упаковка и Z-Ordering) включено?

Обе операции предполагают интенсивное использование ресурсов ЦП, выполняющие большие объемы кодирования и декодирования Parquet.

Databricks рекомендует типы оптимизированных для вычислений экземпляров. OPTIMIZE также поддерживает подключаемые диски SSD.