Apache Avro: Una Introducción Sencilla

  • Tiempo de lectura:11 minutos de lectura
  • Autor de la entrada:
  • Última modificación de la entrada:30/12/2022

En esta entrada vas a aprender qué es Apache Avro y las ventajas que aporta este sistema de serialización de datos muy usado en big data. Así, podrás empezar a usarlo en tus proyectos y a sacarle todo el partido posible.

Qué es Apache Avro

¿Qué es Apache Avro?

Apache Avro es un formato de datos binario muy popular en arquitecturas de streaming de eventos. Los datos se almacenan por filas, cada una de forma independiente. Debido a esta característica, no es un formato apropiado para operaciones de agregación por columnas, pero es muy eficiente serializar los datos y posteriormente enviarlos de forma independiente entre sistemas. Se ha vuelto muy popular debido a la cantidad de herramientas del ecosistema Hadoop que lo soportan.

El esquema de los datos contenidos en un registro de Avro se define en formato JSON y es compatible con herramientas como Schema Registry. Este esquema se envía en el propio intercambio de datos como parte del mismo, por lo que un lector podría usarlo para parsear directamente el fichero en la lectura.

Las estructuras de datos que soporta Avro son muy completas, con tipos de datos simples y complejos y se integra con la mayoría de lenguajes populares como Java, C, C++, JavaScript, Python y Ruby.

Podemos comparar Avro con proyectos similares como JSON, Thrift o Protocol Buffer.

Ventajas y Desventajas de Apache Avro

Las ventajas más importante que aporta el uso de Apache Avro son:

  • Documentación de datos incluida en el esquema
  • Evolución de esquemas
  • Soporta compresión y deserialización parcial.
  • Compresión y deserialización
  • Tipado de datos

Entre las desventajas se incluye que no existe la posibilidad de visualizar el contenido de Avro sin herramientas específicas, por lo que es necesaria una librería para integrarlo con los lenguajes de programación.

Apache Avro vs JSON

Apache Avro aporta numerosas ventajas respecto al uso de JSON para serializar conjuntos de datos. Por un lado, JSON no fuerza el uso de un esquema. Sin embargo, enviar una lista de objetos repetidos en JSON es ineficiente, al poderse repetir todas las claves e impactar en la carga útil del mensaje.

Aunque Avro también soporta la serialización en formato JSON, el formato binario es más rápido y ocupa menos espacio. Además, también es posible complementarlo con mecanismos de compresión como Snappy.

Kafka con Apache Avro

Avro es muy popular en sistemas de streaming con Kafka y Schema Registry debido a su rendimiento. Al tratarse de un formato binario, es necesario que los clientes de Kafka conozcan el esquema del registro para deserializar el mensaje correctamente.

Diagrama Schema Registry en Apache Kafka
Diagrama de Schema Registry en Apache Kafka

Para deserializar el registro de forma correcta se puede usar el componente Schema Registry. De esta forma, el productor consulta el esquema o añade uno nuevo y el consumidor deserializa el mensaje con ese mismo esquema indicado por Schema Registry.

Evolución de Esquemas

Es importante que ante cambios en el esquema de los datos, los componentes que utilizan el esquema anterior puedan seguir funcionando. A esto se le llama evolución de esquemas y es soportado por Apache Avro.

Con las plataformas de streaming, los consumidores y los productores pueden cambiar y evolucionar en cualquier momento. Los productores pueden tener consumidores que desconocen, y para ser ágil no se quiere actualizar cada consumidor cada vez que un productor añade un campo a un registro.

La compatibilidad entre versiones de esquema define los cambios permitidos. Puede ser de tres tipos. Compatibilidad hacia delante o forward, hacia detrás o backward y completa.

La compatibilidad forward se da cuando se actualiza el esquema de datos en el productor pero la aplicación que consume no se actualiza, sigue utilizando el esquema antiguo. Para que este patrón funcione, es posible añadir campos que no usarán los consumidores antiguos. También es posible eliminar los campos con valores por defecto, que será el valor que tomará el consumidor antiguo.

