Полное руководство по сериализации и десериализации в Hadoop

Сериализация и десериализация — важные понятия в Hadoop и других средах обработки больших данных. Они играют решающую роль в эффективном хранении и передаче данных между распределенными системами. В этой статье мы рассмотрим различные методы сериализации и десериализации в Hadoop, а также приведем примеры кода, иллюстрирующие их использование.

Содержание:

  1. Что такое сериализация?

  2. Что такое десериализация?

  3. Сериализация и десериализация Java

  4. Apache Avro

  5. Паркет Apache

  6. Apache ORC

  7. Apache Thrift

  8. Сравнение форматов сериализации

  9. Вывод

  10. Что такое сериализация?
    Сериализация — это процесс преобразования объекта в поток байтов для облегчения хранения или передачи. Он позволяет легко хранить объекты на диске или отправлять их по сети.

  11. Что такое десериализация?
    Десериализация — это процесс, обратный сериализации. Он преобразует поток байтов обратно в объект, позволяя его реконструировать.

  12. Сериализация и десериализация Java.
    Java предоставляет встроенные механизмы сериализации и десериализации через интерфейс java.io.Serializable. Вот пример сериализации и десериализации объекта в Java:

import java.io.*;
// Serializable class
class Person implements Serializable {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
// Getters and Setters
    public static void main(String[] args) {
        // Serialization
        try {
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(new Person("John", 30));
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in person.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }
// Deserialization
        try {
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Person person = (Person) in.readObject();
            in.close();
            fileIn.close();
            System.out.println("Deserialized data: " + person.getName() + ", " + person.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  1. Apache Avro:
    Apache Avro — это платформа сериализации данных, предоставляющая компактное, быстрое и основанное на схеме решение для сериализации. Он поддерживает несколько языков программирования и предлагает богатые структуры данных. Вот пример использования Avro для сериализации и десериализации в Hadoop:
import org.apache.avro.Schema;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericDatumReader;
public class AvroSerializationExample {
    public static void main(String[] args) throws Exception {
        // Define schema
        String schemaString = "{\"type\":\"record\",\"name\":\"Person\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":\"int\"}]}";
        Schema schema = new Schema.Parser().parse(schemaString);
        // Serialization
        GenericData.Record person = new GenericData.Record(schema);
        person.put("name", "John");
        person.put("age", 30);
        DataFileWriter<GenericData.Record> writer = new DataFileWriter<>(new GenericDatumWriter<>(schema));
        writer.create(schema, new File("person.avro"));
        writer.append(person);
        writer.close();
        // Deserialization
        DataFileReader<GenericData.Record> reader = new DataFileReader<>(new File("person.avro"), new GenericDatumReader<>());
        GenericData.Record deserializedPerson = null;
        while (reader.hasNext()) {
            deserializedPerson = reader.next(deserializedPerson);
            System.out.println("Deserialized data: " + deserializedPerson.get("name") + ", " + deserializedPerson.get("age"));
        }
        reader.close();
    }
}
  1. Apache Parquet:
    Apache Parquet — это столбчатый формат хранения файлов, который обеспечивает эффективные методы сжатия и кодирования данных. Он подходит для крупномасштабной обработки данных в Hadoop. Parquet поддерживает сериализацию и десериализацию с помощью различных языков программирования, включая Java. Вот пример использования Parquet для сериализации и десериализации:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.hadoop.ParquetReader;
import org.apache.parquet.hadoop.ParquetWriter;
import org.apache.parquet.hadoop.example.GroupReadSupport;
import org.apache.parquet.hadoop.example.GroupWriteSupport;
import org.apache.parquet.schema.MessageType;
import org.apacheparquet.schema.MessageTypeParser;
import org.apache.parquet.example.data.Group;
import org.apache.parquet.example.data.simple.SimpleGroupFactory;
import org.apache.parquet.io.api.Binary;
public class ParquetSerializationExample {
    public static void main(String[] args) throws Exception {
        // Define schema
        String schemaString = "message Person { required binary name; required int32 age; }";
        MessageType schema = MessageTypeParser.parseMessageType(schemaString);
        // Serialization
        Configuration conf = new Configuration();
        GroupWriteSupport.setSchema(schema, conf);
        SimpleGroupFactory groupFactory = new SimpleGroupFactory(schema);
        Group group = groupFactory.newGroup().append("name", "John").append("age", 30);
        ParquetWriter<Group> writer = new ParquetWriter<>(new Path("person.parquet"), new GroupWriteSupport(), ParquetWriter.DEFAULT_COMPRESSION_CODEC_NAME, ParquetWriter.DEFAULT_BLOCK_SIZE, ParquetWriter.DEFAULT_PAGE_SIZE, ParquetWriter.DEFAULT_PAGE_SIZE, ParquetWriter.DEFAULT_IS_DICTIONARY_ENABLED, ParquetWriter.DEFAULT_IS_VALIDATING_ENABLED, ParquetWriter.DEFAULT_WRITER_VERSION, conf);
        writer.write(group);
        writer.close();
        // Deserialization
        ParquetReader<Group> reader = ParquetReader.builder(new GroupReadSupport(), new Path("person.parquet")).withConf(conf).build();
        Group deserializedGroup;
        while ((deserializedGroup = reader.read()) != null) {
            System.out.println("Deserialized data: " + deserializedGroup.getString("name", 0) + ", " + deserializedGroup.getInteger("age", 0));
        }
        reader.close();
    }
}
  1. Apache ORC:
    Apache ORC (оптимизированная строка-столбец) — это самоописывающийся, учитывающий тип и высокоэффективный формат столбцового хранения. Он обеспечивает превосходные возможности сжатия и передачи предикатов. Сериализацию и десериализацию ORC можно выполнить с помощью библиотек ORC в Hadoop. Вот пример:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.orc.OrcFile;
import org.apache.orc.Reader;
import org.apache.orc.RecordReader;
import org.apache.orc.TypeDescription;
import org.apache.orc.Writer;
public class ORCSerializationExample {
    public static void main(String[] args) throws Exception {
        // Define schema
        TypeDescription schema = TypeDescription.fromString("struct<name:string,age:int>");
        // Serialization
        Configuration conf = new Configuration();
        Writer writer = OrcFile.createWriter(new Path("person.orc"), OrcFile.writerOptions(conf).setSchema(schema));
        writer.addRow("John", 30);
        writer.close();
        // Deserialization
        Reader reader = OrcFile.createReader(new Path("person.orc"), OrcFile.readerOptions(conf));
        RecordReader recordReader = reader.rows();
        Object[] row = null;
        while (recordReader.hasNext()) {
            row = recordReader.next(row);
            System.out.println("Deserialized data: " + row[0] + ", " + row[1]);
        }
        recordReader.close();
    }
}
  1. Apache Thrift:
    Apache Thrift — это масштабируемая межъязыковая платформа для эффективной сериализации и десериализации структурированных данных. Он поддерживает генерацию кода для нескольких языков и предлагает компактный двоичный протокол. Вот пример использования Apache Thrift для сериализации и десериализации в Hadoop:
// Generate the Thrift classes using the Thrift compiler
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TIOStreamTransport;
import org.apache.thrift.transport.TMemoryBuffer;
public class ThriftSerializationExample {
    public static void main(String[] args) throws Exception {
        // Serialization
        Person person = new Person("John", 30);
        TMemoryBuffer buffer = new TMemoryBuffer(1024);
        TBinaryProtocol protocol = new TBinaryProtocol(buffer);
        person.write(protocol);
        // Deserialization
        Person deserializedPerson = new Person();
        TBinaryProtocol deserializationProtocol = new TBinaryProtocol(new TIOStreamTransport(buffer.getArray()));
        deserializedPerson.read(deserializationProtocol);
        System.out.println("Deserialized data: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge());
    }
}
  1. Сравнение форматов сериализации.
    Каждый формат сериализации в Hadoop имеет свои преимущества и варианты использования. Выбор формата сериализации зависит от таких факторов, как размер данных, производительность чтения и записи, эволюция схемы и совместимость с различными языками программирования. Прежде чем выбирать формат сериализации, важно оценить конкретные требования вашего варианта использования.

Сериализация и десериализация — фундаментальные концепции Hadoop и обработки больших данных. В этой статье были рассмотрены различные методы сериализации и десериализации в Hadoop, включая сериализацию Java, Apache Avro, Apache Parquet, Apache ORC и Apache Thrift. Понимая это,