Облачные хранилища объектов, такие как Amazon S3 и Azure Blob Storage, стали одними из крупнейших и наиболее широко используемых систем хранения на планете, хранящих эксабайты данных для миллионов клиентов. Помимо традиционных преимуществ облачных сервисов, таких как выставление счетов по мере использования, экономия за счет масштаба и экспертное управление, облачные хранилища объектов особенно привлекательны, поскольку позволяют пользователям раздельно масштабировать вычислительные ресурсы и ресурсы хранения: например, пользователь может хранить петабайт данных, но запускать кластер только для выполнения запроса на несколько часов. В результате многие организации теперь используют облачные хранилища объектов для управления большими структурированными наборами данных в хранилищах данных и озерах данных.
Некоторые проблемы Delta Lake:
- Озера данных печально известны тем, что туда сбрасывается все. Иногда у нас может не быть смысла или причины для сброса данных туда; мы можем подумать, что он понадобится нам позже.
- Большая часть этого беспорядка связана с тем, что в вашем озере данных будет много маленьких файлов и разных типов данных. Поскольку существует множество небольших файлов, которые не сжаты, пытаться прочитать их в любой форме сложно, если не невозможно.
Ключевые особенности Delta Lake:
- Транзакции ACID (атомарность, согласованность, изоляция, долговечность) — с Delta вам не нужно писать код — транзакции записываются в журнал автоматически. Этот журнал транзакций является ключом и представляет собой единственный источник достоверной информации.
- Масштабируемая обработка метаданных — с легкостью обрабатывает терабайты и даже петабайты данных. Метаданные хранятся так же, как и данные, и вы можете отобразить их, используя функцию синтаксиса под названием Describe Detail, которая подробно описывает все метаданные, связанные с таблицей. Применяет всю мощь Spark к вашим метаданным.
- Принудительное применение схемы — это то, что делает Delta сильным в этой области, поскольку она обеспечивает соблюдение ваших схем. Если вы поместите схему в дельта-таблицу и попытаетесь записать в эту таблицу данные, которые не соответствуют схеме, это выдаст вам ошибку и не позволит вам записать это, предотвращая плохую запись. Методология принудительного исполнения считывает схему как часть метаданных; он просматривает каждый столбец, тип данных и т. д. и гарантирует, что то, что вы записываете в дельта-таблицу, совпадает с тем, что схема представляет из вашей дельта-таблицы — не нужно беспокоиться о записи неверных данных в вашу таблицу.
- Upserts и Deletes — эти операции обычно трудно выполнить без чего-то вроде Delta. Delta позволяет вам очень легко выполнять upserts или слияния. Слияния подобны слияниям SQL в вашей дельта-таблице, и вы можете объединять данные из другого фрейма данных в свою таблицу и выполнять обновления, вставки и удаления. Вы также можете выполнять регулярное обновление или удаление данных с помощью предиката для таблицы — то, что было почти неслыханно до Delta.
Создание озер данных:
Озеро данных — это центральное расположение, в котором хранится большой объем данных в исходном необработанном формате, а также способ организации больших объемов самых разнообразных данных. По сравнению с иерархическим хранилищем данных, в котором данные хранятся в файлах или папках, в озере данных для хранения данных используется плоская архитектура.
Озеро данных содержит большие данные из многих источников в необработанном формате. Он может хранить структурированные, полуструктурированные или неструктурированные данные, которые можно хранить в более гибком формате, чтобы мы могли преобразовывать их при использовании для аналитики, науки о данных и машинного обучения.
Проблема с озерами данных:
При работе с данными инженеры по данным, инженеры по машинному обучению и специалисты по данным сталкиваются с двумя проблемами: надежность и производительность.
Почему у этих проектов проблемы с надежностью и производительностью?
Ненадежные, низкокачественные данные приводят к снижению производительности. Данные в большинстве случаев не готовы для обработки данных и машинного обучения, поэтому группы обработки данных заняты созданием сложных конвейеров для обработки полученных данных путем разделения, очистки и обработки, чтобы сделать их полезными для обучения моделей и бизнес-аналитики.
Проблемы с надежностью:
- Неудачные задания оставляют данные в поврежденном состоянии. Это требует утомительной очистки данных после неудачных заданий. К сожалению, доступные решения для облачного хранения не обеспечивают встроенной поддержки атомарных транзакций, что приводит к неполным и поврежденным файлам в облаке, что может нарушить выполнение запросов и заданий на чтение.
- Отсутствие согласованности при смешивании операций добавления и чтения или при пакетной обработке и потоковой передаче данных в одно и то же место. Это связано с тем, что облачное хранилище, в отличие от RDMS, не совместимо с ACID.
Проблемы с производительностью:
- Несоответствие размера файла со слишком маленькими или слишком большими файлами. Наличие слишком большого количества файлов приводит к тому, что работники тратят больше времени на доступ, открытие и закрытие файлов при чтении, что влияет на производительность.
- Хотя секционирование полезно, оно может стать узким местом в производительности, если запрос выбирает слишком много полей.
Что такое Дельта-Лейк?
Delta Lake — это уровень хранения данных с открытым исходным кодом, который обеспечивает надежность озер данных. Он обеспечивает транзакции ACID, масштабируемую обработку метаданных и унифицирует потоковую и пакетную обработку данных. Delta Lake полностью совместим с API-интерфейсами Apache Spark. Вы можете легко использовать его поверх своего озера данных с минимальными изменениями, и да, это открытый исходный код! (Построен на стандартном паркете).
Delta Lake обеспечивает надежность и производительность озер данных.
Ключевые характеристики производительности:
- Сжатие. Delta Lake может повысить скорость запросов на чтение из таблицы за счет объединения небольших файлов в более крупные.
- Пропуск данных. Когда вы записываете данные в дельта-таблицу, информация собирается автоматически. Delta Lake на Databricks использует эту информацию (минимальные и максимальные значения) для ускорения запросов. Вам не нужно настраивать пропуск данных, чтобы эта функция была активирована (если применимо).
Основные характеристики надежности:
- ACID-транзакции: Наконец-то! Сериализуемые уровни изоляции гарантируют, что читатели никогда не увидят противоречивых данных, как в RDMS.
- Принудительное применение схемы.Delta Lake автоматически проверяет записываемую схему фрейма данных на совместимость со схемой таблицы. Перед записью из фрейма данных в таблицу Delta Lake проверяет, существуют ли столбцы в таблице во фрейме данных, совпадают ли типы данных столбцов и не могут ли имена столбцов отличаться (даже по регистру).
Мы собираемся использовать учебник по записной книжке, предоставленный Databricks, чтобы узнать, как мы можем использовать Delta Lake. Мы создадим стандартную таблицу с использованием формата Parquet и запустим быстрый запрос, чтобы наблюдать за ее производительностью. Затем мы создаем дельта-таблицу, оптимизируем ее и запускаем второй запрос, используя дельта-версию той же таблицы Databricks, чтобы увидеть разницу в производительности. Мы также посмотрим на историю стола.
Используемый набор данных относится к полетам авиакомпаний в 2008 году. Он содержит более 7 миллионов записей. Я буду использовать Python для этого урока, но вы можете согласиться, поскольку API-интерфейсы примерно одинаковы для любого языка.
Мы прочитаем набор данных, который изначально имеет формат CSV:
flights = spark.read.format("csv")
.option("заголовок", "true")
.option("inferSchema", "true")
.load("/databricks-datasets/asa/airlines/2008.csv")
Затем мы создадим таблицу из демонстрационных данных с помощью Parquet:
flights.write.format("паркет")
.mode(“перезаписать”)
.partitionBy("Происхождение")
.save(“/tmp/flights_parquet”)
Чтобы проверить производительность таблицы на основе паркета, мы запросим 20 крупнейших авиакомпаний с наибольшим количеством рейсов в 2008 г. по понедельникам по месяцам:
счетчик импорта из pyspark.sql.functions
flights_parquet = spark.read.format("паркет")
.load(“/tmp/flights_parquet”)
display(flights_parquet.filter("DayOfWeek = 1")
.groupBy("Месяц", "Происхождение")
.agg(count("*").alias("TotalFlights"))
.orderBy("Всего рейсов", по возрастанию=False)
.limit(20)
)
Этот запрос занял у меня около 38,94 секунды с кластером, использующим тип машины Standard_DS3_v2; Память 14 ГБ с 4 ядрами, использующая 4–8 узлов.
Теперь попробуем Дельту. Мы создадим таблицу на основе Delta, используя тот же набор данных:
рейсы.write.format («дельта»)
.режим («добавить»)
.partitionBy("Происхождение")
.save («/tmp/flights_delta»)
# Создаем дельта-таблицу
display(spark.sql("УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЮТ рейсы"))
display(spark.sql("СОЗДАТЬ ТАБЛИЦУ рейсов, ИСПОЛЬЗУЯ РАСПОЛОЖЕНИЕ DELTA ‘/tmp/flights_delta’»))
Прежде чем протестировать таблицу Delta, мы можем оптимизировать ее с помощью ZORDER по столбцу DayofWeek . Этот столбец используется для фильтрации данных при запросе (получение всех рейсов по понедельникам):
display(spark.sql("ОПТИМИЗАЦИЯ рейсов В ЗАКАЗЕ (День недели)"))
Хорошо, теперь мы можем проверить производительность запроса при использовании Databricks Delta:
рейсы_дельта = искра.чтение
.формат("дельта")
.load("/tmp/flights_delta")
отображать(
рейсы_дельта
.фильтр("ДеньНедели = 1")
.groupBy("Месяц","Происхождение")
.agg(количество("*")
.alias("Всего рейсов"))
.orderBy («Всего рейсов», по возрастанию = Ложь)
.лимит(20)
)
Выполнение запроса на Databricks Delta заняло всего 6,52 секунды.
ЗАКЛЮЧЕНИЕ
Delta Lake необходимо правильно поддерживать с помощью VACUME, следовать методам оптимизации и обработке метаданных, иначе это повлияет на общую производительность выполнения. Хотя Delta Lake имеет открытый исходный код, оно работает только с Databricks.