[Перевод] Форматы данных и файлов: руководство для архитекторов

v_6-sacnzz_cwaglg_3tcw-ecqo.jpeg

В мире данных происходит революция. Сегодня волна Open-Source-форматов данных, поднявшаяся благодаря развитию технологий, меняет привычное положение дел для всех участников экосистемы, от поставщиков до предприятий. Вы наверняка слышали о таких форматах, как Parquet, ORC, Avro, Arrow, Protobuf, Thrift и MessagePack. Команда VK Cloud перевела статью о том, что они собой представляют и какой из них лучше выбрать. 

Трудности с большими данными


Чтобы вовремя генерировать аналитику, необходимую для информированных решений и оптимизации бизнеса, нужно правильно организовать и анализировать данные. Работа с неструктурированными данными — изображениями, PDG, аудио, видео и т. п. — сопряжена с различными трудностями. Структурированные и полуструктурированные данные, такие как файлы CSV, XML, JSON и другие, плохо поддаются сжатию, оптимизации и долговременному хранению.

Бизнес-данные, которые накапливают компании, становятся все сложнее. Раньше для каждого Data Event создавалось по 20 полей, но их количество уже давно перевалило за сотню. Эти данные легко хранить в озере, но в строковых форматах для выполнения запроса нужно просканировать значительный объем данных.

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

Форматы данных для микросервисов


Сначала давайте посмотрим на структуры, достаточно далекие от озера данных. Форматы Protobuf, Thrift и MessagePack больше подходят для взаимодействия между микросервисами.

Protocol Buffers


Protocol Buffers от Google (также известный как Protobuf) — это формат сериализации данных без привязки к языку и платформе. Он позволяет эффективно кодировать структурированную информацию для передачи по сети или хранения в файле. Это расширяемый формат, так что пользователи могут определять собственные типы и структуры данных. Protobuf обеспечивает компактное бинарное представление, которое можно эффективно передавать и хранить.

Protocol Buffers используется в разных API Google и поддерживается многими языками программирования, в том числе C++, Python и Java. Его часто используют в ситуациях, когда данные нужно передать по сети или хранить в компактном формате, как в случае с протоколами передачи данных, хранилищами и интеграцией.

Обзор реализации


gRPC — это современный, высокопроизводительный Open-Source-фреймворк RPC (удаленного вызова процедур), который можно запустить в любой среде. Он обеспечивает непосредственное взаимодействие между методами клиентских и серверных приложений подобно вызову метода в объектно-ориентированном программировании. gRPC построен на основе HTTP/2 как транспортного протокола и фреймворка ProtoBuf для кодирования запросов и ответных сообщений. Эффективность gRPC, способного работать в любой среде, обеспечивается поддержкой двунаправленной потоковой передачи и обменом сообщениями с небольшой задержкой. gRPC используется в разных API Google и поддерживается множеством языков программирования, в том числе C++, Python и Java.

Формат применяется в контекстах и приложениях, для которых важны низкий уровень задержки, высокая производительность и эффективность обмена сообщениями. Его часто используют для связи между собой полиглотных систем, например мобильных устройств, веб-клиентов и бэкенд-сервисов. Кроме того, он подходит для подключения сервисов и создания масштабируемых распределенных систем в микросервисных архитектурах. gRPC также применяется в IoT-приложениях, для потоковой передачи и обмена сообщениями в реальном времени и для подключения облачных сервисов.

7dzyx4t4rgfwpsojxi2ukajochk.png
Источник: developers.google.com/protocol-buffers

Thrift


Thrift — это язык описания интерфейсов (IDL) и протокол связи, который обеспечивает разработку масштабируемых сервисов, работающих с несколькими языками программирования. Он похож на другие языки IDL, например на CORBA и Google Protocol Buffers, но меньше весит и проще в использовании. В Thrift используется механизм генерации кода для необходимого языка программирования на основе определений IDL. Таким образом, разработчики могут легко создавать клиентские и серверные приложения, способные взаимодействовать друг с другом посредством двоичного протокола связи Thrift. Сфера применения Thrift охватывает распределенные системы, микросервисы и Message-oriented middleware.

