Avro হল একটি ডেটা সেরিয়ালাইজেশন ফ্রেমওয়ার্ক যা বিশেষভাবে ডিস্ট্রিবিউটেড সিস্টেমে ডেটা প্রেরণ করার জন্য ডিজাইন করা হয়েছে। এটি একটি বাইনারি ফর্ম্যাট যা ডেটা কম্প্যাক্টভাবে সঞ্চয় এবং ট্রান্সফার করতে সহায়তা করে, এবং এটি কাফকা ক্লাস্টারের মধ্যে ডেটা সঞ্চালন করার জন্য একটি জনপ্রিয় সেরিয়ালাইজেশন পদ্ধতি। Avro এর সবচেয়ে বড় সুবিধা হল schema-based সেরিয়ালাইজেশন, যেখানে ডেটার গঠন (schema) নির্ধারণ করে, এবং schema ইন্টিগ্রেশনটি অত্যন্ত সুবিধাজনক এবং নমনীয় হয়।
Avro Schema কী?
Avro Schema হল একটি JSON ফর্ম্যাটে সংজ্ঞায়িত ডেটার গঠন (structure)। এটি একটি ডেটা সেরিয়ালাইজেশন ফরম্যাটের জন্য একটি মেটাডেটা হিসেবে কাজ করে, যা ডেটার প্রতিটি ফিল্ডের নাম, টাইপ, এবং অন্যান্য প্রপার্টি সম্পর্কে তথ্য প্রদান করে। Avro একটি schema registry এর সাহায্যে schema গুলোকে সেন্ট্রালাইজডভাবে পরিচালনা করতে পারে, যা সহজে schema আপডেট এবং ভার্সনিং পরিচালনা করতে সক্ষম করে।
Avro ফাইলের মূল বৈশিষ্ট্য হল:
- Compact: এটি কম্প্যাক্ট বাইনারি ফরম্যাটে ডেটা সঞ্চয় করে।
- Schema-Driven: ডেটার গঠন schema দিয়ে পরিচালিত হয়।
- Self-describing: প্রতিটি Avro ডেটা ব্লকের সাথে তার schema অন্তর্ভুক্ত থাকে, যা ডেটার ব্যাখ্যা প্রদান করে।
Avro Data Serialization in Kafka
Kafka-তে Avro সেরিয়ালাইজেশন ব্যবহৃত হয় যাতে ডেটা সঞ্চালন দ্রুত এবং কম্প্যাক্ট হয়, এবং কাফকার প্রযোজনা (producer) ও গ্রহণ (consumer) উভয় প্রান্তে schema সার্বভৌমতা নিশ্চিত থাকে। Kafka-তে Avro ব্যবহারের মাধ্যমে ডেটার গঠন নির্ধারণ করা এবং তার স্ট্রাকচারাল অখণ্ডতা নিশ্চিত করা সহজ হয়।
Kafka Producer-এ Avro Serialization:
Kafka Producer-এ Avro Serialization ব্যবহার করতে হলে কিছু নির্দিষ্ট লাইব্রেরি এবং কনফিগারেশন প্রয়োজন:
- Avro Dependency: প্রথমে Avro সংক্রান্ত ডিপেনডেন্সি আপনার প্রজেক্টে অন্তর্ভুক্ত করতে হবে।
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.10.2</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>7.x.x</version>
</dependency>
- Avro Schema File: একটি Avro schema ফাইল তৈরি করুন, যেখানে আপনি ডেটার গঠন সংজ্ঞায়িত করবেন। উদাহরণস্বরূপ:
user.avsc (Avro Schema Example):
{
"type": "record",
"name": "User",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "age",
"type": "int"
}
]
}
এটি একটি User নামক রেকর্ড তৈরি করে, যার মধ্যে দুটি ফিল্ড রয়েছে: name (string টাইপ) এবং age (int টাইপ)।
- Producer Configuration: Kafka producer কনফিগারেশনে Avro serializer ব্যবহার করতে হবে। নিচের কনফিগারেশন উদাহরণ:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
props.put("schema.registry.url", "http://localhost:8081"); // Schema Registry URL
- Producer Implementation: Kafka Producer কোডে Avro ডেটা সেরিয়ালাইজ করার উদাহরণ:
public class AvroProducer {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("key.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
properties.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
properties.put("schema.registry.url", "http://localhost:8081");
KafkaProducer<String, GenericRecord> producer = new KafkaProducer<>(properties);
String topic = "user-topic";
// Load schema
Schema schema = new Schema.Parser().parse(new File("user.avsc"));
// Create a GenericRecord
GenericRecord user = new GenericData.Record(schema);
user.put("name", "John Doe");
user.put("age", 30);
// Produce the record
ProducerRecord<String, GenericRecord> record = new ProducerRecord<>(topic, "key", user);
producer.send(record);
producer.close();
}
}
Avro Data Consumer-এ Deserialization
Kafka Consumer-এ Avro ডেটা ডিসিরিয়ালাইজ করতে নিম্নলিখিত পদক্ষেপ অনুসরণ করা হয়:
- Consumer Configuration: Kafka Consumer কনফিগারেশনে Avro Deserializer ব্যবহার করতে হবে।
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "consumer-group");
props.put("key.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
props.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
props.put("schema.registry.url", "http://localhost:8081");
- Consumer Implementation: Kafka Consumer এর মাধ্যমে Avro ডেটা ডিসিরিয়ালাইজ করার উদাহরণ:
public class AvroConsumer {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("group.id", "consumer-group");
properties.put("key.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
properties.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
properties.put("schema.registry.url", "http://localhost:8081");
KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<>(properties);
consumer.subscribe(Collections.singletonList("user-topic"));
while (true) {
ConsumerRecords<String, GenericRecord> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, GenericRecord> record : records) {
GenericRecord user = record.value();
System.out.println("Received user: " + user.get("name") + ", Age: " + user.get("age"));
}
}
}
}
এখানে, Consumer এর মাধ্যমে Avro ডেটা ডিসিরিয়ালাইজ করে GenericRecord অবজেক্টে প্রসেস করা হচ্ছে।
Avro এবং Kafka Schema Registry
Avro ফাইলগুলি যখন Kafka টপিকে প্রেরণ করা হয়, তখন Kafka Schema Registry ব্যবহৃত হয়, যা schemas সেন্ট্রালাইজডভাবে স্টোর এবং ম্যানেজ করে। এটি Kafka Producer এবং Consumer এর মধ্যে schema incompatibilities দূর করতে সাহায্য করে।
Schema Registry হল একটি সার্ভিস যা schema গুলো সংরক্ষণ এবং ভার্সনিং সাপোর্ট করে। যখনই schema আপডেট হয়, schema registry নিশ্চিত করে যে producer এবং consumer উভয় পক্ষই সঠিক schema ব্যবহার করছে।
সারাংশ
Kafka তে Avro এর মাধ্যমে ডেটা সেরিয়ালাইজেশন একটি শক্তিশালী এবং কার্যকরী পদ্ধতি, যা ডেটা কম্প্যাক্টনেস, schema-based validation, এবং efficient serialization নিশ্চিত করে। এটি ডেটা স্ট্রিমিং এবং প্রক্রিয়াকরণে schema বেসড অ্যাপ্রোচ ব্যবহার করতে সাহায্য করে এবং Kafka Producer এবং Consumer এর মধ্যে নির্ভরযোগ্য ডেটা ট্রান্সফার সমর্থন করে। Kafka-র সাথে Avro ব্যবহারের মাধ্যমে ডেটা গঠন সহজে ম্যানেজ করা যায় এবং সিস্টেমে নমনীয়তা এবং স্কেলেবিলিটি আসে।
Read more