Apache Flink এর Window Mechanism স্ট্রিম ডেটা প্রসেসিংয়ের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডেটা স্ট্রিমকে নির্দিষ্ট সময় বা ইভেন্ট ভিত্তিক ইন্টারভালে ভাগ করে প্রসেস করতে সাহায্য করে। উইন্ডো মেকানিজম স্ট্রিম ডেটাকে ছোট ছোট অংশে বিভক্ত করে এবং সেগুলির উপর নির্দিষ্ট অপারেশন যেমন অ্যাগ্রিগেশন, ফিল্টারিং, ট্রান্সফর্মেশন ইত্যাদি প্রয়োগ করা যায়। Flink এ বিভিন্ন ধরনের উইন্ডো সাপোর্ট করা হয়, যেমন Time Windows, Count Windows, এবং Session Windows, যা বিভিন্ন ধরনের ডেটা প্রসেসিং কেসের জন্য উপযোগী।
Flink এর উইন্ডো মেকানিজম প্রধানত কয়েকটি ভাগে বিভক্ত:
Time Windows হল উইন্ডোগুলি যা সময়ের ভিত্তিতে তৈরি হয়। সময় ভিত্তিক উইন্ডোগুলির মধ্যে সবচেয়ে সাধারণ দুটি হল Tumbling এবং Sliding Windows।
DataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
.sum(1);
DataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.window(SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10)))
.sum(1);
Count Windows একটি নির্দিষ্ট সংখ্যক ইভেন্ট সংগ্রহ করে উইন্ডো তৈরি করে। এটি সময়ের পরিবর্তে ইভেন্টের সংখ্যার ভিত্তিতে উইন্ডো তৈরি করে।
DataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.countWindow(10)
.sum(1);
Session Windows হল উইন্ডো যা ইভেন্টগুলির মধ্যে নির্দিষ্ট সময়ের বিরতি বা inactivity gap এর উপর ভিত্তি করে তৈরি হয়। যদি একটি নির্দিষ্ট সময়ের মধ্যে কোনো ইভেন্ট না ঘটে, তবে উইন্ডোটি বন্ধ হয়ে যায় এবং একটি নতুন সেশন উইন্ডো শুরু হয়। এটি ব্যবহারকারীর সেশনের মতো কেসগুলোতে ব্যবহৃত হয় যেখানে ইভেন্টগুলির মধ্যে সময়ের ফাঁক থাকে।
DataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.window(ProcessingTimeSessionWindows.withGap(Time.minutes(5)))
.sum(1);
Global Windows হল উইন্ডো যা ম্যানুয়ালি কনফিগার করা যায় এবং এটি সমস্ত ডেটা সংগ্রহ করে। এটি সাধারণত ব্যবহার করা হয় যখন একটি নির্দিষ্ট ট্রিগার কন্ডিশন পূর্ণ হলে উইন্ডো প্রসেস করা হয়।
DataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.window(GlobalWindows.create())
.trigger(CountTrigger.of(100))
.sum(1);
Flink এ উইন্ডো ট্রিগার একটি মেকানিজম যা নির্ধারণ করে কখন একটি উইন্ডো প্রসেস করা হবে। প্রতিটি উইন্ডো একটি trigger এর সাথে এসোসিয়েটেড থাকে, যা ডিফল্ট বা কাস্টম হতে পারে।
Flink এর উইন্ডোতে প্রয়োগ করতে উইন্ডো ফাংশন ব্যবহৃত হয়। প্রধান উইন্ডো ফাংশনগুলোর মধ্যে রয়েছে:
DataStream<Tuple2<String, Integer>> result = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.process(new ProcessWindowFunction<Tuple2<String, Integer>, Tuple2<String, Integer>, String, TimeWindow>() {
@Override
public void process(String key, Context context, Iterable<Tuple2<String, Integer>> elements, Collector<Tuple2<String, Integer>> out) {
int sum = 0;
for (Tuple2<String, Integer> element : elements) {
sum += element.f1;
}
out.collect(new Tuple2<>(key, sum));
}
});
Flink এর Window Mechanism অত্যন্ত ফ্লেক্সিবল এবং এটি বড় আকারের স্ট্রিম ডেটা প্রসেস করার জন্য বিশেষভাবে উপযুক্ত। বিভিন্ন ধরনের উইন্ডো এবং ট্রিগার ব্যবহার করে ডেভেলপাররা রিয়েল-টাইম ডেটা প্রসেসিং অ্যাপ্লিকেশন তৈরি করতে পারেন, যা দ্রুত এবং কার্যকরী।
Apache Flink-এ Windows হলো এমন একটি মেকানিজম যা স্ট্রিম ডেটাকে নির্দিষ্ট সময় বা ইভেন্টের উপর ভিত্তি করে ভাগ করে ডেটা প্রসেস করতে সাহায্য করে। স্ট্রিম ডেটা সাধারণত অবিরাম এবং অন্তহীন হয়, তাই নির্দিষ্ট সময় বা ইভেন্টের পরিপ্রেক্ষিতে ডেটা গ্রুপ করে প্রসেস করা গুরুত্বপূর্ণ। Flink-এ উইন্ডো মেকানিজম স্ট্রিম ডেটা প্রসেসিং-এর অন্যতম গুরুত্বপূর্ণ উপাদান, এবং Flink বিভিন্ন ধরনের উইন্ডো সমর্থন করে।
Flink-এ উইন্ডোকে সাধারণত চারটি প্রধান শ্রেণিতে ভাগ করা হয়:
প্রতিটি উইন্ডোর একটি নির্দিষ্ট আচরণ এবং প্রসেসিং মেকানিজম রয়েছে। নিচে তাদের ব্যাখ্যা করা হলো:
Tumbling Windows হলো একটি ফিক্সড-সাইজ উইন্ডো যা কোনো ওভারল্যাপ ছাড়াই স্ট্রিম ডেটাকে নির্দিষ্ট সময় বা ইভেন্ট কাউন্টের ভিত্তিতে ভাগ করে। প্রতিটি উইন্ডো তার নির্দিষ্ট দৈর্ঘ্যের পর নতুন উইন্ডোতে শুরু হয়।
dataStream
.keyBy(value -> value.getKey())
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.sum("value");
value
ফিল্ডের সমষ্টি (sum) গণনা করা হয়েছে।Sliding Windows হলো একটি ফিক্সড-সাইজ উইন্ডো যা একটি নির্দিষ্ট ইন্টারভালে স্লাইড করে। Sliding Windows সাধারণত ওভারল্যাপিং উইন্ডো হয়, যেখানে প্রতিটি উইন্ডো নির্দিষ্ট সময় পরপর শুরু হয় এবং আগের উইন্ডোর কিছু অংশও ধরে রাখতে পারে।
dataStream
.keyBy(value -> value.getKey())
.window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
.sum("value");
value
ফিল্ডের সমষ্টি (sum) গণনা করা হচ্ছে।Session Windows হলো এমন উইন্ডো যা একটানা ইভেন্টের উপর নির্ভর করে এবং কোন ফিক্সড টাইম ইন্টারভাল অনুসরণ করে না। এটি inactivity gap বা session gap এর উপর ভিত্তি করে ডেটাকে গ্রুপ করে। যখন দুটি ইভেন্টের মধ্যে একটি নির্দিষ্ট সময়ের বিরতি থাকে, তখন একটি নতুন উইন্ডো শুরু হয়।
dataStream
.keyBy(value -> value.getKey())
.window(EventTimeSessionWindows.withGap(Time.seconds(30)))
.sum("value");
Global Windows হলো একটি বিশেষ উইন্ডো যা Flink-এর মাধ্যমে নির্দিষ্টভাবে ট্রিগার না হওয়া পর্যন্ত স্ট্রিমের সমস্ত ডেটাকে ধরে রাখে। Global Windows সাধারণত কাস্টম ট্রিগার এবং প্রসেস ফাংশনের সাথে ব্যবহৃত হয়, কারণ এটি ডিফল্টভাবে কোন সময় বা ইভেন্ট কাউন্টের উপর নির্ভর করে না।
dataStream
.keyBy(value -> value.getKey())
.window(GlobalWindows.create())
.trigger(new CustomTrigger())
.sum("value");
GlobalWindows.create()
ব্যবহার করে একটি গ্লোবাল উইন্ডো তৈরি করা হয়েছে এবং একটি কাস্টম ট্রিগার সেট করা হয়েছে, যা নির্দিষ্ট শর্ত অনুযায়ী উইন্ডো প্রসেস করবে।Apache Flink-এ Windows বিভিন্ন ধরণের স্ট্রিম ডেটা প্রসেসিং এবং অ্যাগ্রিগেশন করতে সাহায্য করে। এটি বিভিন্ন ধরনের প্রসেসিং স্ট্র্যাটেজি সমর্থন করে, যেমন Tumbling Windows নির্দিষ্ট ইন্টারভালের জন্য ডেটা গ্রুপ করে, Sliding Windows ওভারল্যাপিং করে প্রসেসিং করে, Session Windows সেশন ভিত্তিক ডেটা গ্রুপ করে, এবং Global Windows কাস্টম শর্তে ডেটা প্রসেস করে। এই উইন্ডোগুলি Flink-এ স্ট্রিম ডেটা প্রসেসিংকে আরও সহজ এবং কার্যকর করে তোলে।
Apache Flink-এ Time Window এবং Count Window হলো দুটি সাধারণ উইন্ডোিং কৌশল যা স্ট্রিম ডেটা প্রসেসিংয়ে ব্যবহৃত হয়। উইন্ডোগুলি ইনকামিং ডেটাকে নির্দিষ্ট সময় বা ইভেন্টের সংখ্যার ভিত্তিতে ভাগ করে এবং এইভাবে ডেটা প্রসেসিং আরও নিয়ন্ত্রিত এবং পরিচালনাযোগ্য হয়। Flink স্ট্রিম প্রসেসিংয়ের ক্ষেত্রে, উইন্ডো অপারেশন ব্যবহার করে ডেটাকে গ্রুপ করে অ্যাগ্রিগেশন বা অন্য কোনও ট্রান্সফরমেশন করা সহজ হয়।
Time Window হলো নির্দিষ্ট সময়কাল ভিত্তিক উইন্ডো যা ইনপুট স্ট্রিম ডেটাকে সময়ের একটি নির্দিষ্ট পরিসরে ভাগ করে। Flink-এ টাইম উইন্ডো সাধারণত দুটি প্রকারের হতে পারে:
DataStream<Tuple2<String, Integer>> stream = ...;
// ৫ সেকেন্ডের টাম্বলিং উইন্ডো
DataStream<Tuple2<String, Integer>> result = stream
.keyBy(value -> value.f0) // keyBy ব্যবহার করে স্ট্রিমকে কী ভিত্তিক ভাগ করা
.window(TumblingProcessingTimeWindows.of(Time.seconds(5))) // ৫ সেকেন্ডের উইন্ডো
.sum(1); // প্রতিটি উইন্ডোতে দ্বিতীয় ফিল্ডের মানের যোগফল
বর্ণনা: এখানে, স্ট্রিমটি ৫ সেকেন্ডের টাম্বলিং উইন্ডোতে ভাগ করা হয়েছে এবং প্রতিটি উইন্ডোতে একটি নির্দিষ্ট কী অনুযায়ী দ্বিতীয় ফিল্ডের মানগুলো যোগ করা হয়েছে।
DataStream<Tuple2<String, Integer>> stream = ...;
// ১০ সেকেন্ডের স্লাইডিং উইন্ডো যা ৫ সেকেন্ডে স্লাইড করে
DataStream<Tuple2<String, Integer>> result = stream
.keyBy(value -> value.f0)
.window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
.sum(1);
বর্ণনা: এখানে, উইন্ডোটি ১০ সেকেন্ডের জন্য খোলা হয় এবং প্রতি ৫ সেকেন্ডে স্লাইড করে। একই ডেটা একাধিক উইন্ডোতে থাকতে পারে যদি তারা ওভারল্যাপ করে।
Count Window হলো একটি উইন্ডো যা ডেটার নির্দিষ্ট সংখ্যার (ইভেন্টের) উপর ভিত্তি করে উইন্ডো তৈরি করে। এটি ডেটা স্ট্রিমকে নির্দিষ্ট ইভেন্ট সংখ্যা পরপর ভাগ করে এবং প্রতিটি উইন্ডোতে নির্দিষ্ট ইভেন্ট সংখ্যা রাখে। Count Window দুই প্রকার হতে পারে:
DataStream<Tuple2<String, Integer>> stream = ...;
// প্রতিটি উইন্ডোতে ১০টি ইভেন্ট
DataStream<Tuple2<String, Integer>> result = stream
.keyBy(value -> value.f0)
.countWindow(10)
.sum(1);
বর্ণনা: এখানে, প্রতিটি উইন্ডোতে ১০টি ইভেন্ট রাখা হয়েছে এবং তারপর একটি অ্যাগ্রিগেশন অপারেশন (যোগফল) প্রয়োগ করা হয়েছে।
DataStream<Tuple2<String, Integer>> stream = ...;
// ১৫টি ইভেন্টের উইন্ডো, যা প্রতি ৫টি ইভেন্ট পরে স্লাইড করে
DataStream<Tuple2<String, Integer>> result = stream
.keyBy(value -> value.f0)
.countWindow(15, 5)
.sum(1);
বর্ণনা: এখানে, উইন্ডোটি ১৫টি ইভেন্ট ধারণ করে এবং প্রতি ৫টি ইভেন্ট পর নতুন উইন্ডো খোলে। এই কারণে একাধিক উইন্ডো ওভারল্যাপ হতে পারে।
Apache Flink-এ Time Window এবং Count Window ব্যবহার করে স্ট্রিম ডেটা প্রসেসিংয়ের সময় ডেটাকে নির্দিষ্ট সময়কাল বা ইভেন্ট সংখ্যা অনুযায়ী ভাগ করে প্রক্রিয়াকরণ করা সম্ভব। টাইম উইন্ডো সাধারণত রিয়েল-টাইম ডেটা এনালাইটিক্স এবং টাইম-বেসড অ্যাগ্রিগেশন করার জন্য উপযুক্ত, যেখানে কাউন্ট উইন্ডো ইভেন্ট-ভিত্তিক প্রসেসিং এবং ব্যাচ অপারেশন করতে সুবিধাজনক।
Apache Flink এ Window Aggregation এবং Window Function স্ট্রিম ডেটা প্রসেসিং-এর ক্ষেত্রে ডেটা এনালাইসিস এবং ট্রান্সফর্মেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ। Flink এ উইন্ডোর মধ্যে অ্যাগ্রিগেশন এবং ফাংশন ব্যবহার করে ডেটা প্রক্রিয়াকরণ করা যায়, যেমন গাণিতিক গণনা (sum, average), জটিল প্রসেসিং, এবং ডেটার ট্রান্সফর্মেশন। Flink এর Window Function গুলো উইন্ডোতে জমা হওয়া ডেটা প্রক্রিয়া করে আউটপুট তৈরি করতে সাহায্য করে।
Window Aggregation এর মাধ্যমে Flink বিভিন্ন ধরনের অ্যাগ্রিগেটিভ অপারেশন করতে পারে, যেমন sum
, min
, max
, average
, এবং কাস্টম অ্যাগ্রিগেশন। Flink এ উইন্ডো অ্যাগ্রিগেশন করার জন্য বেশ কিছু বিল্ট-ইন ফাংশন রয়েছে যা দ্রুত এবং সহজে ডেটা প্রক্রিয়া করতে সহায়ক।
sum()
অ্যাগ্রিগেশনDataStream<Tuple2<String, Integer>> windowCounts = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.sum(1);
উপরের উদাহরণে:
keyBy
অপারেশনের মাধ্যমে কী অনুযায়ী ভাগ করা হয়েছে।sum
ফাংশন ব্যবহার করে দ্বিতীয় ফিল্ডের মানগুলো যোগ করা হয়েছে।min()
: উইন্ডোর মধ্যে সর্বনিম্ন মান প্রদান করে।max()
: উইন্ডোর মধ্যে সর্বাধিক মান প্রদান করে।minBy()
/ maxBy()
: উইন্ডোর মধ্যে নির্দিষ্ট ফিল্ড অনুযায়ী সর্বনিম্ন বা সর্বাধিক রেকর্ড প্রদান করে।Flink এ উইন্ডো ফাংশনগুলি আরও ফ্লেক্সিবল এবং কাস্টম ডেটা প্রসেসিং করার সুযোগ দেয়। প্রধান উইন্ডো ফাংশনগুলোর মধ্যে রয়েছে:
AggregateFunction একটি জেনেরিক এবং ফ্লেক্সিবল উইন্ডো ফাংশন, যা উইন্ডোর মধ্যে অ্যাগ্রিগেশন করতে ব্যবহৃত হয়। এটি ব্যবহার করে কাস্টম অ্যাগ্রিগেশন করা যায় এবং এটি স্টেটফুল অ্যাগ্রিগেশন সাপোর্ট করে।
DataStream<Tuple2<String, Double>> avgStream = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.aggregate(new AverageAggregate());
public class AverageAggregate implements AggregateFunction<Tuple2<String, Integer>, Tuple2<Integer, Integer>, Double> {
@Override
public Tuple2<Integer, Integer> createAccumulator() {
return Tuple2.of(0, 0); // (sum, count)
}
@Override
public Tuple2<Integer, Integer> add(Tuple2<String, Integer> value, Tuple2<Integer, Integer> accumulator) {
return Tuple2.of(accumulator.f0 + value.f1, accumulator.f1 + 1);
}
@Override
public Double getResult(Tuple2<Integer, Integer> accumulator) {
return accumulator.f1 == 0 ? 0 : (double) accumulator.f0 / accumulator.f1;
}
@Override
public Tuple2<Integer, Integer> merge(Tuple2<Integer, Integer> a, Tuple2<Integer, Integer> b) {
return Tuple2.of(a.f0 + b.f0, a.f1 + b.f1);
}
}
উপরের উদাহরণে:
AverageAggregate
ক্লাস তৈরি করা হয়েছে যা উইন্ডোর মধ্যে গড় (average) গণনা করে।createAccumulator
একটি অ্যাকুমুলেটর তৈরি করে যা উইন্ডোর জন্য স্টেট ধরে রাখে।add
মেথডটি নতুন মান অ্যাকুমুলেটরের সাথে যোগ করে।getResult
অ্যাকুমুলেটরের থেকে গড় বের করে।merge
মেথডটি অ্যাকুমুলেটরগুলিকে মার্জ করে (যদি উইন্ডো পার্টিশনিং প্রয়োজন হয়)।ProcessWindowFunction সবচেয়ে ফ্লেক্সিবল উইন্ডো ফাংশন, যা উইন্ডোর সমস্ত ইভেন্ট প্রসেস করে এবং আরও কাস্টম অপারেশন করতে দেয়। এটি উইন্ডোর মেটাডেটা, যেমন উইন্ডোর শুরু এবং শেষ সময় ব্যবহার করে আরও জটিল অপারেশন করতে সক্ষম।
DataStream<Tuple2<String, Integer>> result = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.process(new ProcessWindowFunction<Tuple2<String, Integer>, Tuple2<String, Integer>, String, TimeWindow>() {
@Override
public void process(String key, Context context, Iterable<Tuple2<String, Integer>> elements, Collector<Tuple2<String, Integer>> out) {
int sum = 0;
for (Tuple2<String, Integer> element : elements) {
sum += element.f1;
}
out.collect(new Tuple2<>(key, sum));
}
});
এই উদাহরণে:
ProcessWindowFunction
ব্যবহার করা হয়েছে যাতে উইন্ডোর সব ইভেন্ট প্রসেস করা যায়।process
মেথডটি উইন্ডোর প্রতিটি কী এবং ইভেন্টের ইটারেবল প্রসেস করে এবং ফলাফল সংগ্রহ করে।ReduceFunction উইন্ডোর মধ্যে ডেটা রিডিউস করে একটি সিঙ্গেল ভ্যালুতে পরিণত করে। এটি সাধারণত অ্যাগ্রিগেশন ও ট্রান্সফর্মেশনের জন্য ব্যবহৃত হয়।
DataStream<Tuple2<String, Integer>> reducedStream = input
.keyBy(value -> value.f0)
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
.reduce(new ReduceFunction<Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) {
return new Tuple2<>(value1.f0, value1.f1 + value2.f1);
}
});
এই উদাহরণে, ReduceFunction
ব্যবহার করে উইন্ডোর মধ্যে প্রতিটি কী অনুযায়ী ইভেন্টের মান যোগ করা হচ্ছে।
Apache Flink এ Window Aggregation এবং Window Function স্ট্রিম ডেটা প্রসেসিং এবং ডেটা ট্রান্সফর্মেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ। এগুলো ডেভেলপারদের ডেটা এনালাইসিস, ট্রান্সফর্মেশন, এবং কাস্টম প্রসেসিং-এর জন্য উপযোগী টুলস প্রদান করে, যা বড় এবং জটিল ডেটাসেটের সাথে কাজ করার সময় কার্যকরী হয়।
Apache Flink-এ Tumbling, Sliding, এবং Session উইন্ডো খুবই গুরুত্বপূর্ণ, কারণ তারা স্ট্রিম ডেটা প্রসেসিংয়ে ডেটাকে গ্রুপ করে এবং নির্দিষ্ট সময় বা ইভেন্টের ভিত্তিতে ডেটার উপর অপারেশন চালাতে সাহায্য করে। নিচে প্রতিটি উইন্ডোর উদাহরণসহ ব্যাখ্যা দেয়া হলো।
Tumbling Windows হলো একটি ফিক্সড-সাইজ উইন্ডো যা নির্দিষ্ট সময়ের জন্য ডেটা গ্রুপ করে এবং ওভারল্যাপ ছাড়াই কাজ করে। প্রতিটি উইন্ডো একটি নির্দিষ্ট সময় পর বন্ধ হয় এবং পরবর্তী উইন্ডো শুরু হয়।
ধরা যাক, আমাদের একটি স্ট্রিম আছে যেখানে আমরা প্রতি ১০ সেকেন্ডে ডেটা প্রসেস করতে চাই। আমরা TumblingEventTimeWindows
ব্যবহার করে প্রতিটি ১০ সেকেন্ডের উইন্ডোতে ডেটা গ্রুপ করবো।
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
public class TumblingWindowExample {
public static void main(String[] args) throws Exception {
// Execution Environment তৈরি করা
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Data Stream পড়া
DataStream<String> stream = env.socketTextStream("localhost", 9999);
// Tumbling Window ব্যবহার করে প্রসেসিং
stream
.map(value -> new Event(value))
.keyBy(event -> event.getKey())
.window(TumblingEventTimeWindows.of(Time.seconds(10))) // ১০ সেকেন্ডের উইন্ডো
.sum("value") // 'value' ফিল্ডের উপর অপারেশন
.print();
env.execute("Tumbling Window Example");
}
}
TumblingEventTimeWindows.of(Time.seconds(10))
দিয়ে ১০ সেকেন্ডের একটি ফিক্সড উইন্ডো তৈরি করা হয়েছে।Sliding Windows হলো এমন উইন্ডো যা একটি নির্দিষ্ট ইন্টারভাল ধরে উইন্ডো স্লাইড করে। এতে উইন্ডোগুলো ওভারল্যাপ করতে পারে। Sliding উইন্ডোতে একটি উইন্ডোর দৈর্ঘ্য এবং স্লাইড করার ইন্টারভাল নির্ধারণ করতে হয়।
ধরা যাক, আমাদের ১৫ সেকেন্ডের একটি উইন্ডো দরকার যা প্রতি ৫ সেকেন্ডে স্লাইড করবে।
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.assigners.SlidingEventTimeWindows;
public class SlidingWindowExample {
public static void main(String[] args) throws Exception {
// Execution Environment তৈরি করা
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Data Stream পড়া
DataStream<String> stream = env.socketTextStream("localhost", 9999);
// Sliding Window ব্যবহার করে প্রসেসিং
stream
.map(value -> new Event(value))
.keyBy(event -> event.getKey())
.window(SlidingEventTimeWindows.of(Time.seconds(15), Time.seconds(5))) // ১৫ সেকেন্ডের উইন্ডো, ৫ সেকেন্ডের স্লাইড
.sum("value") // 'value' ফিল্ডের উপর অপারেশন
.print();
env.execute("Sliding Window Example");
}
}
SlidingEventTimeWindows.of(Time.seconds(15), Time.seconds(5))
দিয়ে ১৫ সেকেন্ডের উইন্ডো তৈরি করা হয়েছে, যা প্রতি ৫ সেকেন্ডে স্লাইড করে।Session Windows হলো এমন উইন্ডো যা ইভেন্টের inactivity gap বা session gap এর উপর নির্ভর করে। দুটি ইভেন্টের মধ্যে একটি নির্দিষ্ট সময়ের বেশি গ্যাপ থাকলে নতুন উইন্ডো শুরু হয়।
ধরা যাক, আমাদের একটি স্ট্রিম রয়েছে এবং আমরা চাই যে যদি দুটি ইভেন্টের মধ্যে ৩০ সেকেন্ডের বেশি গ্যাপ থাকে, তাহলে একটি নতুন সেশন উইন্ডো শুরু হবে।
import org.apache.flink.streaming.api.windowing.assigners.EventTimeSessionWindows;
public class SessionWindowExample {
public static void main(String[] args) throws Exception {
// Execution Environment তৈরি করা
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Data Stream পড়া
DataStream<String> stream = env.socketTextStream("localhost", 9999);
// Session Window ব্যবহার করে প্রসেসিং
stream
.map(value -> new Event(value))
.keyBy(event -> event.getKey())
.window(EventTimeSessionWindows.withGap(Time.seconds(30))) // ৩০ সেকেন্ডের সেশন গ্যাপ
.sum("value") // 'value' ফিল্ডের উপর অপারেশন
.print();
env.execute("Session Window Example");
}
}
EventTimeSessionWindows.withGap(Time.seconds(30))
ব্যবহার করে ৩০ সেকেন্ডের inactivity gap ভিত্তিতে সেশন উইন্ডো তৈরি করা হয়েছে।এই উইন্ডো মেকানিজমগুলো স্ট্রিম ডেটা প্রসেসিং এবং real-time analytics অ্যাপ্লিকেশনের জন্য অত্যন্ত কার্যকরী, যা Flink-কে একটি শক্তিশালী স্ট্রিম প্রসেসিং টুল হিসেবে প্রমাণ করে।