Apache Avro - Википедия - Apache Avro

Apache Avro
Apache Avro Logo.svg
Разработчики)Фонд программного обеспечения Apache
изначальный выпуск2 ноября 2009 г.; 11 лет назад (2009-11-02)[1]
Стабильный выпуск
1.10.1 / 3 декабря 2020 г.; 11 дней назад (2020-12-03)[2]
РепозиторийРепозиторий Avro
Написано вЯва, C, C ++, C #, Perl, Python, PHP, Рубин
ТипУдаленный вызов процедур рамки
ЛицензияЛицензия Apache 2.0
Интернет сайтАвро.apache.org

Авро это ориентированный на ряд удаленный вызов процедур и данные сериализация фреймворк, разработанный в рамках проекта Apache Hadoop. Оно использует JSON для определения типов данных и протоколы, и сериализует данные в компактном двоичном формате. Его основное использование в Apache Hadoop, где он может предоставлять как формат сериализации для постоянных данных, так и формат проводной связи для связи между узлами Hadoop и от клиентских программ к Hadoop Сервисы.Avro ​​использует схему для структурирования кодируемых данных. Он имеет два разных типа языков схем; один для редактирования человеком (Avro IDL), а другой, более машиночитаемый на основе JSON.[3]

Это похоже на Бережливость и Буферы протокола, но не требует запуска программы генерации кода, когда схема изменения (если не требуется для статически типизированный языков).

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) и сложных типов (record, enum, array, map, union и fixed).[7]

Пример простой схемы:

 {   "пространство имен": "example.avro",   "тип": "записывать",   "имя": "Пользователь",   "поля": [      {"имя": "имя", "тип": "нить"},      {"имя": "Любимый номер",  "тип": ["ноль", "int"]},      {"имя": "любимый цвет", "тип": ["ноль", "нить"]}   ]  }

Сериализация и десериализация

Данные в Avro могут храниться с соответствующей схемой, что означает, что сериализованный элемент может быть прочитан, не зная заранее схему.

Пример кода сериализации и десериализации в Python

Сериализация:[8]

импорт avro.schemaиз avro.datafile импорт DataFileReader, DataFileWriterиз avro.io импорт DatumReader, DatumWriterсхема = Авро.схема.Разобрать(открыто("user.avsc", "рб").читать())  # нужно знать схему для записи. Согласно 1.8.2 Apache Avroписатель = DataFileWriter(открыто("users.avro", "wb"), DatumWriter(), схема)писатель.добавить({"имя": "Алисса", "Любимый номер": 256})писатель.добавить({"имя": "Бен", "Любимый номер": 7, "любимый цвет": "красный"})писатель.Закрыть()

Файл "users.avro" будет содержать схему в формате JSON и компактное двоичное представление.[9] данных:

