Что такое Avro: как Apache Kafka и другие технологии Big Data используют эту схему данных

Apache Avro

Мы уже рассказывали о сериализации, схемах данных и их важности в Big Data на примере Schema Registry для Apache Kafka. В продолжение ряда статей про основы Кафка для начинающих, сегодня мы поговорим про Apache Avro – наиболее популярную схему и систему сериализации данных: ее особенностях и применении в технологиях Big Data.

Как устроен Apache Авро: принцип работы

Напомним, сериализация – это процесс преобразования данных из текстового формата в двоичный, необходимый для передачи данных по сети и сохранения информации в виде файла на диске, в памяти или базе данных.

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

Схема данных Avro – это описание структуры данных на языке JSON (JavaScript Object Notation) – текстового формата, независимого от реализации. Авро обеспечивает богатую структуру данных, поддерживая следующие типы [2]:

  • примитивные – null, Boolean, int (знаковое целое 32 бита), long (знаковое целое 64 бита), float, double, string (unicode строка), bytes (последовательность байт), fixed (последовательность байт с длиной, заданной в схеме);
  • сложные составные – union (сумма), recod (произведение), enum (перечисление), array (массив/список), map (ассоциативный массив);
  • логические (в терминологии AVRO) – decimal (число с фиксированной запятой), date (дата), time-millis (время с миллисекундной точностью), time-micros (время с микросекундной точностью), timestamp-millis (дата-время с миллисекундной точностью), timestamp-micros (дата-время с микросекундной точностью), uuid (universally unique identifier, универсальный уникальный идентификатор).

Контейнер Авро состоит из заголовка и одного или нескольких блоков данных [3]. Заголовок содержит:

  • 4 байта, ASCII ‘O’, ‘b’, ‘j’, далее 1.
  • метаданные файла, содержащие схему.
  • 16-байтное случайное число — маркер файла.

Для блоков данных Avro может использовать бинарную кодировку или формат JSON. С точки зрения производительности бинарную кодировка эффективнее и компактнее, но для отладки удобнее использовать человекочитаемый формат JSON [3].

Протокол Avro описывает RPC-интерфейс с помощью следующих полей [3]:

  • protocol – строка с именем протокола (обязательное поле);
  • namespace– строка, которая дополняет/уточняет имя протокола
  • doc – строка с описанием протокола на естественном языке;
  • types – список определения сложных типов (особый тип errorопределяет тип ошибки);
  • messages — JSON-объект, где ключ — название сообщения, а значение — само сообщение.

В рамках передаваемого в формате Avro сообщения иcпользуются следующие аргументы [3]:

  • doc – строка c описанием сообщения;
  • request – список именованных типизированных параметров схемы
  • response – имя схемы;
  • error – список именованных типизированных параметров схемы (среди ошибок);
  • one-wayboolean, определяет может ли response быть null.
Apache Avro structure schema, схема данных апач авро
JSON-схема данных Apache Avro и структура файла

Преимущества Apache Avro по сравнению с другими схемами данных для Big Data систем

