Разработчик (и) | Apache Software Foundation |
---|---|
Первоначальный выпуск | 2 Ноябрь 2009 г.; 10 лет назад (02.11.2009) |
Стабильный выпуск | 1.10.0 / 29 июня 2020 г.; 3 месяца назад (29.06.2020) |
Репозиторий | Репозиторий Avro |
Написано на | Java, C, C ++, C#, Perl, Python, PHP, Ruby |
Тип | Удаленный вызов процедуры framework |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | avro.apache.org |
Avro - это ориентированная на строки структура удаленного вызова процедур и сериализации данных, разработанная в рамках проекта Apache Hadoop. Он использует JSON для определения типов данных и протоколов и сериализует данные в компактном двоичном формате. Его основное использование - в Apache Hadoop, где он может обеспечивать как формат сериализации для постоянных данных, так и формат проводной связи для связи между узлами Hadoop и от клиентских программ к службам Hadoop . Avro использует схему для структурирования кодируемых данных. Он имеет два разных типа языков схем; один для редактирования человеком (Avro IDL), а другой, более машиночитаемый на основе JSON.
Он похож на Thrift и Protocol Buffers, но не требуют запуска программы генерации кода при изменении схемы (если это не требуется для статически типизированных языков).
Apache Spark SQL может обращаться к Avro как к источнику данных.
Файл-контейнер объектов Avro состоит из:
Заголовок файла состоит из:
Для блоков данных Avro указывает две кодировки сериализации: двоичную и JSON. Большинство приложений будут использовать двоичную кодировку, поскольку она меньше и быстрее. Для отладки и веб-приложений иногда может быть подходящей кодировка JSON.
Схемы Avro определяются с использованием JSON. Схемы состоят из примитивных типов (null, boolean, int, long, float, double, bytes и string) и сложных типов (record, enum, array, map, union и fixed).
Простая схема пример:
{"пространство имен": "example.avro", "тип": "запись", "имя": "Пользователь", "поля": [{"имя": "имя", "тип": "строка"}, {"имя": "избранное_число", "тип": ["ноль", "целое число"]}, {"имя": "любимый_цвет", "тип": ["ноль", "строка" ]}]}
Данные в Avro могут храниться с соответствующей схемой, то есть сериализованный элемент может быть прочитан, не зная заранее схему.
Сериализация:
импортировать avro.schema из avro.datafile, импортировать DataFileReader, DataFileWriter из avro.io, импортировать DatumReader, DatumWriter schema = avro.schema. Parse (open ("user.avsc", "rb"). Read ()) # нужно знать схему для записи. Согласно 1.8.2 Apache Avro writer = DataFileWriter (open ("users.avro", "wb"), DatumWriter (), schema) writer.append ({"name": "Alyssa", "favour_number": 256}) writer.append ({"имя": "Бен", "избранное_число": 7, "любимый_цвет": "красный"}) writer.close ()
Файл "users.avro" будет содержать схему в формате JSON и компактное двоичное представление данных:
$ 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>"," поля ": [{" < 0000160 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 22 2c>тип ":" строка ", < 0000200 20 22 6e 61 6d 65 22 3a 20 22 6e 61 6d 65 22 7d>" имя ":" имя "} < 0000220 2c 20 7b 22 74 79 70 65 22 3a 20 5b 22 69 6e 74>, {" тип ": [" int < 0000240 22 2c 20 22 6e 75 6c 6c 22 5d 2c 20 22 6e 61 6d>"," ноль " ], "nam < 0000260 65 22 3a 20 22 66 61 76 6f 72 69 74 65 5f 6e 75>e": "favourite_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 0e 00 06 72 65 64 05 f9 a3 80 98 47 54>en.... красный..... GT < 0000460 62 bf 68 95 a2 ab 42 ef 24>bh..B. $ < 0000471
Десериализация:
reader = DataFileReader (open ("users.avro", "rb"), DatumReader ()) # схема встроена в файл данных для пользователя в читателе: pri nt user reader.close ()
Это выводит:
{u'favorite_color ': None, u'favorite_number': 256, u'name ': u'Alyssa'} {u'favorite_color ': u'red ', u'favorite_number': 7, u'name ': u'Ben'}
Хотя теоретически Avro может использовать любой язык, для следующих языков написаны API:
In Помимо поддержки JSON для определений типов и протоколов, Avro включает экспериментальную поддержку синтаксиса альтернативного языка описания интерфейса (IDL), известного как Avro IDL. Ранее известный как GenAvro, этот формат разработан для облегчения внедрения пользователями, знакомыми с более традиционными IDL и языками программирования, с синтаксисом, аналогичным C / C ++, Protocol Buffers и другим.
Логотип Apache Avro от несуществующего британского производителя самолетов Avro (первоначально A.V. Roe and Company). Футбольная команда Avro FC использует тот же логотип.