Articulo de referencia

Apache Avro

{{Cite web|url=https://blog.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/|title=Apache Avro: a New Format for Data Interchange|website=blog.cloudera.com|acce...

Avro es un marco de serialización de datos y llamadas a procedimientos remotos orientado a filas , desarrollado dentro del proyecto Hadoop de Apache . Utiliza JSON para definir tipos de datos y protocolos , y serializa los datos en un formato binario compacto. Su uso principal se encuentra en Apache Hadoop , donde proporciona un formato de serialización para datos persistentes y un formato de comunicación entre nodos de Hadoop, así como entre programas cliente y servicios de Hadoop . Avro utiliza un esquema para estructurar los datos que se codifican. Cuenta con dos tipos diferentes de lenguajes de esquema: uno para edición humana (Avro IDL) y otro más legible por máquina basado en JSON. [ 3 ]

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 ]

El encabezado de un archivo consta de:

  • Cuatro bytes, ASCII 'O', 'b', 'j', seguidos del número de versión de Avro que es 1 (0x01) (valores binarios 0x4F 0x62 0x6A 0x01).
  • Metadatos del archivo, incluida la definición del esquema.
  • 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 ] binaria y JSON. La mayoría de las aplicaciones usarán la codificación binaria, ya que es más pequeña y rápida. Para la depuración y las aplicaciones web, la codificación JSON puede ser apropiada en algunos casos.

Definición del esquema

Los esquemas Avro se definen utilizando JSON. Los esquemas se componen de tipos primitivos (null, boolean, int, long, float, double, bytes y string) y tipos complejos (record, enum, array, map, union y fixed). [ 7 ]

Ejemplo de esquema simple:

{ "namespace" : "example.avro" , "type" : "record" , "name" : "User" , "fields" : [ { "name" : "name" , "type" : "string" }, { "name" : "favorite_number" , "type" : [ "null" , "int" ]}, { "name" : "favorite_color" , "type" : [ "null" , "string" ]} ] }

Serialización y deserialización

Los datos en Avro pueden almacenarse con su esquema correspondiente, lo que significa que un elemento serializado puede leerse sin conocer el esquema de antemano.

Código de ejemplo para serialización y deserialización en Python.

Serialización: [ 8 ]

import avro.schema from avro.datafile import DataFileReader , DataFileWriter from avro.io import DatumReader , DatumWriter# Es necesario conocer el esquema para escribir. Según la versión 1.8.2 de Apache Avro schema = avro . schema . parse ( open ( "user.avsc" , "rb" ) . read ())escritor = DataFileWriter ( open ( "users.avro" , " wb" ), DatumWriter ( ), schema ) escritor.append ( { "name" : "Alyssa" , " favorite_number" : 256 }) escritor.append ({ "name" : "Ben" , "favorite_number" : 8 , "favorite_color" : " red" }) escritor.close ( )

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", "name": "U < 0000100 73 65 72 22 2c 20 22 6e 61 6d 65 73 70 61 63 65 > ser", "namespace < 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 > ", "fields": [{" < 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 2c20 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 22 3a > ámbar"}, {"tipo": < 0000320 20 5b 22 73 74 72 69 6e 67 22 2c 20 22 6e 75 6c > ["cadena", "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 novio 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 05f9 a3 80 98 47 54 > en....rojo.....GT < 0000460 62 bf 68 95 a2 ab 42 ef 24 > bh..B.$ < 0000471

Deserialización:

# El esquema está incrustado en el lector de archivos de datos = DataFileReader ( open ( "users.avro" , "rb" ), DatumReader ()) for user in reader : print ( user ) reader . close ()

Esto produce:

{ 'nombre' : 'Alyssa' , 'número_favorito' : 256 , 'color_favorito' : Ninguno } { 'nombre' : 'Ben' , 'número_favorito' : 8 , 'color_favorito' : 'rojo' }

Lenguajes con API

Aunque teóricamente cualquier lenguaje podría usar Avro, los siguientes lenguajes tienen API escritas para ellos: [ 10 ] [ 11 ]

Avro IDL