En el caso de la compatibilidad backward se actualiza el consumidor pero hay productores de datos con el esquema antiguo. Esto es típico cuando los productores de datos no se pueden actualizar por problemas de acceso. En este patrón es posible añadir campos con valores por defecto, que tomarán los consumidores y también es posible eliminar campos, puesto que el consumidor puede ignorar los campos de datos que no necesite.

Por último, la compatibilidad completa cumple con la backward y la forward, por lo que permite eliminar y añadir campos con valores de datos por defecto.

Herramienta de línea de comandos de Avro

Apache Avro proporciona una herramienta de línea de comandos para serializar y deserializar datos llamada avro-tools que se puede descargar desde la página web. La podemos ejecutar sin argumentos como una aplicación java para que nos muestre todas las opciones disponibles:

$ java -jar avro-tools-1.10.2.jar
 Version 1.10.2 of Apache Avro
Copyright 2010-2015 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).
----------------
Available tools:
    canonical  Converts an Avro Schema to its canonical form
          cat  Extracts samples from files
      compile  Generates Java code for the given schema.
       concat  Concatenates avro files without re-compressing.
        count  Counts the records in avro files or folders
  fingerprint  Returns the fingerprint for the schemas.
   fragtojson  Renders a binary-encoded Avro datum as JSON.
     fromjson  Reads JSON records and writes an Avro data file.
     fromtext  Imports a text file into an avro data file.
      getmeta  Prints out the metadata of an Avro data file.
    getschema  Prints out schema of an Avro data file.
          idl  Generates a JSON schema from an Avro IDL file
 idl2schemata  Extract JSON schemata of the types from an Avro IDL file
       induce  Induce schema/protocol from Java class/interface via reflection.
   jsontofrag  Renders a JSON-encoded Avro datum as binary.
       random  Creates a file with randomly generated instances of a schema.
      recodec  Alters the codec of a data file.
       repair  Recovers data from a corrupt Avro Data file
  rpcprotocol  Output the protocol of a RPC service
   rpcreceive  Opens an RPC Server and listens for one message.
      rpcsend  Sends a single RPC message.
       tether  Run a tethered mapreduce job.
       tojson  Dumps an Avro data file as JSON, record per line or pretty.
       totext  Converts an Avro data file to a text file.
     totrevni  Converts an Avro data file to a Trevni file.
  trevni_meta  Dumps a Trevni file's metadata as JSON.
trevni_random  Create a Trevni file filled with random instances of a schema.
trevni_tojson  Dumps a Trevni file as JSON.

Como vemos, podemos convertir ficheros de datos en Avro a JSON o texto fácilmente con esta herramienta, así como transformar un fichero JSON en Avro directamente con la opción tojson.

El comando para deserializar datos en Avro a JSON, tanto comprimidos como sin comprimir con Snappy es el siguiente:

java -jar avro-tools-1.10.2.jar tojson fichero.avro

Como el fichero Avro ya tiene incluido el esquema, no es necesario indicarlo en este caso. Si queremos acceder al esquema, podemos usar la opción getschema de la siguiente forma:

java -jar avro-tools-1.10.2.jar getschema fichero.avro

API para Java

Si quieres implementar código Java que manipule ficheros Avro, puedes importar la librería directamente en tu proyecto con Maven añadiendo la siguiente dependencia en el fichero pom:

<dependency>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro</artifactId>
  <version>1.10.2</version>
</dependency>

Recuerda comprobar la versión que necesitas en tu caso.

Preguntas Frecuentes Apache Avro – FAQ

¿Para qué se usa Apache Avro?

Apache Avro es un formato de datos usado para almacenar y serializar datos con esquema de una forma eficiente.

¿En qué se diferencia Apache Avro de JSON?

Apache Avro tiene algunas ventajas respecto a JSON para serializar datos: es un formato más rápido y que ocupa menos espacio, además, es más eficiente que JSON.

¿En qué se diferencia Apache Avro de Apache Parquet?

Apache Parquet es un formato de almacenamiento basado en columnas, en vez de en filas como hace Apache . Por esta razón, Apache Parquet es mejor para realizar consultas analíticas y pocas escrituras. Apache Avro, por otro lado, es mejor para realizar escrituras y serialización de datos.


Deja una respuesta