$ od -v -t x1z users.avro 0000000 4f 62  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 ба 03 7b 22 74 79 70 65 22  20 22 72 65 63  >a .. {"type": "rec<0000060 6f 72 64 22 2c 20 22 6e 61 6d 65 22  20 22 55  >ord "," имя ":" U<0000100 73 65 72 22 2c 20 22 6e 61 6d 65 73 70 61 63 65  >ser "," пространство имен<0000120 22  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  20 5b 7b 22  >"," поля ": [{"<0000160 74 79 70 65 22  20 22 73 74 72 69 6e 67 22 2c  >тип ":" строка ",<0000200 20 22 6e 61 6d 65 22  20 22 6e 61 6d 65 22 7d  > "name": "name"}<0000220 2c 20 7b 22 74 79 70 65 22  20 5b 22 69 6e 74  >, {"тип": ["int<0000240 22 2c 20 22 6e 75 6c 6c 22 5d 2c 20 22 6e 61 6d  >"," ноль "]," нам "<0000260 65 22  20 22 66 61 76 6f 72 69 74 65 5f 6e 75  >е ":" любимый_ну<0000300 6d 62 65 72 22 7d 2c 20 7b 22 74 79 70 65 22   >mber "}, {" type ":<0000320 20 5b 22 73 74 72 69 6e 67 22 2c 20 22 6e 75 6c  > ["строка", "нуль<0000340 6c 22 5d 2c 20 22 6e 61 6d 65 22  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 а3 80 98 47 54 62 парень 68 95 а2 ab 42 ef  >...... GTb.h ... Б.<0000420 24 04 2c 0c 41 6c 79 73 73 61 00 80 04 02 06 42  >$.,. Алисса ..... B<0000440 65 6e 00 0e 00 06 72 65 64 05 f9 а3 80 98 47 54  >ru .... красный ..... GT<0000460 62 парень 68 95 а2 ab 42 ef 24                       >б.х ... Б. $<0000471

Десериализация:

читатель = DataFileReader(открыто("users.avro", "рб"), DatumReader())  # схема встроена в файл данныхза Пользователь в читатель:    Распечатать Пользовательчитатель.Закрыть()

Это выводит:

{ты'любимый цвет': Никто, ты'Любимый номер': 256, ты'имя': ты'Алисса'}{ты'любимый цвет': ты'красный', ты'Любимый номер': 7, ты'имя': ты'Бен'}

Языки с API

Хотя теоретически Avro может использоваться на любом языке, для следующих языков написаны API:[10][11]

Avro IDL

Помимо поддержки JSON для определений типов и протоколов, Avro включает экспериментальные[18] поддержка альтернативы язык описания интерфейса (IDL) синтаксис, известный как Avro IDL. Ранее известный как GenAvro, этот формат разработан для облегчения принятия пользователями, знакомыми с более традиционными IDL и языками программирования, с синтаксисом, аналогичным C / C ++, Буферы протокола и другие.

Логотип Apache Avro от несуществующего британского производителя самолетов. Авро (первоначально A.V. Roe and Company).[19] Футбольная команда Футбольный клуб "Авро" использует тот же логотип.[20]

Смотрите также

Рекомендации

  1. ^ «Apache Avro: новый формат обмена данными». blog.cloudera.com. Получено 10 марта, 2019.
  2. ^ «Релизы Apache Avro ™». avro.apache.org. Получено 3 декабря, 2020.
  3. ^ Клеппманн, Мартин (2017). Разработка приложений, интенсивно использующих данные (Первое изд.). О'Рейли. п. 122.
  4. ^ «3 причины, по которым аналитика In-Hadoop имеет большое значение - датакономия». dataconomy.com. 21 апреля 2016 г.
  5. ^ «Спецификация Apache Avro ™: файлы-контейнеры объектов». avro.apache.org. Получено 10 марта, 2019.
  6. ^ «Спецификация Apache Avro ™: кодировки». avro.apache.org. Получено Одиннадцатое марта, 2019.
  7. ^ «Начало работы с Apache Avro ™ (Python)». avro.apache.org. Получено Одиннадцатое марта, 2019.
  8. ^ «Начало работы с Apache Avro ™ (Python)». avro.apache.org. Получено Одиннадцатое марта, 2019.
  9. ^ «Спецификация Apache Avro ™: сериализация данных». avro.apache.org. Получено Одиннадцатое марта, 2019.
  10. ^ phunt. "GitHub - phunt / avro-rpc-quickstart: Apache Avro RPC Quick Start. Avro является подпроектом Apache Hadoop". GitHub. Получено 13 апреля, 2016.
  11. ^ «Поддерживаемые языки - Apache Avro - Apache Software Foundation». Получено 21 апреля, 2016.
  12. ^ «Авро: 1.5.1 - ASF JIRA». Получено 13 апреля, 2016.
  13. ^ "[AVRO-533] .NET реализация Avro - ASF JIRA". Получено 13 апреля, 2016.
  14. ^ «Поддерживаемые языки». Получено 13 апреля, 2016.
  15. ^ "Нативная реализация Avro на Haskell". Томас М. ДюБюиссон, Galois, Inc. Получено 8 августа, 2016.
  16. ^ «Реализация спецификации Avro на чистом JavaScript». Получено 4 мая, 2020.
  17. ^ «Реализация клиентской библиотеки Avro на Rust». Получено 17 декабря, 2018.
  18. ^ "Apache Avro 1.8.2 IDL". Получено Одиннадцатое марта, 2019.
  19. ^ «Логотип Авро». avroheritagemuseum.co.uk. Получено 31 декабря, 2018.
  20. ^ "АВРО ФК" avrojfc.org. Получено 31 декабря, 2018.

дальнейшее чтение