Apache Avro হল একটি শক্তিশালী ডেটা সিরিয়ালাইজেশন ফ্রেমওয়ার্ক যা ডিস্ট্রিবিউটেড সিস্টেমে ব্যবহৃত হয়, বিশেষ করে Apache Hadoop এবং Apache Kafka এর মতো প্ল্যাটফর্মে। Java-তে Avro ব্যবহার করে Serialization (ডেটাকে বাইনারি ফরম্যাটে রূপান্তর) এবং Deserialization (বাইনারি ডেটা থেকে আসল অবজেক্টে রূপান্তর) সহজেই করা যায়। Avro এর এই ক্ষমতাগুলো Java API ব্যবহার করে বাস্তবায়িত করা যেতে পারে।
এখানে, আমরা দেখব কীভাবে Java API দিয়ে Avro Serialization এবং Deserialization করতে হয়।
১. Java API দিয়ে Avro Schema তৈরি করা
Avro ব্যবহার করার প্রথম ধাপ হলো একটি Avro Schema তৈরি করা। এটি ডেটার কাঠামো সংজ্ঞায়িত করে। স্কিমা সাধারণত JSON ফরম্যাটে তৈরি হয়।
উদাহরণ:
{
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"}
]
}
এখানে, একটি User নামক রেকর্ড স্কিমা তৈরি করা হয়েছে, যেখানে দুটি ফিল্ড আছে: name (string) এবং age (int)।
২. Java Class থেকে Avro Schema তৈরি করা
Avro স্কিমা তৈরি করতে, Java ক্লাস ব্যবহার করে এটি তৈরি করা যেতে পারে। Avro-তে স্কিমা কম্পাইল করতে Avro Maven Plugin ব্যবহার করা হয়। এর মাধ্যমে Java ক্লাস থেকে স্বয়ংক্রিয়ভাবে স্কিমা তৈরি করা সম্ভব হয়।
Maven পম.xml কনফিগারেশন:
<build>
<plugins>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.11.1</version>
<executions>
<execution>
<goals>
<goal>schema</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
এই কনফিগারেশন দিয়ে Java ক্লাস ফাইলটি স্কিমাতে রূপান্তরিত হবে।
৩. Java কোড দিয়ে Avro Serialization এবং Deserialization
৩.১ Serialization (ডেটা বাইনারি ফরম্যাটে রূপান্তর)
Avro Serialization-এর মাধ্যমে Java অবজেক্টকে বাইনারি ফরম্যাটে রূপান্তর করা হয়, যা সংরক্ষণ এবং ট্রান্সফার সহজ করে তোলে।
উদাহরণ:
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.EncoderFactory;
import java.io.File;
import java.io.IOException;
public class AvroSerializationExample {
public static void main(String[] args) throws IOException {
// Load schema
String schemaJson = "{\n" +
" \"type\": \"record\",\n" +
" \"name\": \"User\",\n" +
" \"fields\": [\n" +
" {\"name\": \"name\", \"type\": \"string\"},\n" +
" {\"name\": \"age\", \"type\": \"int\"}\n" +
" ]\n" +
"}";
Schema schema = new Schema.Parser().parse(schemaJson);
// Create a user record
GenericData.Record user = new GenericData.Record(schema);
user.put("name", "John Doe");
user.put("age", 29);
// Serialize the record to a file
File file = new File("user.avro");
DatumWriter<GenericData.Record> datumWriter = new org.apache.avro.generic.GenericDatumWriter<>(schema);
DataFileWriter<GenericData.Record> dataFileWriter = new DataFileWriter<>(datumWriter);
dataFileWriter.create(schema, file);
dataFileWriter.append(user);
dataFileWriter.close();
System.out.println("Serialization successful!");
}
}
ব্যাখ্যা:
- Schema: স্কিমা JSON ফরম্যাটে লোড করা হয়েছে এবং Avro
Schemaঅবজেক্টে পার্স করা হয়েছে। - GenericData.Record: Avro রেকর্ড তৈরি করা হয়েছে যেখানে
nameএবংageফিল্ডস রাখা হয়েছে। - DataFileWriter: এই ক্লাসটি ব্যবহার করে আমরা ডেটাকে একটি
.avroফাইলে সিরিয়ালাইজ করছি।
৩.২ Deserialization (বাইনারি ডেটা থেকে আসল অবজেক্টে রূপান্তর)
ডেসিরিয়ালাইজেশন-এর মাধ্যমে Avro ফাইল থেকে ডেটা পড়া হয় এবং তা Java অবজেক্টে রূপান্তরিত হয়।
উদাহরণ:
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.io.DatumReader;
import org.apache.avro.generic.GenericDatumReader;
import java.io.File;
import java.io.IOException;
public class AvroDeserializationExample {
public static void main(String[] args) throws IOException {
// Load schema
String schemaJson = "{\n" +
" \"type\": \"record\",\n" +
" \"name\": \"User\",\n" +
" \"fields\": [\n" +
" {\"name\": \"name\", \"type\": \"string\"},\n" +
" {\"name\": \"age\", \"type\": \"int\"}\n" +
" ]\n" +
"}";
Schema schema = new Schema.Parser().parse(schemaJson);
// Deserialize the record from the file
File file = new File("user.avro");
DatumReader<GenericData.Record> datumReader = new GenericDatumReader<>(schema);
DataFileReader<GenericData.Record> dataFileReader = new DataFileReader<>(file, datumReader);
// Read each record
while (dataFileReader.hasNext()) {
GenericData.Record user = dataFileReader.next();
System.out.println("Name: " + user.get("name") + ", Age: " + user.get("age"));
}
dataFileReader.close();
}
}
ব্যাখ্যা:
- DatumReader:
DatumReaderঅবজেক্ট দিয়ে ফাইল থেকে ডেটা ডেসিরিয়ালাইজ করা হয়। - DataFileReader: এই ক্লাস ব্যবহার করে
.avroফাইল থেকে ডেটা পড়া হয় এবং এটিGenericData.Recordঅবজেক্টে রূপান্তরিত হয়।
৪. Avro Serialization এবং Deserialization এর সুবিধা
- Compact and Efficient: Avro সিরিয়ালাইজেশন ফাইলগুলো ছোট আকারে থাকে, যেহেতু এটি বাইনারি ফরম্যাটে ডেটা সংরক্ষণ করে। এতে ডিস্ক স্পেস এবং নেটওয়ার্ক ব্যান্ডউইথের সাশ্রয় হয়।
- Schema Evolution: স্কিমা পরিবর্তনের মাধ্যমে পুরনো ডেটা নতুন স্কিমার সাথে সামঞ্জস্যপূর্ণ থাকে। এটা ডিস্ট্রিবিউটেড সিস্টেমে ডেটা ইভোলিউশনের জন্য সহায়ক।
- Language Independence: Avro স্কিমা এবং সিরিয়ালাইজেশন ফরম্যাট অনেক প্রোগ্রামিং ভাষায় সমর্থিত, যেমন Java, Python, C++, ইত্যাদি।
- Interoperability: Avro ডেটা অন্য সিস্টেমের সাথে সহজে ইন্টারঅপারেবল (অর্থাৎ, এক সিস্টেম থেকে অন্য সিস্টেমে ডেটা আদান-প্রদান)।
সারাংশ
Java API দিয়ে Avro Serialization এবং Deserialization প্রক্রিয়াটি বেশ সহজ এবং কার্যকরী। এটি ডেটাকে কমপ্যাক্ট বাইনারি ফরম্যাটে রূপান্তরিত করতে সাহায্য করে এবং একে সহজে সংরক্ষণ ও ট্রান্সফার করা যায়। Avro-র schema-based সিরিয়ালাইজেশন একটি শক্তিশালী এবং নমনীয় সিস্টেম তৈরি করে, যা ডিস্ট্রিবিউটেড সিস্টেমে ডেটার সামঞ্জস্যপূর্ণ ব্যবহার নিশ্চিত করে।
Read more