Apache Storm একটি রিয়েল-টাইম ডিসট্রিবিউটেড ডেটা প্রসেসিং সিস্টেম, যা বৃহৎ পরিমাণে ডেটা স্ট্রিম এবং দ্রুত প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। Storm বিভিন্ন ডেটা সোর্স এবং স্টোরেজ সিস্টেমের সাথে ইন্টিগ্রেট হতে পারে, যার মধ্যে HDFS (Hadoop Distributed File System) অন্যতম। HDFS সাধারণত বড় ডেটা সেট সংরক্ষণ এবং প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Storm এবং HDFS একে অপরের সাথে ইন্টিগ্রেট করলে রিয়েল-টাইম ডেটা প্রসেসিং এবং বিশ্লেষণ আরও দক্ষভাবে করা যায়।
এই টিউটোরিয়ালে, আমরা HDFS থেকে ডেটা পড়া এবং লিখা সম্পর্কে জানব, যা Storm এর সাথে ইন্টিগ্রেট করা যায়।
HDFS (Hadoop Distributed File System) এর ভূমিকা
HDFS হলো একটি ডিস্ট্রিবিউটেড ফাইল সিস্টেম যা হাডুপ (Hadoop) ইকোসিস্টেমের একটি অংশ। এটি বড় আকারের ডেটা সেট সংরক্ষণ করার জন্য ব্যবহৃত হয় এবং ডেটা সঞ্চয়ের জন্য ব্লক ভিত্তিক (block-based) আর্কিটেকচার ব্যবহার করে। HDFS বড় পরিমাণের ডেটা স্টোর এবং প্রসেস করার জন্য সিস্টেমকে স্কেলযোগ্য এবং ফল্ট টলারেন্ট করে তোলে।
Storm যখন HDFS-এ ডেটা পড়ে বা লেখে, তখন এটি Spout এবং Bolt কম্পোনেন্ট ব্যবহার করে ডেটা প্রবাহ তৈরি করে, যাতে ডেটার প্রক্রিয়াকরণ এবং সংরক্ষণ একটি সংগঠিত এবং সুষম উপায়ে করা যায়।
HDFS থেকে Data Read করা
Storm-এ HDFS থেকে ডেটা পড়তে, Spout ব্যবহার করা হয়। Spout Storm এর একটি কম্পোনেন্ট যা ডেটা উৎস থেকে ডেটা সংগ্রহ করে এবং পরবর্তী প্রক্রিয়াকরণের জন্য তা পাঠায়।
Spout ব্যবহার করে HDFS থেকে ডেটা পড়ার পদক্ষেপ:
- HDFS Client Setup: প্রথমে, আপনাকে HDFS ক্লায়েন্ট কনফিগার করতে হবে, যাতে Storm আপনার HDFS ফাইল সিস্টেমে সংযোগ স্থাপন করতে পারে। HDFS ক্লায়েন্ট কনফিগারেশনে hdfs-site.xml এবং core-site.xml ফাইল অন্তর্ভুক্ত করা হয়।
- Custom Spout তৈরি: আপনি একটি কাস্টম Spout তৈরি করতে পারেন যা HDFS থেকে ডেটা পড়বে। এটি HDFS থেকে ফাইল পড়ে, লাইন বা ডেটার অংশ পাঠাবে Storm টপোলজিতে।
- HDFS থেকে ডেটা ফাইল পড়া: Spout হিডেন ডিরেক্টরি বা ফাইল থেকে ডেটা নিয়ে আসে এবং Storm টপোলজিতে পাঠায়।
উদাহরণ (HDFS Spout):
public class HdfsSpout extends BaseRichSpout {
private SpoutOutputCollector collector;
private FileSystem fs;
private Path path;
private BufferedReader reader;
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
Configuration hdfsConf = new Configuration();
fs = FileSystem.get(URI.create("hdfs://namenode_host:9000"), hdfsConf);
path = new Path("/user/hdfs/input/datafile.txt");
try {
reader = new BufferedReader(new InputStreamReader(fs.open(path)));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void nextTuple() {
String line = null;
try {
if ((line = reader.readLine()) != null) {
collector.emit(new Values(line)); // Emit line as a tuple
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void close() {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));
}
}
এই কোডের মাধ্যমে HdfsSpout HDFS থেকে একটি ফাইল পড়ে প্রতিটি লাইন একটি Tuple হিসেবে Storm টপোলজিতে পাঠায়।
HDFS-এ Data Write করা
Storm টপোলজি দিয়ে HDFS-এ ডেটা লেখার জন্য, Bolt ব্যবহার করা হয়। Bolt কম্পোনেন্টটি ডেটা প্রসেস করে এবং HDFS-এ লিখে।
Bolt ব্যবহার করে HDFS-এ ডেটা লেখার পদক্ষেপ:
- HDFS File Writer Setup: HDFS-এ ডেটা লেখার জন্য HDFS ক্লায়েন্ট কনফিগার করতে হবে, যাতে Storm HDFS-এ সংযোগ স্থাপন করতে পারে।
- Custom Bolt তৈরি: একটি কাস্টম Bolt তৈরি করতে হবে যা Storm থেকে প্রাপ্ত ডেটাকে HDFS-এ লেখে।
- Write Data to HDFS: Bolt ডেটা প্রক্রিয়া করার পর, HDFS-এ একটি ফাইল তৈরি বা আপডেট করে ডেটা লেখে।
উদাহরণ (HDFS Bolt):
public class HdfsBolt extends BaseBasicBolt {
private FileSystem fs;
private Path outputPath;
private BufferedWriter writer;
@Override
public void prepare(Map stormConf, TopologyContext context) {
Configuration hdfsConf = new Configuration();
try {
fs = FileSystem.get(URI.create("hdfs://namenode_host:9000"), hdfsConf);
outputPath = new Path("/user/hdfs/output/outputfile.txt");
writer = new BufferedWriter(new OutputStreamWriter(fs.create(outputPath, true)));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void execute(Tuple tuple) {
String line = tuple.getStringByField("line");
try {
writer.write(line);
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void cleanup() {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
এই কোডের মাধ্যমে HdfsBolt Storm টপোলজি থেকে প্রাপ্ত প্রতিটি Tuple (লাইনের তথ্য) HDFS-এ একটি ফাইলে লিখবে।
Storm টপোলজিতে HDFS Spout এবং Bolt ইন্টিগ্রেশন
Storm টপোলজিতে Spout এবং Bolt ইন্টিগ্রেট করার মাধ্যমে HDFS থেকে ডেটা পড়া এবং লিখা সম্ভব। টপোলজি চালানোর সময়, আপনি HDFS Spout ব্যবহার করে ডেটা পড়তে পারেন এবং HDFS Bolt ব্যবহার করে প্রক্রিয়া করা ডেটা HDFS-এ সংরক্ষণ করতে পারেন।
উদাহরণ (Storm Topology):
public class HdfsTopology {
public static void main(String[] args) throws Exception {
Config conf = new Config();
conf.setDebug(true);
// Create a topology builder
TopologyBuilder builder = new TopologyBuilder();
// Set the Spout
builder.setSpout("hdfs-spout", new HdfsSpout(), 1);
// Set the Bolt
builder.setBolt("hdfs-bolt", new HdfsBolt(), 1).shuffleGrouping("hdfs-spout");
// Submit the topology
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("hdfs-topology", conf, builder.createTopology());
// Run for a while then stop
Thread.sleep(10000);
cluster.shutdown();
}
}
এই টপোলজির মাধ্যমে, Storm HDFS থেকে ডেটা পড়বে এবং HDFS-এ আবার লেখার কাজ করবে।
সারাংশ
Apache Storm HDFS-এর সাথে ইন্টিগ্রেশন করতে পারে, যা রিয়েল-টাইম ডেটা প্রসেসিং এবং বিশ্লেষণে সহায়ক। Spout ব্যবহার করে HDFS থেকে ডেটা পড়া এবং Bolt ব্যবহার করে HDFS-এ ডেটা লেখা সম্ভব। Storm এবং HDFS-এর এই ইন্টিগ্রেশন ডিস্ট্রিবিউটেড ডেটা প্রসেসিং সিস্টেমের শক্তি বাড়ায় এবং বৃহৎ ডেটা সেটে দ্রুত কাজ করার ক্ষমতা প্রদান করে।
Read more