Además de admitir JSON para definiciones de tipo y protocolo, Avro incluye soporte experimental [ 24 ] para una sintaxis de lenguaje de descripción de interfaz (IDL) alternativa conocida como Avro IDL. Anteriormente conocido como GenAvro, este formato está diseñado para facilitar su adopción por parte de usuarios familiarizados con lenguajes de programación e IDL más tradicionales, con una sintaxis similar a C/C++, Protocol Buffers y otros.

El logotipo original de Apache Avro pertenecía al extinto fabricante británico de aeronaves Avro (originalmente AV Roe and Company). [ 25 ]

El logotipo de Apache Avro se actualizó a un diseño original a finales de 2023. [ 26 ]

Véase también

Referencias

  1. "Apache Avro: un nuevo formato para el intercambio de datos" . blog.cloudera.com . Consultado el 10 de marzo de 2019 .
  2. "Versiones de Apache Avro" . avro.apache.org . Consultado el 27 de octubre de 2025 .
  3. Kleppmann, Martin (2017). Diseño de aplicaciones intensivas en datos (Primera ed.). O'Reilly. pág. 122.  
  4. "3 razones por las que el análisis en Hadoop es tan importante - Dataconomy" . dataconomy.com . 21 de abril de 2016.
  5. "Especificación de Apache Avro: Archivos contenedores de objetos" . avro.apache.org . Consultado el 8 de septiembre de 2024 .
  6. "Especificación de Apache Avro: Codificaciones" . avro.apache.org . Consultado el 8 de septiembre de 2024 .
  7. "Primeros pasos con Apache Avro (Python)" . avro.apache.org . Archivado del original el 5 de junio de 2016. Consultado el 11 de marzo de 2019 .
  8. "Primeros pasos con Apache Avro (Python)" . avro.apache.org . Archivado del original el 5 de junio de 2016. Consultado el 11 de marzo de 2019 .
  9. "Especificación de Apache Avro: Serialización de datos" . avro.apache.org . Consultado el 8 de septiembre de 2024 .
  10. phunt. "GitHub - phunt/avro-rpc-quickstart: Inicio rápido de Apache Avro RPC. Avro es un subproyecto de Apache Hadoop" . GitHub . Consultado el 13 de abril de 2016 .
  11. "Lenguajes compatibles - Apache Avro - Apache Software Foundation" . Consultado el 21 de abril de 2016 .
  12. "Avro: 1.5.1 - ASF JIRA" . Consultado el 13 de abril de 2016 .
  13. " [ AVRO-533 ] Implementación de Avro en .NET - ASF JIRA" . Consultado el 13 de abril de 2016 .
  14. "Idiomas compatibles" . Consultado el 13 de abril de 2016 .
  15. "AvroEx" . hexdocs.pm . Consultado el 18 de octubre de 2017 .
  16. «Avrora — avrora v0.21.1» . hexdocs.pm . Consultado el 11 de junio de 2021 .
  17. "paquete avro - github.com/hamba/avro - Paquetes Go" . pkg.go.dev . Consultado el 4 de julio de 2023 .
  18. goavro , LinkedIn, 30 de junio de 2023 , consultado el 4 de julio de 2023
  19. "Implementación nativa de Avro en Haskell" . Thomas M. DuBuisson, Galois, Inc. Consultado el 8 de agosto de 2016 .
  20. "Implementación en JavaScript puro de la especificación Avro" . GitHub . Consultado el 4 de mayo de 2020 .
  21. "Primeros pasos (Python)" . Apache Avro . Consultado el 4 de julio de 2023 .
  22. Avro, Apache, avro: Avro es un marco de serialización y RPC. , consultado el 4 de julio de 2023
  23. "Implementación de la biblioteca cliente Apache Avro en Rust" . Consultado el 17 de diciembre de 2018 .
  24. "Apache Avro 1.8.2 IDL" . Archivado del original el 20 de septiembre de 2010. Recuperado el 11 de marzo de 2019 .
  25. "El logotipo de Avro" . avroheritagemuseum.co.uk . Consultado el 31 de diciembre de 2018 .
  26. " [ AVRO-3908 ] Actualizar el logotipo del proyecto en todas partes - ASF JIRA" . apache.org . Consultado el 6 de febrero de 2024 .

Lecturas adicionales

  • White, Tom (noviembre de 2010). Hadoop: La guía definitiva . ISBN 978-1-4493-8973-4.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Apache_Avro&oldid=1320334878 "