AVRO – Serialización

Los datos se serializan para dos propósitos:

  • Para almacenamiento permanente

  • Para transferir datos a través de una red

¿Qué es la serialización?

La serialización es el proceso de convertir estructuras de datos o el estado de objetos en formato binario o de texto para transferir datos a través de una red o para almacenamiento persistente. Una vez que los datos se transfieren a través de la red o se reciben desde un almacenamiento persistente, deben deserializarse nuevamente. La serialización se llama clasificación y la deserialización se llama desarmado

Serialización en Java

Java proporciona un mecanismo llamado serialización de objetos donde un objeto se puede representar como una secuencia de bytes que incluye los datos del objeto, así como información sobre el tipo de objeto y los tipos de datos almacenados en el objeto.

Una vez que el objeto serializado se escribe en un archivo, se puede leer desde el archivo y deserializar. Es decir, la información de tipo y los bytes que representan el objeto y sus datos se pueden usar para recrear el objeto en la memoria.

ObjectInputStream y ObjectOutputStream las clases se utilizan para serializar y deserializar un objeto respectivamente en Java.

Serialización en Hadoop

Normalmente, en sistemas distribuidos como Hadoop, el concepto de serialización se utiliza para Comunicación entre procesos y Almacenamiento permanente

Comunicación entre procesos

  • Para establecer la comunicación entre procesos entre los nodos conectados a la red, se utilizó la técnica RPC.

  • RPC utilizó la serialización interna para convertir un mensaje en binario antes de enviarlo a un host remoto a través de la red. En el otro extremo, el sistema remoto deserializa el flujo binario en el mensaje original.

  • El formato de serialización de RPC debe ser el siguiente:

    • Compacto – Aprovechar al máximo el ancho de banda de la red, que es el recurso más escaso en el centro de datos.

    • Rápido – Dado que la comunicación entre nodos es fundamental en los sistemas distribuidos, el proceso de serialización y deserialización debe ser rápido, con menos gastos generales.

    • Expandible – Los protocolos cambian con el tiempo para cumplir con los nuevos requisitos, por lo que debería ser fácil evolucionar el protocolo de manera controlada para clientes y servidores.

    • Compatibilidad – El formato del mensaje debe admitir nodos escritos en diferentes idiomas.

Almacenamiento permanente

El almacenamiento persistente es un almacenamiento digital que no pierde sus datos cuando se apaga. Los archivos, carpetas y bases de datos son ejemplos de almacenamiento persistente.

Interfaz de escritura

Es una interfaz para Hadoop que proporciona métodos de serialización y deserialización. La siguiente tabla describe los métodos:

S.No. Métodos y descripción
uno

void readFields (entrada de datos)

Este método se utiliza para deserializar los campos de este objeto.

2

escritura vacía (salida de datos)

Este método se utiliza para serializar los campos de este objeto.

Interfaz de escritura comparable

Esta combinación Capacidad de grabación y Comparable interfaces. Esta interfaz hereda Capacidad de grabación la interfaz de Hadoop también Comparable Interfaz Java. Por lo tanto, proporciona métodos para serializar, deserializar y comparar datos.

S.No. Métodos y descripción
uno

int compareTo (clase obj)

Este método compara el objeto actual con el objeto obj dado.

Además de estas clases, Hadoop admite una serie de clases contenedoras que implementan la interfaz WritableComparable. Cada clase es un contenedor para un tipo primitivo de Java. La jerarquía de clases de serialización de Hadoop se proporciona a continuación:

Jerarquía de serialización de Hadoop

Estas clases son útiles para serializar varios tipos de datos en Hadoop. Por ejemplo, considere IntWritable clase. Veamos cómo se usa esta clase para serializar y deserializar datos en Hadoop.

Clase IntWritable

Esta clase implementa Grababilidad comparable a y Capacidad de grabación interfaces. Incluye un tipo de datos entero. Esta clase proporciona métodos que se utilizan para serializar y deserializar datos enteros.

Constructores

S.No. Resumen
uno IntWritable ()
2 IntWritable (valor int)

Métodos

S.No. Resumen
uno

int get ()

Con este método, puede obtener el valor entero presente en el objeto actual.

2

void readFields (entrada de datos)

Este método se utiliza para deserializar datos en un determinado Entrada de datos un objeto.

3

conjunto vacío (valor entero)

