অ্যাপাচি স্পার্ক (Apache Spark) হল একটি ওপেন-সোর্স, ডিস্ট্রিবিউটেড কম্পিউটিং সিস্টেম যা বড় ডেটাসেটের দ্রুত প্রসেসিং এবং অ্যানালাইসিসের জন্য ব্যবহৃত হয়। এটি মূলত batch processing এবং streaming ডেটা প্রসেসিংয়ের জন্য ডিজাইন করা হয়েছে, এবং দ্রুত পারফরম্যান্সের জন্য in-memory processing ব্যবহার করে। স্পার্কের কার্যকারিতা এবং স্কেলেবিলিটি তার execution model এবং DAG (Directed Acyclic Graph) এর উপর নির্ভরশীল, যা ডিস্ট্রিবিউটেড ডেটা প্রসেসিংয়ের কার্যকরী উপায় প্রদান করে।
এই টিউটোরিয়ালে আমরা Spark Execution Model এবং Directed Acyclic Graph (DAG) এর ভূমিকা এবং এর কার্যপ্রণালী বিশ্লেষণ করব।
Spark Execution Model
স্পার্কের execution model হল সেই প্রক্রিয়া যার মাধ্যমে স্পার্ক ডেটা প্রসেসিং সম্পাদন করে। এটি Resilient Distributed Dataset (RDD) এবং DAG এর সাহায্যে ডেটা প্রসেসিংয়ের কাজ করে।
Key Components of Spark Execution Model:
RDD (Resilient Distributed Dataset): RDD হল স্পার্কের মৌলিক ডেটা স্ট্রাকচার, যা ডিস্ট্রিবিউটেড ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। RDD হলো একটি ইম্যুটেবল এবং পারালালেল ডেটা স্ট্রাকচার, যা স্পার্ক ক্লাস্টারে ডিস্ট্রিবিউটেড থাকে এবং প্রতিটি রেকর্ডকে পারালালেল প্রসেস করা হয়।
RDD মূলত দুটি অপারেশন সাপোর্ট করে:
- Transformations: যেমন
map,filter,flatMap(যা একটি নতুন RDD তৈরি করে)। - Actions: যেমন
collect,count,save(যা RDD থেকে ডেটা বের করে এবং অপারেশন চালায়)।
- Transformations: যেমন
- DAG (Directed Acyclic Graph): স্পার্কের DAG এর মাধ্যমে, স্পার্ক কাজের সমস্ত স্টেপগুলিকে একটি গ্রাফে রূপান্তরিত করে। এটি একটি directed acyclic graph (অর্থাৎ, যেখানে কোন সাইকেল নেই) যা স্পার্কের job এবং stage গুলির মধ্যে সম্পর্ক স্থাপন করে।
- Stages: স্পার্কের কাজটি সাধারণত একাধিক stages এ ভাগ করা হয়, যেখানে প্রতিটি stage একটি নির্দিষ্ট সেট ট্রান্সফর্মেশন এবং অ্যাকশন নিয়ে কাজ করে। স্টেজগুলোকে DAG এর মধ্যে সঠিকভাবে সাজানো হয়।
- Task: প্রতিটি stage ডিভাইড করা হয় ছোট ছোট tasks এ, যা স্পার্কের বিভিন্ন কাজের অংশ হিসেবে কাজ করে। প্রতিটি task ক্লাস্টারের এক বা একাধিক নোডে এক্সিকিউট হয়।
Directed Acyclic Graph (DAG)
DAG স্পার্কের মধ্যে ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত গ্রাফ, যা স্পার্কের সমস্ত ট্রান্সফর্মেশন এবং অ্যাকশনের মধ্যে সম্পর্ক স্থাপন করে। স্পার্কের DAG execution model ক্লাস্টারের নোডগুলোর মধ্যে কাজ ভাগ করে দেয় এবং তাদের মধ্যে নির্ভরতা তৈরি করে।
How DAG Works in Spark Execution:
- DAG Creation: স্পার্ক যখন একটি action (যেমন
collect,count,save) চালায়, তখন স্পার্ক একটি DAG তৈরি করে যা সমস্ত পূর্ববর্তী transformation গুলির মধ্যে সম্পর্ক এবং নির্ভরতা বিশ্লেষণ করে। DAG স্পার্ককে জানায় যে কোন কাজগুলি একে অপরের উপর নির্ভরশীল এবং কোন কাজগুলো সমান্তরালভাবে চলতে পারে। - Stages and Tasks: DAG তৈরি হওয়ার পর, এটি stages এ ভাগ করা হয়। প্রতিটি stage এক বা একাধিক tasks এ বিভক্ত হয়, যা একাধিক ক্লাস্টার নোডে এক্সিকিউট হতে পারে। স্টেজগুলোকে রূপান্তরিত এবং নির্বাহিত করার জন্য DAG এই নির্ভরতার উপর ভিত্তি করে একটি সুনির্দিষ্ট অর্ডারে কাজ করে।
- Task Scheduling: স্পার্ক DAG scheduler এর মাধ্যমে task গুলোকে ক্লাস্টারের বিভিন্ন এক্সিকিউটর নোডে শিডিউল করে। একেকটি task বিভিন্ন মেশিনের মধ্যে প্রসেসিংয়ের জন্য বিতরণ করা হয়।
- Fault Tolerance: স্পার্ক DAG ব্যবস্থার মাধ্যমে ফোল্ট টলারেন্স নিশ্চিত করে। যদি কোনো task ফেইল করে, তবে স্পার্ক DAG থেকে ওই task এর জন্য আগের প্রয়োজনীয় ইনপুট পুনরায় প্রক্রিয়া করতে পারে এবং তা পুনরায় চালাতে পারে।
DAG Execution Flow
স্পার্কের DAG execution ফ্লো কীভাবে কাজ করে, তা নিম্নলিখিতভাবে ব্যাখ্যা করা যেতে পারে:
- Transformation: স্পার্কের ট্রান্সফর্মেশনগুলি যেমন
map,filter,flatMapইত্যাদি একটি নতুন RDD তৈরি করে, তবে তারা lazy evaluation এ চলে, অর্থাৎ তারা তখন পর্যন্ত কার্যকরী হয় না যতক্ষণ না অ্যাকশন চালানো হয়। - Action: অ্যাকশন (যেমন
collect,count) এর মাধ্যমে স্পার্ক এই সমস্ত ট্রান্সফর্মেশনগুলিকে একত্রে নিয়ে DAG তৈরি করে এবং সেই DAG এর ভিত্তিতে কাজের স্টেজ ও টাস্কের পরিকল্পনা করে। - Job and Stages: স্পার্ক সমস্ত ট্রান্সফর্মেশনগুলিকে একত্রিত করে job এ রূপান্তরিত করে এবং কাজের মধ্যে স্টেজে ভাগ করে দেয়।
- Task Execution: প্রতিটি স্টেজ থেকে টাস্ক তৈরি হয়, যা একাধিক executors এ চলতে থাকে। এই টাস্কগুলি নির্ধারিত স্টেপ অনুসারে সমান্তরালভাবে বা সিরিয়ালভাবে রান হয়।
Spark DAG Example
ধরা যাক, আমাদের একটি ডেটাসেট আছে যা আমরা কিছু ট্রান্সফর্মেশন এবং অ্যাকশন প্রয়োগ করতে চাই।
from pyspark import SparkContext
sc = SparkContext("local", "DAG Example")
# Create an RDD
rdd = sc.parallelize([1, 2, 3, 4, 5])
# Apply transformations
rdd2 = rdd.map(lambda x: x * 2) # map transformation
rdd3 = rdd2.filter(lambda x: x > 5) # filter transformation
# Perform an action
result = rdd3.collect() # collect action
print(result)
DAG Flow:
- map(x * 2): প্রথমে map ট্রান্সফর্মেশন করা হবে, যেখানে ডেটা দুটি গুণ হয়ে যাবে।
- filter(x > 5): তারপর, filter ট্রান্সফর্মেশন হবে যেখানে শুধুমাত্র ৫ এর বেশি মান রাখা হবে।
- collect(): অবশেষে collect() অ্যাকশন চালানো হবে, যা ফলাফলগুলো সংগ্রহ করবে।
DAG Execution Breakdown:
- Stage 1:
mapট্রান্সফর্মেশন সম্পন্ন হবে। - Stage 2:
filterট্রান্সফর্মেশন সম্পন্ন হবে। - Action:
collect()অ্যাকশন ফলাফল সংগ্রহ করবে।
Advantages of DAG in Spark
- Optimized Execution: DAG এর মাধ্যমে স্পার্ক স্বয়ংক্রিয়ভাবে তার ট্রান্সফর্মেশনগুলির মধ্যে নির্ভরতা চিহ্নিত করে এবং অপ্টিমাইজড ও ফ্লেক্সিবল এক্সিকিউশন পরিকল্পনা তৈরি করে।
- Fault Tolerance: ডিএজি ফেইল হওয়ার জন্য নির্দিষ্ট টাস্ক পুনরায় শুরু করতে সক্ষম করে, যা স্পার্ককে ফোল্ট টলারেন্ট এবং নির্ভরযোগ্য করে তোলে।
- Task Parallelism: DAG এর মাধ্যমে সমান্তরাল কাজের জন্য নির্দিষ্ট স্টেজের টাস্কগুলি একাধিক এক্সিকিউটরে বিতরণ করা যায়, যা প্রসেসিংয়ের গতি এবং স্কেলেবিলিটি বৃদ্ধি করে।
Conclusion
স্পার্কের execution model এবং Directed Acyclic Graph (DAG) সিস্টেমটি স্পার্কের শক্তিশালী ডিস্ট্রিবিউটেড প্রসেসিং ক্ষমতার মূল ভিত্তি। DAG এর মাধ্যমে স্পার্ক তার সমস্ত ট্রান্সফর্মেশন এবং অ্যাকশনকে নির্ভরতার ভিত্তিতে এক্সিকিউট করে এবং কর্মক্ষমতা বৃদ্ধি করার জন্য স্বয়ংক্রিয়ভাবে কাজের পরিকল্পনা তৈরি করে। এটি fault tolerance, task parallelism, এবং optimized execution নিশ্চিত করে, যা স্পার্ককে একটি অত্যন্ত স্কেলেবল এবং কার্যকরী সিস্টেমে পরিণত করে।
Read more