Dezvoltat de | Apache Software Foundation |
---|---|
Prima versiune | 11 ianuarie 2011 |
Ultima versiune | 1.10.2 (17 martie 2021) |
Depozit | github.com/apache/avro , svn.apache.org/repos/asf/avro și svn.apache.org/repos/asf/avro |
Scris in | Java , C , C ++ , C # , PHP , Python și Ruby |
Tip | Format de serializare a datelor ( d ) |
Licență | Licență Apache versiunea 2.0 |
Site-ul web | avro.apache.org |
Avro este un cadru de apelare și serializare a datelor de la distanță dezvoltat în cadrul proiectului Apache Hadoop. Folosește JSON pentru definirea tipurilor de date și a protocoalelor și serializează datele într-un format binar mai compact. Utilizarea principală este în Apache Hadoop , unde poate oferi atât un format de serializare pentru date persistente, cât și un format „wireframe” pentru comunicarea între nodurile Hadoop și programele client pentru serviciile Hadoop.
Este similar cu Apache Thrift și Protocol Buffers , dar nu necesită rularea unui program de generare a codului în timpul unei schimbări de schemă (cu excepția cazului în care se dorește pentru limbaje tipizate static).
Avro este recunoscut și acceptat de Apache Spark SQL ca sursă de date.
Un fișier Avro Object Container este format din:
Antetul este format din:
Pentru blocurile de date Avro specifică două codificări de serializare: binar și JSON. Cele mai multe aplicații vor folosi codare binară, deoarece este mai mică și mai rapidă. Pentru depanare și aplicații web, uneori codificarea JSON poate fi adecvată.
În Avro, schemele sunt definite folosind JSON. Acestea sunt compuse din tipuri primitive (nul, boolean, int, lung, float, dublu, octeți, șir) sau complexe (înregistrare, enum, matrice, hartă, uniune, fix).
Exemplu de diagramă:
{ "namespace": "example.avro", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ] }Datele din Avro pot fi stocate cu schema corespunzătoare, ceea ce înseamnă că articolul serializat poate fi citit fără a cunoaște schema în prealabil.
Serializare:
import avro.schema from avro.datafile import DataFileReader, DataFileWriter from avro.io import DatumReader, DatumWriter schema = avro.schema.parse(open("user.avsc").read()) # nécessite la connaissance du schéma pour pouvoir ecrire writer = DataFileWriter(open("users.avro", "w"), DatumWriter(), schema) writer.append({"name": "Alyssa", "favorite_number": 256}) writer.append({"name": "Ben", "favorite_number": 7, "favorite_color": "red"}) writer.close()Fișierul „users.avro” va conține schema JSON și o reprezentare binară compactă a datelor:
$ od -c users.avro 0000000 O b j 001 004 026 a v r o . s c h e m 0000020 a 272 003 { " t y p e " : " r e c 0000040 o r d " , " n a m e s p a c e 0000060 " : " e x a m p l e . a v r o 0000100 " , " n a m e " : " U s e r 0000120 " , " f i e l d s " : [ { " 0000140 t y p e " : " s t r i n g " , 0000160 " n a m e " : " n a m e " } 0000200 , { " t y p e " : [ " i n t 0000220 " , " n u l l " ] , " n a m 0000240 e " : " f a v o r i t e _ n u 0000260 m b e r " } , { " t y p e " : 0000300 [ " s t r i n g " , " n u l 0000320 l " ] , " n a m e " : " f a 0000340 v o r i t e _ c o l o r " } ] } 0000360 024 a v r o . c o d e c \b n u l l 0000400 \0 211 266 / 030 334 ˪ ** P 314 341 267 234 310 5 213 0000420 6 004 , \f A l y s s a \0 200 004 002 006 B 0000440 e n \0 016 \0 006 r e d 211 266 / 030 334 ˪ ** 0000460 P 314 341 267 234 310 5 213 6 0000471Deserializare:
Ieșire:
Deși, în principiu, este posibil să se utilizeze orice tip de limbă cu Avro, următoarele limbi au un API:
În plus față de suportul JSON pentru tipuri și definiții de protocol, Avro include suport experimental pentru o altă sintaxă a limbajului de descriere a interfeței (IDL) cunoscută sub numele de Avro IDL. Cunoscut anterior sub numele de GenAvro, acest format este conceput pentru a facilita adoptarea acestuia de către utilizatorii familiarizați cu IDL-uri și limbaje de programare mai tradiționale, cu sintaxă similară cu C / C ++, Protocol Buffers și altele.