Поддерживаемые языки


Apache Thrift поддерживает множество языков программирования, в том числе функциональные языки, например Erlang и Haskell. С Thrift можно определить сервис на одном языке, а потом сгенерировать необходимый код для реализации на другом. Также можно сгенерировать клиентские библиотеки, которые обеспечат вызов сервиса из другого языка. Таким образом, можно создавать взаимосвязанные системы, в которых используются разные языки программирования.

Обзор реализации


Код, сгенерированный компилятором IDL, создает клиент-серверные заглушки. Под капотом они взаимодействуют между этими двумя нативными протоколами и транспортным уровнем, тем самым обеспечивая RPC между процессорами.

lgi42336sbja8ykyafkyhieq60s.png
Источник: https://thrift.apache.org/

MessagePack


MessagePack — это формат сериализации, который обеспечивает компактное бинарное представление структурированных данных. Он эффективнее и быстрее других форматов сериализации, таких как JSON, благодаря представлению в двоичном, а не в текстовом формате. MessagePack применяют в распределенных системах, микросервисах и хранилищах данных. Он поддерживается множеством языков программирования, в том числе C++, Python и Java. Его часто используют, чтобы передавать данные по сети или хранить их в компактном формате. Кроме того, MessagePack — это расширяемый формат, так что пользователи могут определять собственные типы и структуры.

Обзор реализации


Мы в MinIO решили использовать MessagePack в качестве формата сериализации. Благодаря возможности добавлять и удалять ключи обеспечивается расширяемость с JSON. Его изначальная реализация — это заголовок, за которым следует объект MessagePack со структурой:

{
  "Versions": [
    {
      "Type": 0, // Type of version, object with data or delete marker.
      "V1Obj": { /* object data converted from previous versions */ },
      "V2Obj": {
          "VersionID": "",  // Version ID for delete marker
          "ModTime": "",    // Object delete marker modified time
          "PartNumbers": 0, // Part Numbers
          "PartETags": [],  // Part ETags
          "MetaSys": {} 	// Custom metadata fields.
          // More metadata
      },
      "DelObj": {
          "VersionID": "", // Version ID for delete marker
          "ModTime": "",   // Object delete marker modified time
          "MetaSys": {}    // Delete marker metadata
      }
    }
  ]
}


Преобразования метаданных унаследованы от предыдущих версий, а новые версии включают V2Obj или DelObj в зависимости от активной операции при получении запросов на обновление. В сущности, когда нам нужно просто прочитать метаданные, можно остановить чтение файла, дочитав до их конца. Для получения обновлений нужно максимум два непрерывных чтения. Для этого меняется и представление на диске. Раньше все метаданные хранились как большой объект, содержащий все версии. Теперь мы пишем это следующим образом:

  • сигнатура с версией;
  • версия данных заголовка (целое число);
  • версия метаданных (целое число);
  • счетчик версий (целое число).


rqni1o79_u5bfp3yvffxz98lqwq.png
Общая структура xl.meta

Форматы данных для потоковой передачи


Avro


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

В Avro для сериализации и десериализации данных определяется схема, поэтому он поддерживает разнообразные структуры данных и их изменение с течением времени. А еще Avro работает с файлами контейнеров для хранения Persistent Data, RPC и интеграции с разными языками.

Формат основан на схемах, которые сохраняются в файле при записи данных. Схема представляет собой JSON-документ, определяющий структуру, которая хранится в файле или передается в сообщении Avro. Она определяет тип для полей данных, а также имена и порядок следования этих полей. Кроме того, структура может содержать информацию о кодировании и сжатии данных, а также о любых метаданных.

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

Основанный на схемах подход обеспечивает компактность и высокую скорость сериализации, поддерживая при этом динамические скриптовые языки. Файлы можно обработать позже в любой программе. А если программе, считывающей данные, нужна другая схема, нет проблем, ведь обе схемы доступны.

