AVRO - Serializacja

Dane są serializowane dla dwóch celów -

  • Do trwałego przechowywania

  • Do przesyłania danych przez sieć

Co to jest serializacja?

Serializacja to proces tłumaczenia struktur danych lub stanu obiektów na postać binarną lub tekstową w celu transportu danych przez sieć lub przechowywania w trwałej pamięci. Po przesłaniu danych przez sieć lub pobraniu z pamięci trwałej należy ponownie przeprowadzić deserializację. Serializacja jest określana jakomarshalling a deserializacja jest określana jako unmarshalling.

Serializacja w Javie

Java udostępnia mechanizm o nazwie object serialization gdzie obiekt może być reprezentowany jako sekwencja bajtów, która zawiera dane obiektu, a także informacje o typie obiektu i typach danych przechowywanych w obiekcie.

Po zapisaniu zserializowanego obiektu do pliku można go odczytać z pliku i zdeserializować. Oznacza to, że informacje o typie i bajty reprezentujące obiekt i jego dane mogą zostać użyte do ponownego utworzenia obiektu w pamięci.

ObjectInputStream i ObjectOutputStream Klasy są używane do serializacji i deserializacji obiektu odpowiednio w Javie.

Serializacja w Hadoop

Ogólnie w systemach rozproszonych, takich jak Hadoop, koncepcja serializacji jest używana do Interprocess Communication i Persistent Storage.

Komunikacja międzyprocesowa

  • Do nawiązania komunikacji międzyprocesowej pomiędzy węzłami połączonymi w sieci wykorzystano technikę RPC.

  • RPC wykorzystało wewnętrzną serializację do konwersji wiadomości na format binarny przed wysłaniem jej do zdalnego węzła przez sieć. Z drugiej strony system zdalny deserializuje strumień binarny do oryginalnej wiadomości.

  • Format serializacji RPC musi być następujący:

    • Compact - Aby jak najlepiej wykorzystać przepustowość sieci, która jest najbardziej rzadkim zasobem w centrum danych.

    • Fast - Ponieważ komunikacja między węzłami ma kluczowe znaczenie w systemach rozproszonych, proces serializacji i deserializacji powinien być szybki i generować mniej narzutów.

    • Extensible - Protokoły zmieniają się w czasie, aby sprostać nowym wymaganiom, dlatego też rozwijanie protokołu w sposób kontrolowany dla klientów i serwerów powinno być proste.

    • Interoperable - Format wiadomości powinien obsługiwać węzły napisane w różnych językach.

Pamięć trwała

Trwała pamięć masowa to cyfrowa pamięć masowa, która nie traci swoich danych w przypadku utraty zasilania. Pliki, foldery, bazy danych to przykłady trwałego przechowywania.

Zapisywalny interfejs

To jest interfejs w Hadoop, który udostępnia metody serializacji i deserializacji. W poniższej tabeli opisano metody -

S.No. Metody i opis
1

void readFields(DataInput in)

Ta metoda służy do deserializacji pól danego obiektu.

2

void write(DataOutput out)

Ta metoda służy do serializacji pól danego obiektu.

Zapisywalny porównywalny interfejs

To jest połączenie Writable i Comparableinterfejsy. Ten interfejs dziedziczyWritable interfejs Hadoop, a także Comparableinterfejs Java. W związku z tym zapewnia metody serializacji danych, deserializacji i porównania.

S.No. Metody i opis
1

int compareTo(class obj)

Ta metoda porównuje bieżący obiekt z danym obiektem obj.

Oprócz tych klas Hadoop obsługuje wiele klas otoki, które implementują interfejs WritableComparable. Każda klasa opakowuje typ podstawowy języka Java. Hierarchia klas serializacji Hadoop jest podana poniżej -

Te klasy są przydatne do serializacji różnych typów danych na platformie Hadoop. Na przykład rozważmyIntWritableklasa. Zobaczmy, jak ta klasa jest używana do serializacji i deserializacji danych na platformie Hadoop.

Klasa IntWritable

Ta klasa implementuje Writable, Comparable, i WritableComparableinterfejsy. Otacza w nim typ danych typu integer. Ta klasa udostępnia metody używane do serializacji i deserializacji danych typu integer.

Konstruktorzy

S.No. Podsumowanie
1 IntWritable()
2 IntWritable( int value)

Metody

S.No. Podsumowanie
1

int get()

Używając tej metody, możesz uzyskać liczbę całkowitą obecną w bieżącym obiekcie.

2

void readFields(DataInput in)

Ta metoda służy do deserializacji danych w podanym DataInput obiekt.

3

void set(int value)

Ta metoda służy do ustawiania wartości prądu IntWritable obiekt.

4

void write(DataOutput out)

Ta metoda służy do serializacji danych z bieżącego obiektu do podanego DataOutput obiekt.

Serializacja danych w Hadoop

Procedura serializacji danych typu całkowitego jest omówiona poniżej.

  • Utwórz instancję IntWritable klasy poprzez zawijanie w niej wartości całkowitej.

  • Utwórz instancję ByteArrayOutputStream klasa.

  • Utwórz instancję DataOutputStream klasę i przekaż obiekt ByteArrayOutputStream klasa do tego.

  • Serializuj wartość całkowitą w obiekcie IntWritable przy użyciu write()metoda. Ta metoda wymaga obiektu klasy DataOutputStream.

  • Zserializowane dane będą przechowywane w obiekcie tablicy bajtów, który jest przekazywany jako parametr do DataOutputStreamklasa w czasie tworzenia instancji. Konwertuj dane w obiekcie na tablicę bajtów.

Przykład

Poniższy przykład pokazuje, jak serializować dane typu całkowitego na platformie 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();
   }
}

Deserializacja danych na platformie Hadoop

Procedura deserializacji danych typu całkowitego jest omówiona poniżej -

  • Utwórz instancję IntWritable klasy poprzez zawijanie w niej wartości całkowitej.

  • Utwórz instancję ByteArrayOutputStream klasa.

  • Utwórz instancję DataOutputStream klasę i przekaż obiekt ByteArrayOutputStream klasa do tego.

  • Deserializacja danych w obiekcie DataInputStream za pomocą readFields() metoda klasy IntWritable.

  • Zdeserializowane dane będą przechowywane w obiekcie klasy IntWritable. Możesz odzyskać te dane za pomocąget() metoda tej klasy.

Przykład

Poniższy przykład pokazuje, jak deserializować dane typu całkowitego na platformie 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());
   }
}

Przewaga Hadoop nad serializacją Java

Oparta na zapisie serializacja Hadoop jest w stanie zmniejszyć obciążenie związane z tworzeniem obiektów przez ponowne użycie obiektów zapisywalnych, co nie jest możliwe w natywnej strukturze serializacji Java.

Wady serializacji Hadoop

Aby serializować dane Hadoop, istnieją dwa sposoby -

  • Możesz użyć Writable klasy, dostarczane przez natywną bibliotekę Hadoop.

  • Możesz także użyć Sequence Files które przechowują dane w formacie binarnym.

Główną wadą tych dwóch mechanizmów jest to Writables i SequenceFiles mają tylko Java API i nie można ich pisać ani czytać w żadnym innym języku.

Dlatego żaden z plików utworzonych w Hadoop z powyższymi dwoma mechanizmami nie może być odczytany przez żaden inny trzeci język, co sprawia, że ​​Hadoop jest ograniczonym pudełkiem. Aby rozwiązać ten problem, stworzył Doug CuttingAvro, który jest language independent data structure.