Apache Avro
Deweloperzy | Fundacja oprogramowania Apache |
---|---|
Pierwsze wydanie | 2 listopada 2009 |
Wersja stabilna | 1.11.1 / 31 lipca 2022 r.
|
Magazyn | Repozytorium Avro |
Napisane w | Java , C , C++ , C# , Perl , Python , PHP , Ruby |
Typ | Struktura zdalnego wywoływania procedur |
Licencja | Licencja Apache 2.0 |
Strona internetowa |
Avro to zorientowana na wiersze struktura zdalnego wywoływania procedur i serializacji danych , opracowana w ramach projektu Hadoop firmy Apache . Używa formatu JSON do definiowania typów danych i protokołów oraz serializuje dane w zwartym formacie binarnym. Jego głównym zastosowaniem jest Apache Hadoop , gdzie może zapewnić zarówno format serializacji dla trwałych danych , jak i format przewodowy do komunikacji między węzłami Hadoop oraz z programów klienckich do usług Hadoop . Avro używa schematu do strukturyzowania danych, które są kodowane. Ma dwa różne typy języków schematów; jeden do edycji przez człowieka (Avro IDL), a drugi, który jest bardziej czytelny dla maszyny w oparciu o JSON.
Jest podobny do Thrift i Protocol Buffers , ale nie wymaga uruchamiania programu generującego kod, gdy zmienia się schemat (chyba że jest to pożądane w przypadku języków o typie statycznym ).
Apache Spark SQL może uzyskiwać dostęp do Avro jako źródła danych.
Plik kontenera obiektów Avro
Plik kontenera obiektów Avro składa się z:
- Nagłówek pliku , po którym następuje
- jeden lub więcej bloków danych pliku .
Nagłówek pliku składa się z:
- Cztery bajty, ASCII „O”, „b”, „j”, po których następuje numer wersji Avro, czyli 1 (0x01) (wartości binarne 0x4F 0x62 0x6A 0x01).
- Metadane pliku, w tym definicja schematu.
- 16-bajtowy, losowo generowany znacznik synchronizacji dla tego pliku.
Dla bloków danych Avro określa dwa kodowania serializacji: binarne i JSON. Większość aplikacji użyje kodowania binarnego, ponieważ jest ono mniejsze i szybsze. W przypadku debugowania i aplikacji internetowych czasami odpowiednie może być kodowanie JSON.
Definicja schematu
Schematy Avro są definiowane przy użyciu formatu JSON. Schematy składają się z typów pierwotnych (null, boolean, int, long, float, double, bytes i string) oraz typów złożonych (record, enum, array, map, union i fixed).
Prosty przykład schematu:
{ "przestrzeń nazw" : "przykład.avro" , "typ" : "rekord" , "nazwa" : "Użytkownik" , "pola" : [ { "nazwa" : "nazwa" , "typ" : "ciąg" }, { "nazwa" : "numer_ulubionych" , "typ" : [ "null" , "int" ]}, { "nazwa" : "kolor_ulubionych" , "typ" : [ "null" , "string" ]} ] }
Serializacja i deserializacja
Dane w Avro mogą być przechowywane z odpowiadającym im schematem, co oznacza, że serializowany element można odczytać bez wcześniejszej znajomości schematu.
Przykładowy kod serializacji i deserializacji w Pythonie
Serializacja:
import avro.schema z avro.datafile import DataFileReader , DataFileWriter z avro.io import DatumReader , DatumWriter # Trzeba znać schemat do pisania. Zgodnie z 1.8.2 Apache Avro schema = avro . schemat . parse ( open ( "user.avsc" , "rb" ) . read ()) writer = DataFileWriter ( open ( "users.avro" , "wb" ), DatumWriter (), schema ) pisarz . append ({ "imię" : "Alyssa" , "numer_ulubionych" : 256 }) pisarz . append ({ "imię" : " Ben " , " numer_ulubionych " : 8 , " kolor_ulubionych " : " czerwony " } ) pisarz . zamknij ()
Plik „users.avro” będzie zawierał schemat w formacie JSON oraz kompaktową binarną reprezentację danych:
$ od -v -t x1z users.avro 0000000 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 > Obiekt... 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 6 1 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", "przestrzeń nazw < 0000120 22 3a 20 22 65 78 6 1 6d 70 6c 65 2e 61 76 72 6f > ": "przyklad.avro < 0000140 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 5b 7b 22 > ", "pola": [{" < 0000160 74 79 7 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
Deserializacja:
# Schemat jest osadzony w pliku danychreader = DataFileReader ( open ( " users.avro" , "rb" ), DatumReader ()) dla użytkownika w czytniku : print ( user ) reader . zamknij ()
To wyprowadza:
{ u „ulubiony_kolor” : brak , u „numer_ulubionego” : 256 , u „imię” : u „Alyssa” } { u „ulubiony_kolor” : u „czerwony” , u „numer_ulubionego” : 8 , u „imię” : u „ Ben' }
Języki z interfejsami API
Chociaż teoretycznie każdy język mógłby używać Avro, następujące języki mają napisane dla nich interfejsy API:
Avro IDL
Oprócz obsługi JSON dla definicji typów i protokołów, Avro zawiera eksperymentalną obsługę alternatywnej składni języka opisu interfejsu (IDL), znanej jako Avro IDL. Wcześniej znany jako GenAvro, ten format został zaprojektowany w celu ułatwienia przyjęcia przez użytkowników zaznajomionych z bardziej tradycyjnymi językami IDL i językami programowania, ze składnią podobną do C/C++, buforów protokołów i innych.
Logo
Logo Apache Avro pochodzi od nieistniejącego brytyjskiego producenta samolotów Avro (pierwotnie AV Roe and Company). Drużyna piłkarska Avro FC używa tego samego logo.
Zobacz też
- Porównanie formatów serializacji danych
- Oszczędność Apache
- Bufory protokołów
- Wytrawianie (protokół)
- Silnik komunikacji internetowej
- Pakiet wiadomości
- CBOR
Dalsza lektura
- Biały, Tom (listopad 2010). Hadoop: ostateczny przewodnik . ISBN 978-1-4493-8973-4 .