Поддерживаемые языки


Apache Avro — наиболее популярный формат сериализации для записи данных; его чаще всего выбирают для пайплайнов потоковой передачи. В нем есть надежная поддержка эволюции схемы, а также реализации для JVM (Java, Kotlin, Scala, …), Python, C/C++/C#, PHP, Ruby, Rust, JavaScript и даже Perl.

У нас в документации есть полезные материалы по сравнению Avro с другими системами. Apache Kafka и платформа Confluent разработали специальные коннекторы для него, но они работают с любым форматом данных.

0_xxn7dk8pe4wlmqfgxwk-6uius.png

Форматы файлов Big Data для озера данных


Parquet


Apache Parquet — это столбчатый формат хранения для обработки больших данных. Он активно используется в экосистеме Hadoop. Несмотря на снижение ее популярности, этот формат остается весьма распространенным — отчасти потому, что он все еще поддерживается ключевыми системами обработки данных, в том числе Apache Spark, Apache Flink и Apache Drill.

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

Обзор реализации


Эта схема позволяет эффективно фиксировать метаданные, поддерживает эволюцию файлового формата и упрощает хранение. Алгоритмы сжатия Parquet снижают требования к объемам хранилища, позволяют быстрее извлекать данные и поддерживаются множеством фреймворков. Есть три типа метаданных: файла, столбца (фрагмента) и заголовка страницы. Для сериализации и десериализации структур метаданных в Parquet используется Thrift TCompactProtocol.

cwkcne7djshtgmzmlooyoo4kod4.png
Источник: parquet.apache.org

ORC


ORC, или Optimized Row Columnar — это формат хранения, предназначенный для повышения производительности систем обработки данных. ORC хранит информацию в столбчатом виде. Это позволяет быстрее выполнять запросы и анализ, поскольку доступ осуществляется только к нужным столбцам без чтения всех строк. Функции ORC также включают сжатие, Predicate Pushdown, улучшенный параллелизм при использовании отдельных RecordReader для одних и тех же файлов и вывод типов для дальнейшего повышения производительности.

Еще одно преимущество ORC по сравнению с RCFile, особенно в деплойментах Hadoop, — значительное сокращение нагрузки на NameNodes. Следует отметить, что формат ORC ориентирован на архитектуру и рабочие нагрузки Hadoop. Учитывая, что самые современные стеки данных отходят от Hadoop, возможности применения ORC в облачной среде довольно ограничены.

Обзор реализации


Строковые данные в файле ORC организованы в группы, так называемые Stripe, и содержат последовательности строк и метаданных об этих строках. Каждый Stripe содержит последовательность строк, а каждая строка делится на последовательность столбцов. Данные из каждого столбца хранятся отдельно, что позволяет ORC эффективно читать не всю строку, а только те столбцы, которые нужны для конкретного запроса. ORC также включает метаданные о данных, например о типах, и сведения о сжатии, что помогает повысить скорость чтения. ORC поддерживает множество форматов сжатия, в том числе zlib, LZO и Snappy. Благодаря этому сокращается размер данных на диске и повышается производительность чтения и записи. Формат также поддерживает разные типы индексов, такие как индексы строки и фильтры Блума: это дополнительно повышает скорость чтения.

jxyps392ps9328pth64p1pxcpk8.png
Источник: orc.apache.org

Результат orcfiledump содержит сводную информацию по метаданным файла: количество строк, столбцов и Stripe в файле, типы данных столбцов и информацию о любых индексах, которая хранится в файле.

В дополнение к метаданным orcfiledump также выводит на печать фактические данные в файле ORC. К ним относятся значения каждого столбца в каждой строке, а также любые имеющиеся значения NULL. Каждая строка представляет собой запись, состоящую из каждого столбца, который определяется как поле. Сочетания строк представляют собой табличную структуру.

Arrow


Apache Arrow — это столбчатый Open-Source-формат хранения данных в памяти, повышающий скорость работы при выполнении задач по обработке и аналитике. Он стандартизирован и используется для представления и манипулирования данными в разных системах, фреймворках обработки и библиотеках машинного обучения.

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

