ডেটা স্ট্রিমিং হল একটি প্রক্রিয়া যেখানে ডেটা একটি অবিরাম প্রবাহের মতো আসতে থাকে এবং সেই ডেটাকে রিয়েল-টাইম বা নিকট রিয়েল-টাইমভাবে প্রসেস করা হয়। ডেটা স্ট্রিমিং অ্যাপ্লিকেশন এমন অ্যাপ্লিকেশন যা লাইভ ডেটা প্রবাহের উপর কাজ করে এবং এর মধ্যে বিভিন্ন ফাংশনালিটি যেমন ডেটা সংগ্রহ, প্রসেসিং, এবং আউটপুট ডেটাবেস বা অন্যান্য সিস্টেমে পাঠানো থাকে।
স্কালাতে ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করার জন্য কিছু জনপ্রিয় লাইব্রেরি ও টুল রয়েছে, যেমন Akka Streams, Apache Kafka, Apache Flink, Spark Streaming ইত্যাদি। এখানে আমরা Akka Streams এবং Apache Kafka ব্যবহার করে ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করার উদাহরণ দেখব।
১. Akka Streams দিয়ে ডেটা স্ট্রিমিং অ্যাপ্লিকেশন
Akka Streams হল Akka ফ্রেমওয়ার্কের একটি অংশ যা ডেটা স্ট্রিমিং এবং ফ্লো কন্ট্রোলের জন্য ব্যবহৃত হয়। এটি অত্যন্ত স্কেলেবল এবং কার্যকরী, বিশেষত যখন আপনি বড় আকারের ডেটা প্রসেস করতে চান।
১.১ Akka Streams সেটআপ
Akka Streams ব্যবহার করতে build.sbt ফাইলে Akka লাইব্রেরি যোগ করতে হবে:
name := "AkkaStreamsExample"
version := "0.1"
scalaVersion := "2.13.6"
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-stream" % "2.6.16",
"com.typesafe.akka" %% "akka-actor" % "2.6.16"
)১.২ Akka Streams উদাহরণ: ডেটা স্ট্রিমিং
এখানে একটি সিম্পল উদাহরণ দেওয়া হলো যেখানে একটি ডেটা স্ট্রিম প্রসেস করা হচ্ছে:
import akka.actor.ActorSystem
import akka.stream.{ActorMaterializer, Materializer}
import akka.stream.scaladsl.{Source, Flow, Sink}
object AkkaStreamExample extends App {
implicit val system: ActorSystem = ActorSystem("DataStreamingSystem")
implicit val materializer: Materializer = ActorMaterializer()
// Define a source of data (streaming integers from 1 to 5)
val source = Source(1 to 5)
// Define a flow that multiplies each element by 2
val flow = Flow[Int].map(x => x * 2)
// Define a sink that will print each element
val sink = Sink.foreach(println)
// Connect source, flow, and sink
source.via(flow).to(sink).run()
}এখানে:
- Source: এটি স্ট্রিমের উৎস। এখানে আমরা ১ থেকে ৫ পর্যন্ত সংখ্যা স্ট্রিম করছি।
- Flow: এটি স্ট্রিমের মধ্যবর্তী ট্রান্সফর্মেশন। এখানে প্রতিটি সংখ্যাকে ২ দিয়ে গুণ করা হচ্ছে।
- Sink: এটি স্ট্রিমের আউটপুট। এখানে, প্রতিটি সংখ্যাকে প্রিন্ট করা হচ্ছে।
এটি একটি সিম্পল ডেটা স্ট্রিমিং অ্যাপ্লিকেশন যা Akka Streams ব্যবহার করে ডেটা প্রসেস এবং আউটপুট প্রদর্শন করে।
২. Apache Kafka দিয়ে ডেটা স্ট্রিমিং অ্যাপ্লিকেশন
Apache Kafka একটি ডিস্ট্রিবিউটেড স্ট্রিমিং প্ল্যাটফর্ম, যা লাইভ ডেটা স্ট্রিম করতে ব্যবহৃত হয়। Kafka সাধারণত ব্যবহার করা হয় ডেটা প্রবাহ (data flow) সংরক্ষণ এবং প্রক্রিয়া করার জন্য, বিশেষত বৃহৎ স্কেলে।
২.১ Kafka সেটআপ
Kafka ব্যবহার করার জন্য build.sbt ফাইলে Kafka লাইব্রেরি যোগ করতে হবে:
libraryDependencies += "org.apache.kafka" %% "kafka" % "2.8.0"২.২ Kafka Producer উদাহরণ
Kafka Producer তৈরি করা হবে যা ডেটা পাঠাবে একটি নির্দিষ্ট টপিকে। এখানে একটি উদাহরণ দেওয়া হলো:
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
import java.util.Properties
object KafkaProducerApp {
def main(args: Array[String]): Unit = {
// Configure the Kafka producer
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
val producer = new KafkaProducer[String, String](props)
// Send a message to the "test" topic
val record = new ProducerRecord[String, String]("test", "key", "Hello, Kafka Streaming!")
producer.send(record)
println("Message sent to Kafka topic")
producer.close()
}
}এখানে:
- KafkaProducer: এটি Kafka টপিকে মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।
- ProducerRecord: এটি একটি মেসেজ যা Kafka টপিকে পাঠানো হবে।
২.৩ Kafka Consumer উদাহরণ
Kafka Consumer তৈরি করা হবে যা সেই টপিক থেকে ডেটা পড়বে:
import org.apache.kafka.clients.consumer.{KafkaConsumer}
import java.util.Properties
import scala.collection.JavaConverters._
object KafkaConsumerApp {
def main(args: Array[String]): Unit = {
// Configure the Kafka consumer
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("group.id", "test-group")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
val consumer = new KafkaConsumer[String, String](props)
consumer.subscribe(List("test").asJava)
// Continuously read messages from the "test" topic
while (true) {
val records = consumer.poll(1000) // Poll for new records
for (record <- records.asScala) {
println(s"Received message: ${record.value()}")
}
}
}
}এখানে:
- KafkaConsumer: এটি Kafka টপিক থেকে মেসেজ গ্রহণ করার জন্য ব্যবহৃত হয়।
- poll: এটি নির্দিষ্ট সময় অন্তর Kafka থেকে নতুন মেসেজ পেতে ব্যবহৃত হয়।
৩. Kafka Streams: ডেটা স্ট্রিমিং প্ল্যাটফর্ম
Kafka Streams একটি Java লাইব্রেরি, যা ব্যবহারকারীদের Kafka টপিকের মধ্যে স্ট্রিমিং ডেটা প্রক্রিয়া করতে দেয়। এটি একটি উচ্চ পারফরম্যান্স লাইব্রেরি, যা Kafka ও তার ডিস্ট্রিবিউটেড প্ল্যাটফর্মের সাথে সহজভাবে কাজ করে।
উদাহরণ:
Kafka Streams ব্যবহার করে ডেটা স্ট্রিমিং করার জন্য আপনি ডেটাকে এক টপিক থেকে অন্য টপিকে প্রক্রিয়া এবং রূপান্তর করতে পারেন।
৪. Apache Flink: এক্সটেনসিভ ডেটা স্ট্রিমিং
Apache Flink একটি ওপেন সোর্স ফ্রেমওয়ার্ক যা রিয়েল-টাইম ডেটা স্ট্রিমিং এবং ব্যাচ প্রসেসিং এর জন্য ব্যবহৃত হয়। Flink অত্যন্ত স্কেলেবল এবং এটির মাধ্যমে ডেটা প্রবাহ নিয়ন্ত্রণ এবং বিশ্লেষণ করা সহজ।
উদাহরণ:
Flink ব্যবহার করে ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করার জন্য, আপনি Flink DataStream API ব্যবহার করতে পারেন।
সারাংশ
- ডেটা স্ট্রিমিং অ্যাপ্লিকেশন একটি রিয়েল-টাইম সিস্টেম যেখানে ডেটা প্রবাহ (streaming) প্রক্রিয়া করা হয় এবং এই ডেটা গ্রাহকদের কাছে পাঠানো বা স্টোর করা হয়।
- Akka Streams এবং Apache Kafka হল জনপ্রিয় টুলস যা ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।
- Akka Streams: এটি কার্যকরভাবে ডেটা স্ট্রিম প্রক্রিয়া করতে ব্যবহৃত হয় এবং ফ্লো কন্ট্রোল প্রদান করে।
- Apache Kafka: এটি একটি ডিস্ট্রিবিউটেড স্ট্রিমিং প্ল্যাটফর্ম যা ডেটা স্ট্রিম এবং মেসেজিং সিস্টেম হিসেবে কাজ করে।
এগুলি সঠিকভাবে ব্যবহার করলে আপনি স্কেলেবল এবং রিয়েল-টাইম ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করতে পারবেন।