Apache Avro

Apache Avro
Utvecklare Apache Software Foundation
Initial release 2 november 2009 ; 13 år sedan ( 2009-11-02 )
Stabil frisättning
1.11.1 / 31 juli 2022 ; för 7 månader sedan ( 31-07-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 .apache .org

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:

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.

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

Vidare läsning