Сериализация и десериализация — важные понятия в Hadoop и других средах обработки больших данных. Они играют решающую роль в эффективном хранении и передаче данных между распределенными системами. В этой статье мы рассмотрим различные методы сериализации и десериализации в Hadoop, а также приведем примеры кода, иллюстрирующие их использование.
Содержание:
-
Что такое сериализация?
-
Что такое десериализация?
-
Сериализация и десериализация Java
-
Apache Avro
-
Паркет Apache
-
Apache ORC
-
Apache Thrift
-
Сравнение форматов сериализации
-
Вывод
-
Что такое сериализация?
Сериализация — это процесс преобразования объекта в поток байтов для облегчения хранения или передачи. Он позволяет легко хранить объекты на диске или отправлять их по сети. -
Что такое десериализация?
Десериализация — это процесс, обратный сериализации. Он преобразует поток байтов обратно в объект, позволяя его реконструировать. -
Сериализация и десериализация 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();
}
}
}
- 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();
}
}
- 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();
}
}
- 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();
}
}
- 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());
}
}
- Сравнение форматов сериализации.
Каждый формат сериализации в Hadoop имеет свои преимущества и варианты использования. Выбор формата сериализации зависит от таких факторов, как размер данных, производительность чтения и записи, эволюция схемы и совместимость с различными языками программирования. Прежде чем выбирать формат сериализации, важно оценить конкретные требования вашего варианта использования.
Сериализация и десериализация — фундаментальные концепции Hadoop и обработки больших данных. В этой статье были рассмотрены различные методы сериализации и десериализации в Hadoop, включая сериализацию Java, Apache Avro, Apache Parquet, Apache ORC и Apache Thrift. Понимая это,