Este método se utiliza para establecer el valor de la corriente IntWritable un objeto.

cuatro

escritura vacía (salida de datos)

Este método se utiliza para serializar los datos en el objeto actual a un determinado Salida de datos un objeto.

Serializar datos en Hadoop

El procedimiento para serializar datos de un tipo entero se analiza a continuación.

  • Crear instancia IntWritable class encerrando un valor entero.

  • Crear instancia ByteArrayOutputStream clase.

  • Crear instancia DataOutputStream class y pasar el objeto ByteArrayOutputStream clase a eso.

  • Serializar un valor entero en un objeto IntWritable usando anote() método. Este método necesita un objeto de la clase DataOutputStream.

  • Los datos serializados se almacenarán en un objeto de matriz de bytes que se pasa como parámetro a DataOutputStream class durante la instanciación. Convierta los datos del objeto en una matriz de bytes.

Ejemplo

El siguiente ejemplo muestra cómo serializar datos enteros en Hadoop.

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

public class Serialization {
   public byte[] serialize() throws IOException{
		
      //Instantiating the IntWritable object
      IntWritable intwritable = new IntWritable(12);
   
      //Instantiating ByteArrayOutputStream object
      ByteArrayOutputStream byteoutputStream = new ByteArrayOutputStream();
   
      //Instantiating DataOutputStream object
      DataOutputStream dataOutputStream = new
      DataOutputStream(byteoutputStream);
   
      //Serializing the data
      intwritable.write(dataOutputStream);
   
      //storing the serialized object in bytearray
      byte[] byteArray = byteoutputStream.toByteArray();
   
      //Closing the OutputStream
      dataOutputStream.close();
      return(byteArray);
   }
	
   public static void main(String args[]) throws IOException{
      Serialization serialization= new Serialization();
      serialization.serialize();
      System.out.println();
   }
}

Deserializar datos en Hadoop

El procedimiento para deserializar un tipo de datos enteros se analiza a continuación:

  • Crear instancia IntWritable class encerrando un valor entero.

  • Crear instancia ByteArrayOutputStream clase.

  • Crear instancia DataOutputStream class y pasar el objeto ByteArrayOutputStream clase a eso.

  • Deserializar datos en un objeto DataInputStream a través de readFields () método de clase IntWritable.

  • Los datos deserializados se almacenarán en un objeto de la clase IntWritable. Puede obtener estos datos usando obtener() método de esta clase.

Ejemplo

El siguiente ejemplo muestra cómo deserializar datos enteros en Hadoop.

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;

import org.apache.hadoop.io.IntWritable;

public class Deserialization {

   public void deserialize(byte[]byteArray) throws Exception{
   
      //Instantiating the IntWritable class
      IntWritable intwritable =new IntWritable();
      
      //Instantiating ByteArrayInputStream object
      ByteArrayInputStream InputStream = new ByteArrayInputStream(byteArray);
      
      //Instantiating DataInputStream object
      DataInputStream datainputstream=new DataInputStream(InputStream);
      
      //deserializing the data in DataInputStream
      intwritable.readFields(datainputstream);
      
      //printing the serialized data
      System.out.println((intwritable).get());
   }
   
   public static void main(String args[]) throws Exception {
      Deserialization dese = new Deserialization();
      dese.deserialize(new Serialization().serialize());
   }
}

La ventaja de la serialización de Hadoop sobre Java

La serialización de Hadoop de escritura puede reducir la sobrecarga de creación de objetos al reutilizar objetos de escritura, lo que no es posible con el marco de serialización nativo de Java.

Desventajas de la serialización de Hadoop

Hay dos formas de serializar datos de Hadoop:

  • puedes usar Capacidad de grabación clases proporcionadas por la biblioteca nativa de Hadoop.

  • También puedes usar Archivos de secuencia que almacenan datos en formato binario.

La principal desventaja de estos dos mecanismos es que Escritables y SequenceFiles solo tienen API de Java y no se pueden escribir ni leer en ningún otro idioma.

Por lo tanto, ninguno de los archivos creados en Hadoop utilizando los dos mecanismos anteriores no puede ser leído por ningún otro tercer idioma, lo que convierte a Hadoop en un bloque acotado. Para abordar esta deficiencia, Doug Cutting creó Avro, cual es estructura de datos independiente del idioma

🚫