Преимущества Apache Arrow не ограничиваются высокой производительностью. В этом формате реализована поддержка большого спектра типов данных, поддержка вложенных и иерархических структур, а также интеграция со множеством языков программирования. Формат Arrow часто используется в приложениях для Big Data и аналитики, где он позволяет эффективно передавать данные между системами и выполнять обработку в памяти. Он также используется в разработке распределенных систем и аналитических пайплайнов, работающих в реальном времени.

Обзор реализации


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

glqdlyc42xbqtu3anmtzhwx_psk.png
Источник: arrow.apache.org

Столбчатый формат хранения в памяти Arrow значительно улучшает аналитику данных с помощью сокращения числа операций чтения и записи на диск и повышения скорости выполнения запросов. Он использует двоичное представление данных фиксированной ширины, которое позволяет быстро читать и писать в память. Кроме повышения скорости операций с помощью вычислений в памяти, фреймворк позволяет добавлять пользовательские коннекторы, чтобы упростить агрегирование данных разных форматов.

qrnyjoevx9q3xrji79rpqjq5hye.png
Источник: arrow.apache.org

Dremio — это инструмент ускорения запросов на основе фреймворка Arrow. Dremio обеспечивает высокую скорость обращения к разным источникам данных: БД, озера и облачные хранилища. Он использует столбчатый формат Arrow для хранения и обработки данных, что позволяет воспользоваться такими его преимуществами, как производительность и эффективность. Подробнее об этом можно прочитать в статье «Apache Arrow, и как этот формат вписывается в сегодняшний ландшафт данных».

Каждому свое: как выбрать лучший формат


Компании вкладывают деньги в микросервисную архитектуру, чтобы улучшить управление программным обеспечением и отказаться от монолитных решений. Переход на контейнеры и большие кластеры Kubernetes — естественный ход вещей. Эти микросервисы встроены в гетерогенные языки и основываются на парадигме «полиглотного плюрализма». Для этих сценариев подходят Protocol Buffers, Thrift или MessagePack. Они упрощают взаимодействие между микросервисами и повышают скорость обработки событий. Другое преимущество, которое помогает улучшить поддержку приложений, — это способность выполнять деплойменты часто и автономно.

С появлением потоковых архитектур и архитектур на основе сообщений возросла потребность в новых форматах и сжатии данных, и на первый план вышел формат Avro. Как мы упоминали выше, Arvo — очень гибкий формат, который можно применять для микросервисов, потоковых приложений и архитектур на основе сообщений. Он активно используется в архитектурах озера данных и Lake House. Открытые табличные форматы (Iceberg и Hudi) используют Avro со схемами, поддерживающими изоляцию моментальных снимков.

Parquet — наиболее популярный формат для архитектуры озера данных и Lake House, который остается стандартом в этой области. Благодаря способности ORC поддерживать большие размеры Stripe этот формат приобрел популярность в мире Hadoop Distributed File System (HDFS), но, как мы знаем, мир этот становится все меньше и меньше. Все же он хорошо подходит для таких сценариев использования, как резервное копирование. Новый формат Arrow отлично подходит для In-memory и может применяться для объектных хранилищ, в которых потребность в Object Persistence не столь длительна.

Современный стек данных — это выбор, и хороших вариантов для выбора форматов данных и файлов становится все больше. MinIO поддерживает все из них, оставляя выбор решения за вами и вашим архитектором облачных решений.

Вы прямо сейчас можете воспользоваться инструментами для работы с данными от VK Cloud. Для тестирования мы начисляем новым пользователям 3000 бонусных рублей и будем рады вашей обратной связи.
Stay tuned


Присоединяйтесь к телеграм-каналу «Данные на стероидах». В нем вы найдете все об инструментах и подходах для извлечения максимальной пользы из работы с данными: регулярные дайджесты, полезные статьи, а также анонсы конференций и вебинаров.

© Habrahabr.ru