Avro es un marco de serialización de datos y llamadas de procedimiento remoto orientado a filas desarrollado dentro del proyecto Hadoop de Apache . Utiliza JSON para definir tipos de datos y protocolos , y serializa datos en un formato binario compacto. Su uso principal es en Apache Hadoop , donde puede proporcionar un formato de serialización para datos persistentes y un formato de cable para la comunicación entre los nodos de Hadoop y desde los programas cliente a los servicios de Hadoop . . Avro usa un esquema para estructurar los datos que se codifican. Tiene dos tipos diferentes de lenguajes de esquema; uno para edición humana (Avro IDL) y otro que es más legible por máquina basado en JSON. [3]
Desarrollador (es) | Fundación de software Apache |
---|---|
Versión inicial | 2 de noviembre de 2009 [1] |
Lanzamiento estable | 1.10.2 / 15 de marzo de 2021 [2] |
Repositorio | Repositorio Avro |
Escrito en | Java , C , C ++ , C # , Perl , Python , PHP , Ruby |
Tipo | Marco de llamada a procedimiento remoto |
Licencia | Licencia Apache 2.0 |
Sitio web | avro |
Es similar a Thrift y Protocol Buffers , pero no requiere ejecutar un programa de generación de código cuando cambia un esquema (a menos que se desee para lenguajes de tipado estático ).
Apache Spark SQL puede acceder a Avro como fuente de datos. [4]
Archivo contenedor de objetos Avro
Un archivo contenedor de objetos Avro consta de: [5]
- Un encabezado de archivo , seguido de
- uno o más bloques de datos de archivo .
Un encabezado de archivo consta de:
- Cuatro bytes, ASCII 'O', 'b', 'j', seguido del número de versión de Avro que es 1 (0x01) (valores binarios 0x4F 0x62 0x6A 0x01).
- Metadatos de archivo, incluida la definición del esquema.
- El marcador de sincronización de 16 bytes generado aleatoriamente para este archivo.
Para los bloques de datos, Avro especifica dos codificaciones de serialización: [6] binario y JSON. La mayoría de las aplicaciones utilizarán la codificación binaria, ya que es más pequeña y rápida. Para aplicaciones de depuración y basadas en web, la codificación JSON a veces puede ser apropiada.
Definición de esquema
Los esquemas de Avro se definen mediante JSON. Los esquemas se componen de tipos primitivos (nulo, booleano, int, largo, flotante, doble, bytes y cadena) y tipos complejos (registro, enumeración, matriz, mapa, unión y fijo). [7]
Ejemplo de esquema simple:
{ "espacio de nombres" : "ejemplo.avro" , "tipo" : "registro" , "nombre" : "Usuario" , "campos" : [ { "nombre" : "nombre" , "tipo" : "cadena" }, { "name" : "favorite_number" , "type" : [ "null" , "int" ]}, { "name" : "favorite_color" , "type" : [ "null" , "string" ]} ] }
Serializar y deserializar
Los datos en Avro pueden almacenarse con su esquema correspondiente, lo que significa que un elemento serializado se puede leer sin conocer el esquema de antemano.
Ejemplo de código de serialización y deserialización en Python
Serialización: [8]
importación avro.schema de avro.datafile importación DataFileReader , DataFileWriter de avro.io importación DatumReader , DatumWriteresquema = avro . esquema . parse ( open ( "user.avsc" , "rb" ) . read ()) # Necesito conocer el esquema para escribir. Según 1.8.2 de Apache Avroescritor = DataFileWriter ( open ( "users.avro" , "wb" ), DatumWriter (), esquema ) escritor . adjuntar ({ "nombre" : "Alyssa" , "número_de_secretario" : 256 }) escritor . append ({ "nombre" : "Ben" , "número_preferido" : 7 , "color_preferido" : "rojo" }) escritor . cerrar ()
El archivo "users.avro" contendrá el esquema en JSON y una representación binaria compacta [9] de los datos:
$ 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 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 61 6d 65 22 3a 20 22 55 > ord "," nombre ":" U < 0000100 73 65 72 22 2c 20 22 6e 61 6d 65 73 70 61 63 65 > ser "," espacio de nombres < 0000120 22 3a 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 3a 20 5b 7b 22 > "," campos ": [{" < 0000160 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 22 2c > tipo ":" cadena ", < 0000200 20 22 6e 61 6d 65 22 3a 20 22 6e 61 6d 65 22 7d > " nombre ":" nombre "} < 0000220 2c 20 7b 22 74 79 70 65 22 3a 20 5b 22 69 6e 74 > , {"tipo": ["int < 0000240 22 2c 20 22 6e 75 6c 6c 22 5d 2c 20 22 6e 61 6d > ", "nulo"] , "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 2 2 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 "]," nombre ":" 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 0e 00 06 72 65 64 05 f9 a3 80 98 47 54 > en .... rojo ..... GT < 0000460 62 bf 68 95 a2 ab 42 ef 24 > bh..B. $ < 0000471
Deserialización:
reader = DataFileReader ( open ( "users.avro" , "rb" ), DatumReader ()) # el esquema está incrustado en el archivo de datos para el usuario en reader : print user reader . cerrar ()
Esto produce:
{ u 'color_favorito' : Ninguno , u 'número_favorito' : 256 , u 'nombre' : u 'Alyssa' } { u 'color_favorito' : u 'rojo' , u 'número_favorito' : 7 , u 'nombre' : u ' Ben ' }
Idiomas con API
Aunque teóricamente cualquier lenguaje podría usar Avro, los siguientes lenguajes tienen API escritas para ellos: [10] [11]
- C
- C ++
- C # [12] [13] [14]
- Elixir [15]
- Ir
- Haskell [16]
- Java
- JavaScript [17]
- Perl
- PHP
- Pitón
- Rubí
- Óxido [18]
- Scala
Avro IDL
Además de admitir JSON para las definiciones de tipo y protocolo, Avro incluye soporte experimental [19] para una sintaxis de lenguaje de descripción de interfaz alternativa (IDL) conocida como Avro IDL. Anteriormente conocido como GenAvro, este formato está diseñado para facilitar la adopción por parte de usuarios familiarizados con IDL y lenguajes de programación más tradicionales, con una sintaxis similar a C / C ++, Protocol Buffers y otros.
Logo
El logotipo de Apache Avro es del difunto fabricante de aviones británico Avro (originalmente AV Roe and Company). [20] El equipo de fútbol Avro FC utiliza el mismo logotipo. [21]
Ver también
- Comparación de formatos de serialización de datos
- Apache Thrift
- Búferes de protocolo
- Etch (protocolo)
- Motor de comunicaciones de Internet
- MessagePack
- CBOR
Referencias
- ^ "Apache Avro: un nuevo formato para el intercambio de datos" . blog.cloudera.com . Consultado el 10 de marzo de 2019 .
- ^ "Versiones de Apache Avro ™" . avro.apache.org . Consultado el 17 de marzo de 2021 .
- ^ Kleppmann, Martin (2017). Diseño de aplicaciones intensivas en datos (primera edición). O'Reilly. pag. 122.
- ^ "3 razones por las que In-Hadoop Analytics es un gran negocio - Dataconomy" . dataconomy.com . 21 de abril de 2016.
- ^ "Especificación de Apache Avro ™: archivos de contenedor de objetos" . avro.apache.org . Consultado el 10 de marzo de 2019 .
- ^ "Especificación de Apache Avro ™: codificaciones" . avro.apache.org . Consultado el 11 de marzo de 2019 .
- ^ "Primeros pasos con Apache Avro ™ (Python)" . avro.apache.org . Consultado el 11 de marzo de 2019 .
- ^ "Primeros pasos con Apache Avro ™ (Python)" . avro.apache.org . Consultado el 11 de marzo de 2019 .
- ^ "Especificación de Apache Avro ™: serialización de datos" . avro.apache.org . Consultado el 11 de marzo de 2019 .
- ^ phunt. "GitHub - phunt / avro-rpc-quickstart: Apache Avro RPC Quick Start. Avro es un subproyecto de Apache Hadoop" . GitHub . Consultado el 13 de abril de 2016 .
- ^ "Idiomas admitidos - Apache Avro - Apache Software Foundation" . Consultado el 21 de abril de 2016 .
- ^ "Avro: 1.5.1 - ASF JIRA" . Consultado el 13 de abril de 2016 .
- ^ "[AVRO-533] Implementación .NET de Avro - ASF JIRA" . Consultado el 13 de abril de 2016 .
- ^ "Idiomas admitidos" . Consultado el 13 de abril de 2016 .
- ^ "Avrora - avrora v0.21.1" . hexdocs.pm . Consultado el 11 de junio de 2021 .
- ^ "Implementación nativa Haskell de Avro" . Thomas M. Dubuisson, Galois, Inc . Consultado el 8 de agosto de 2016 .
- ^ "Implementación de JavaScript puro de la especificación Avro" . Consultado el 4 de mayo de 2020 .
- ^ "Implementación de la biblioteca cliente Avro en Rust" . Consultado el 17 de diciembre de 2018 .
- ^ "Apache Avro 1.8.2 IDL" . Consultado el 11 de marzo de 2019 .
- ^ "El logotipo de Avro" . avroheritagemuseum.co.uk . Consultado el 31 de diciembre de 2018 .
- ^ "AVRO FC" avrojfc.org . Consultado el 31 de diciembre de 2018 .
Otras lecturas
- White, Tom (noviembre de 2010). Hadoop: la guía definitiva . ISBN 978-1-4493-8973-4.