Апач Авро
![]() | |
Разработчик(и) | Фонд программного обеспечения Apache |
---|---|
Первоначальный выпуск | 2 ноября 2009 г [1] |
Стабильная версия | 1.11.3
/ 23 сентября 2023 г [2] |
Репозиторий | Репозиторий Авро |
Написано в | Java , C , C++ , C# , Perl , Python , PHP , Ruby |
Тип | удаленного вызова процедур Платформа |
Лицензия | Лицензия Апач 2.0 |
Веб-сайт | евро |
Avro — это ориентированная на строки удаленного вызова процедур и сериализации среда данных, разработанная в рамках Apache Hadoop проекта . Он использует JSON для определения типов данных и протоколов и сериализует данные в компактном двоичном формате. Его основное использование — в Apache Hadoop , где он может предоставлять как формат сериализации для постоянных данных , так и формат проводной связи для связи между узлами Hadoop и между клиентскими программами со службами Hadoop . Avro использует схему для структурирования кодируемых данных. Он имеет два разных типа языков схем: один для редактирования человеком (Avro IDL), а другой, более машиночитаемый, на основе JSON. [3]
Он похож на Thrift and Protocol Buffers , но не требует запуска программы генерации кода при изменении схемы (если это не требуется для статически типизированных языков).
Apache Spark SQL может обращаться к Avro как к источнику данных. [4]
Файл контейнера объектов Avro
[ редактировать ]Avro Файл-контейнер объектов состоит из: [5]
- Заголовок файла , за которым следует
- один или несколько блоков данных файла .
Заголовок файла состоит из:
- Четыре байта ASCII «O», «b», «j», за которыми следует номер версии Avro, равный 1 (0x01) (двоичные значения 0x4F 0x62 0x6A 0x01).
- Метаданные файла, включая определение схемы.
- 16-байтовый случайно сгенерированный маркер синхронизации для этого файла.
Для блоков данных Avro определяет две кодировки сериализации: [6] двоичный и JSON. Большинство приложений будут использовать двоичную кодировку, поскольку она меньше и быстрее. Для отладки и веб-приложений иногда может подойти кодировка JSON.
Определение схемы
[ редактировать ]Схемы Avro определяются с использованием JSON. Схемы состоят из примитивных типов (null, boolean, int, long, float, double, bytes и string) и сложных типов (запись, перечисление, массив, карта, объединение и фиксированный). [7]
Пример простой схемы:
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["null", "int"]},
{"name": "favorite_color", "type": ["null", "string"]}
]
}
Сериализация и десериализация
[ редактировать ]Данные в Avro могут храниться с соответствующей схемой, то есть сериализованный элемент можно прочитать, не зная схемы заранее.
Пример кода сериализации и десериализации на Python
[ редактировать ]Сериализация: [8]
import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter
# Need to know the schema to write. According to 1.8.2 of Apache Avro
schema = avro.schema.parse(open("user.avsc", "rb").read())
writer = DataFileWriter(open("users.avro", "wb"), DatumWriter(), schema)
writer.append({"name": "Alyssa", "favorite_number": 256})
writer.append({"name": "Ben", "favorite_number": 8, "favorite_color": "red"})
writer.close()
Файл «users.avro» будет содержать схему в формате JSON и компактное двоичное представление. [9] данных:
$ od -v -t x1z users.avro
0000000 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 >Obj...avro.codec<
0000020 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d >.null.avro.schem<
0000040 61 ba 03 7b 22 74 79 70 65 22 3a 20 22 72 65 63 >a..{"type": "rec<
0000060 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 55 >ord", "name": "U<
0000100 73 65 72 22 2c 20 22 6e 61 6d 65 73 70 61 63 65 >ser", "namespace<
0000120 22 3a 20 22 65 78 61 6d 70 6c 65 2e 61 76 72 6f >": "example.avro<
0000140 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 5b 7b 22 >", "fields": [{"<
0000160 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 22 2c >type": "string",<
0000200 20 22 6e 61 6d 65 22 3a 20 22 6e 61 6d 65 22 7d > "name": "name"}<
0000220 2c 20 7b 22 74 79 70 65 22 3a 20 5b 22 69 6e 74 >, {"type": ["int<
0000240 22 2c 20 22 6e 75 6c 6c 22 5d 2c 20 22 6e 61 6d >", "null"], "nam<
0000260 65 22 3a 20 22 66 61 76 6f 72 69 74 65 5f 6e 75 >e": "favorite_nu<
0000300 6d 62 65 72 22 7d 2c 20 7b 22 74 79 70 65 22 3a >mber"}, {"type":<
0000320 20 5b 22 73 74 72 69 6e 67 22 2c 20 22 6e 75 6c > ["string", "nul<
0000340 6c 22 5d 2c 20 22 6e 61 6d 65 22 3a 20 22 66 61 >l"], "name": "fa<
0000360 76 6f 72 69 74 65 5f 63 6f 6c 6f 72 22 7d 5d 7d >vorite_color"}]}<
0000400 00 05 f9 a3 80 98 47 54 62 bf 68 95 a2 ab 42 ef >......GTb.h...B.<
0000420 24 04 2c 0c 41 6c 79 73 73 61 00 80 04 02 06 42 >$.,.Alyssa.....B<
0000440 65 6e 00 10 00 06 72 65 64 05 f9 a3 80 98 47 54 >en....red.....GT<
0000460 62 bf 68 95 a2 ab 42 ef 24 >b.h...B.$<
0000471
Десериализация:
# The schema is embedded in the data file
reader = DataFileReader(open("users.avro", "rb"), DatumReader())
for user in reader:
print(user)
reader.close()
Это выводит:
{u'favorite_color': None, u'favorite_number': 256, u'name': u'Alyssa'}
{u'favorite_color': u'red', u'favorite_number': 8, u'name': u'Ben'}
Языки с API
[ редактировать ]Хотя теоретически Avro может использовать любой язык, для следующих языков написаны API: [10] [11]
- С
- С++
- С# [12] [13] [14]
- Эликсир [15] [16]
- Идти [17] [18]
- Хаскелл [19]
- Ява
- Javascript [20]
- Перл
- PHP
- Питон [21] [22]
- Руби
- Ржавчина [23]
- Скала
Avro IDL
[ редактировать ]Помимо поддержки JSON для определений типов и протоколов, Avro включает экспериментальные [24] поддержка альтернативного синтаксиса языка описания интерфейса (IDL), известного как Avro IDL. Этот формат, ранее известный как GenAvro, предназначен для облегчения внедрения пользователями, знакомыми с более традиционными IDL и языками программирования, с синтаксисом, подобным C/C++, протокольным буферам и другим.
Логотип
[ редактировать ]Оригинальный логотип Apache Avro принадлежал несуществующему британскому производителю самолетов Avro (первоначально AV Roe and Company). [25]
В конце 2023 года логотип Apache Avro был обновлен до оригинального дизайна. [26]
См. также
[ редактировать ]- Сравнение форматов сериализации данных
- Апач бережливый
- Буферы протоколов
- Травление (протокол)
- Механизм интернет-коммуникаций
- Пакет сообщений
- КБОР
Ссылки
[ редактировать ]- ^ «Apache Avro: новый формат обмена данными» . blog.cloudera.com . Проверено 10 марта 2019 г.
- ^ «Выпуски Apache Avro» . avro.apache.org . Проверено 23 сентября 2023 г.
- ^ Клеппманн, Мартин (2017). Проектирование приложений с интенсивным использованием данных (первое изд.). О'Рейли. п. 122.
- ^ «3 причины, почему аналитика в Hadoop так важна — экономия данных» . dataconomy.com . 21 апреля 2016 г.
- ^ «Спецификация Apache Avro: файлы контейнера объектов» . avro.apache.org . Проверено 10 марта 2019 г.
- ^ «Спецификация Apache Avro: кодировки» . avro.apache.org . Проверено 11 марта 2019 г.
- ^ «Начало работы с Apache Avro (Python)» . avro.apache.org . Архивировано из оригинала 5 июня 2016 года . Проверено 11 марта 2019 г.
- ^ «Начало работы с Apache Avro (Python)» . avro.apache.org . Архивировано из оригинала 5 июня 2016 года . Проверено 11 марта 2019 г.
- ^ «Спецификация Apache Avro: сериализация данных» . avro.apache.org . Проверено 11 марта 2019 г.
- ^ пунт. «GitHub — phunt/avro-rpc-quickstart: Быстрый старт Apache Avro RPC. Avro — это подпроект Apache Hadoop» . Гитхаб . Проверено 13 апреля 2016 г.
- ^ «Поддерживаемые языки — Apache Avro — Apache Software Foundation» . Проверено 21 апреля 2016 г.
- ^ «Авро: 1.5.1 — ASF JIRA» . Проверено 13 апреля 2016 г.
- ^ «[AVRO-533] .NET-реализация Avro — ASF JIRA» . Проверено 13 апреля 2016 г.
- ^ «Поддерживаемые языки» . Проверено 13 апреля 2016 г.
- ^ «АвроЭкс» . hexdocs.pm . Проверено 18 октября 2017 г.
- ^ "Avrora — avrora v0.21.1" . hexdocs.pm . Retrieved June 11, 2021 .
- ^ «Пакет avro — github.com/hamba/avro — Пакеты Go» . pkg.go.dev . Проверено 4 июля 2023 г.
- ^ goavro , LinkedIn, 30 июня 2023 г. , получено 4 июля 2023 г.
- ^ «Встроенная реализация Avro на Haskell» . Томас М. ДюБюиссон, Galois, Inc. Проверено 8 августа 2016 г.
- ^ «Чистая реализация спецификации Avro на JavaScript» . Гитхаб . Проверено 4 мая 2020 г.
- ^ «Начало работы (Python)» . Апач Авро . Проверено 4 июля 2023 г.
- ^ Avro, Apache, avro: Avro — это платформа сериализации и RPC. , получено 4 июля 2023 г.
- ^ «Реализация клиентской библиотеки Apache Avro в Rust» . Проверено 17 декабря 2018 г.
- ^ «Апач Авро 1.8.2 IDL» . Архивировано из оригинала 20 сентября 2010 года . Проверено 11 марта 2019 г.
- ^ «Логотип Авро» . avroheritagemuseum.co.uk . Проверено 31 декабря 2018 г.
- ^ «[AVRO-3908] Обновить логотип проекта везде — ASF JIRA» . apache.org . Проверено 6 февраля 2024 г.
Дальнейшее чтение
[ редактировать ]- Уайт, Том (ноябрь 2010 г.). Hadoop: полное руководство . ISBN 978-1-4493-8973-4 .