Apache Avro
Utvecklare | Apache Software Foundation |
---|---|
Initial release | 2 november 2009 |
Stabil frisättning | 1.11.1 / 31 juli 2022
|
Förvar | Avro Repository |
Skrivet i | Java , C , C++ , C# , Perl , Python , PHP , Ruby |
Typ | Fjärrproceduranropsramverk _ |
Licens | Apache-licens 2.0 |
Hemsida |
Avro är en radorienterad fjärrproceduranrop och dataserialiseringsram som utvecklats inom Apaches Hadoop- projekt . Den använder JSON för att definiera datatyper och protokoll och serialiserar data i ett kompakt binärt format. Dess primära användning är i Apache Hadoop , där den kan tillhandahålla både ett serialiseringsformat för beständiga data och ett trådformat för kommunikation mellan Hadoop- noder och från klientprogram till Hadoop- tjänsterna . Avro använder ett schema för att strukturera data som kodas. Den har två olika typer av schemaspråk; en för mänsklig redigering (Avro IDL) och en annan som är mer maskinläsbar baserat på JSON.
Det liknar Thrift and Protocol Buffers , men kräver inte att ett kodgenereringsprogram körs när ett schema ändras (såvida det inte önskas för statiskt skrivna språk).
Apache Spark SQL kan komma åt Avro som en datakälla.
Avro Object Container File
En Avro Object Container File består av:
- Ett filhuvud följt av
- ett eller flera fildatablock .
En filhuvud består av:
- Fyra byte, ASCII 'O', 'b', 'j', följt av Avro-versionsnumret som är 1 (0x01) (binära värden 0x4F 0x62 0x6A 0x01).
- Filmetadata, inklusive schemadefinitionen.
- Den 16-byte, slumpmässigt genererade synkmarkören för den här filen.
För datablock specificerar Avro två serialiseringskodningar: binär och JSON. De flesta applikationer kommer att använda den binära kodningen, eftersom den är mindre och snabbare. För felsökning och webbaserade applikationer kan JSON-kodningen ibland vara lämplig.
Schema definition
Avro-scheman definieras med JSON. Scheman är sammansatta av primitiva typer (null, boolean, int, long, float, double, byte och sträng) och komplexa typer (rekord, enum, array, map, union och fix).
Enkelt schemaexempel:
{ "namespace" : "example.avro" , "type" : "record" , "name" : "Användare" , "fields" : [ { "name" : "name" , "type" : "string" }, { "name" : "favorite_number" , "type" : [ "null" , "int" ]}, { "name" : "favorite_color" , "type" : [ "null" , "string" ]} ] }
Serialisering och deserialisering
Data i Avro kan lagras med motsvarande schema, vilket innebär att ett serialiserat objekt kan läsas utan att känna till schemat i förväg.
Exempel på serialisering och deserialiseringskod i Python
Serialisering:
importera avro.schema från avro.datafile importera DataFileReader , DataFileWriter från avro.io import DatumReader , DatumWriter # Behöver känna till schemat för att skriva. Enligt 1.8.2 i Apache Avro schema = avro . schema . parse ( öppen ( "user.avsc" , "rb" ) . läs ()) writer = DataFileWriter ( öppen ( "users.avro" , "wb" ), DatumWriter (), schema ) writer . lägg till ({ "namn" : "Alyssa" , "favoritnummer" : 256 }) författare . lägg till ({ "namn" : "Ben" , "favoritnummer" : 8 , "favoritfärg" : "röd" }) författare . stäng ()
Filen "users.avro" kommer att innehålla schemat i JSON och en kompakt binär representation av data:
$ 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 6c 6 7 6 7 6 7 7 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 0000060 0000060 0000060 26 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", "0 2 02 02 60 " 1 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 > ", 01 " 7b 22 > ", 0 1 " 7 fält " , 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
Deserialisering:
# Schemat är inbäddat i datafilläsaren = DataFileReader ( öppen ( " users.avro" , "rb" ), DatumReader ()) för användare i läsaren : print ( användare ) läsare . stäng ()
Detta ger ut:
{ u 'favorit_färg' : Ingen , u 'favoritnummer' : 256 , u 'namn' : u 'Alyssa' } { u 'favoritfärg' : u 'röd' , u 'favoritnummer' : 8 , u 'namn' : u ' Ben' }
Språk med API:er
Även om teoretiskt sett alla språk skulle kunna använda Avro, har följande språk API:er skrivna för dem:
Avro IDL
Förutom att stödja JSON för typ- och protokolldefinitioner, inkluderar Avro experimentellt stöd för en syntax för alternativt gränssnittsbeskrivningsspråk (IDL) som kallas Avro IDL. Tidigare känt som GenAvro, är detta format utformat för att underlätta antagandet av användare som är bekanta med mer traditionella IDL:er och programmeringsspråk, med en syntax som liknar C/C++, Protocol Buffers och andra.
Logotyp
Apache Avro-logotypen är från den nedlagda brittiska flygplanstillverkaren Avro (ursprungligen AV Roe and Company). Fotbollslaget Avro FC använder samma logotyp.
Se även
- Jämförelse av dataserialiseringsformat
- Apache sparsamhet
- Protokollbuffertar
- Etsa (protokoll)
- Internetkommunikationsmotor
- MessagePack
- CBOR
Vidare läsning
- White, Tom (november 2010). Hadoop: The Definitive Guide . ISBN 978-1-4493-8973-4 .