Компания Confluent, разработчик одной из наиболее популярных в промышленной эксплуатации версий Apache Kafka, отмечает следующие достоинства схемы данных Avro для использования ее в Big Data системах [4]:

  1. Прямое отображение в формат JSON, который часто используется для описания событий и объектов в Big Data системах;
  2. Компактное представление, по сравнению с вышеупомянутым JSON-форматом, для которого характерно многократное повторение некоторых участков кода (имя поля в каждой записи), что может быть критичным в больших объемах.
  3. Быстрота передачи и обработки данных благодаря компактности формата Авро;
  4. Поддержка множества языков программирования (C, C++, C#, Go, Haskell, Java, Python, Scala, а также другие скриптовые и ООП-языки).
  5. Широкие возможности по описанию объектов и событий, включая создание собственных схем данных, а также средства дополнения языка схемы, определяемые в чистом JSON.
  6. Обеспечение совместимости с предыдущими версиями по мере развития данных с течением времени.

Разумеется, Apache Avro – не единственная система сериализации и схема данных для Big Data. В частности, в рамках экосистемы Apache Hadoop часто используется Parquet – бинарный, колоночно-ориентированный (столбцовый) формат хранения данных, разработанный специально для этого проекта [5]. Благодаря колоночному (столбцовому) представлению и ориентации, в первую очередь на работу в HDFS, Parquet показывает более высокие результаты в тестах на производительность (сравнение скорости записи, чтения, сжатия и SQL-запросов) по сравнению с Apache Avro [6]. Подробнее про сравнение Авро и Паркет читайте в нашей новой статье.

Тем не менее, благодаря следующим особенностям Авро, он пока остается весьма популярным форматом, схемой данных и системой сериализации [3]:

  • поддержка удаленного вызова процедур (RPC, Remote Procedure Call);
  • наличие 2-х видов кодировки: бинарный вид и человекочитаемый формат JSON;
  • быстрота обработки и компактность представления бинарного формата данных;
  • динамическая типизация (интеграция с динамически типизированными языками) и отсутствие предгенерации кода для работы. Данные сопровождаются схемой генерации кода, которая может быть обработана без статических типов в случае статически типизированных языков.
  • Отсутствие накладных расходов на информацию о типах при сериализации данных, поскольку схема всегда находится рядом с данными.
  • Обеспечение совместимости новых версий данных со следующими за счет отсутствия идентификаторов полей: при изменении схемы сохраняются обе версии, которые используются при обработке данных и все конфликты могут быть разрешены символьно ввиду отсутствия строгих целых идентификаторов.
Схема данных Apache Avro
Запись и чтение данных Авро

Где используется Avro: Apache Kafka, Hadoop, а также другие технологии и проекты Big Data

Схема данных и система сериализации Авро достаточно часто используется в различных Big Data проектах для высоконагруженных систем во всем мире. Обзор вакансий с рекрутингового портала HeadHunter показал, что данная технология востребована не только крупными компаниями, (Сбербанк, МТС и другие data-driven предприятия, работающие c Big Data). Например, в Почте России Apache Avro используется для разработки межкорпоративных систем обмена данными.

Множество отечественных и зарубежных ИТ-компаний также применяют Авро в качестве устоявшегося и надежного средства работы с нереляционной информацией. Среди гигантов ИТ-индустрии стоит отметить опыт соцсети LinkedIn, где большие данные о пользовательском поведении (события, метрики и прочие информационные потоки в режиме онлайн) агрегировались в Apache Kafka с помощью схемы данных Avro, а затем сохранялись в кластере Apache Hadoop [4].

Big Data, Большие данные, архитектура, обработка данных, Apache Avro
Сериализация «сырых» данных с помощью Apache Avro для записи в Big Data хранилище

Узнайте, как работать с Apache Avro на практике в Kafka, Hadoop и других технологиях больших данных на наших практических курсах для руководителей, архитекторов, администраторов, инженеров, аналитиков Big Data и Data Scientist’ов в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:

расписание компьютерные курсы для руководителей, аналитиков, программистов, администраторов и пользователей Internet of Things, Big Data и Machine Learning Смотреть расписание занятий
регистрация на компьютерные курсы для руководителей, аналитиков, программистов, администраторов и пользователей Internet of Things, Big Data и Machine Learning Зарегистрироваться на курс

Источники

  1. https://www.codeflow.site/ru/article/java-apache-avro
  2. https://habr.com/ru/post/346698/
  3. https://ru.bmstu.wiki/Apache_Avro
  4. https://www.confluent.io/blog/avro-kafka-data/
  5. https://ru.bmstu.wiki/Apache_Parquet
  6. http://datareview.info/article/test-proizvoditelnosti-apache-parquet-protiv-apache-avro/