1. সংক্ষিপ্ত বিবরণ
এই কোডল্যাবটি গুগল ক্লাউড প্ল্যাটফর্মে ডেটাপ্রোক ব্যবহার করে অ্যাপাচি স্পার্ক ব্যবহার করে কীভাবে একটি ডেটা প্রসেসিং পাইপলাইন তৈরি করতে হয় তা নিয়ে আলোচনা করবে। ডেটা সায়েন্স এবং ডেটা ইঞ্জিনিয়ারিংয়ে এটি একটি সাধারণ ব্যবহারের ক্ষেত্রে, একটি স্টোরেজ লোকেশন থেকে ডেটা পড়া, তাতে রূপান্তর করা এবং অন্য স্টোরেজ লোকেশনে লেখা। সাধারণ রূপান্তরের মধ্যে রয়েছে ডেটার বিষয়বস্তু পরিবর্তন করা, অপ্রয়োজনীয় তথ্য বাদ দেওয়া এবং ফাইলের ধরণ পরিবর্তন করা।
এই কোডল্যাবে, আপনি Apache Spark সম্পর্কে শিখবেন, PySpark (Apache Spark এর Python API), BigQuery , Google Cloud Storage এবং Reddit থেকে ডেটা ব্যবহার করে Dataproc ব্যবহার করে একটি নমুনা পাইপলাইন চালাবেন।
২. অ্যাপাচি স্পার্কের ভূমিকা (ঐচ্ছিক)
ওয়েবসাইট অনুসারে, " অ্যাপাচি স্পার্ক হল বৃহৎ-স্কেল ডেটা প্রক্রিয়াকরণের জন্য একটি সমন্বিত বিশ্লেষণ ইঞ্জিন।" এটি আপনাকে সমান্তরাল এবং মেমোরিতে ডেটা বিশ্লেষণ এবং প্রক্রিয়া করতে দেয়, যা একাধিক বিভিন্ন মেশিন এবং নোড জুড়ে বিশাল সমান্তরাল গণনার অনুমতি দেয়। এটি মূলত 2014 সালে ঐতিহ্যবাহী MapReduce- এ আপগ্রেড হিসাবে প্রকাশিত হয়েছিল এবং এখনও বৃহৎ-স্কেল গণনা সম্পাদনের জন্য সবচেয়ে জনপ্রিয় ফ্রেমওয়ার্কগুলির মধ্যে একটি। অ্যাপাচি স্পার্ক স্কালায় লেখা এবং পরবর্তীতে স্কালা, জাভা, পাইথন এবং আর-তে API রয়েছে। এতে ডেটাতে SQL কোয়েরি সম্পাদনের জন্য Spark SQL , স্ট্রিমিং ডেটার জন্য Spark Streaming , মেশিন লার্নিংয়ের জন্য MLlib এবং গ্রাফ প্রক্রিয়াকরণের জন্য GraphX এর মতো প্রচুর লাইব্রেরি রয়েছে, যার সবকটিই Apache Spark ইঞ্জিনে চলে।

স্পার্ক নিজে নিজে চলতে পারে অথবা স্কেলিং এর জন্য Yarn , Mesos অথবা Kubernetes এর মতো রিসোর্স ম্যানেজমেন্ট সার্ভিস ব্যবহার করতে পারে। আপনি এই কোডল্যাবের জন্য Dataproc ব্যবহার করবেন, যা Yarn ব্যবহার করে।
স্পার্কের ডেটা মূলত মেমোরিতে লোড করা হত যাকে RDD বা রেজিলিয়েন্ট ডিস্ট্রিবিউটেড ডেটাসেট বলা হয়। স্পার্কের ডেভেলপমেন্টে এরপর থেকে দুটি নতুন, কলামার-স্টাইলের ডেটা টাইপ যুক্ত করা হয়েছে: ডেটাসেট, যা টাইপ করা হয় এবং ডেটাফ্রেম, যা টাইপ করা হয় না। সহজভাবে বলতে গেলে, RDD যেকোনো ধরণের ডেটার জন্য দুর্দান্ত, যেখানে ডেটাসেট এবং ডেটাফ্রেম ট্যাবুলার ডেটার জন্য অপ্টিমাইজ করা হয়। যেহেতু ডেটাসেটগুলি শুধুমাত্র জাভা এবং স্কালা API-এর সাথে উপলব্ধ, তাই আমরা এই কোডল্যাবের জন্য PySpark ডেটাফ্রেম API ব্যবহার করে এগিয়ে যাব। আরও তথ্যের জন্য, অনুগ্রহ করে Apache Spark ডকুমেন্টেশন দেখুন।
৩. ব্যবহারের ধরণ
ডেটা ইঞ্জিনিয়ারদের প্রায়শই ডেটা বিজ্ঞানীদের কাছে সহজে অ্যাক্সেসযোগ্য করার জন্য ডেটার প্রয়োজন হয়। তবে, ডেটা প্রায়শই প্রাথমিকভাবে নোংরা থাকে (বর্তমান অবস্থায় বিশ্লেষণের জন্য ব্যবহার করা কঠিন) এবং এটি খুব বেশি কাজে লাগানোর আগে পরিষ্কার করার প্রয়োজন হয়। এর একটি উদাহরণ হল এমন ডেটা যা ওয়েব থেকে স্ক্র্যাপ করা হয়েছে যাতে অদ্ভুত এনকোডিং বা বহিরাগত HTML ট্যাগ থাকতে পারে।
এই ল্যাবে, আপনি BigQuery থেকে Reddit পোস্টের আকারে ডেটাপ্রোকে হোস্ট করা একটি স্পার্ক ক্লাস্টারে ডেটার একটি সেট লোড করবেন, দরকারী তথ্য বের করবেন এবং প্রক্রিয়াজাত ডেটা জিপ করা CSV ফাইল হিসাবে Google ক্লাউড স্টোরেজে সংরক্ষণ করবেন।

আপনার কোম্পানির প্রধান ডেটা বিজ্ঞানী তাদের দলগুলিকে বিভিন্ন প্রাকৃতিক ভাষা প্রক্রিয়াকরণ সমস্যা নিয়ে কাজ করতে আগ্রহী। বিশেষ করে, তারা সাবরেডিট "r/food"-এ ডেটা বিশ্লেষণ করতে আগ্রহী। আপনি জানুয়ারী ২০১৭ থেকে আগস্ট ২০১৯ পর্যন্ত ব্যাকফিল দিয়ে শুরু করে একটি ডেটা ডাম্পের জন্য একটি পাইপলাইন তৈরি করবেন।
৪. BigQuery স্টোরেজ API এর মাধ্যমে BigQuery অ্যাক্সেস করা
tabledata.list API পদ্ধতি ব্যবহার করে BigQuery থেকে ডেটা সংগ্রহ করা সময়সাপেক্ষ এবং ডেটা স্কেলের পরিমাণের কারণে কার্যকর নয়। এই পদ্ধতিটি JSON অবজেক্টের একটি তালিকা প্রদান করে এবং একটি সম্পূর্ণ ডেটাসেট পড়ার জন্য ধারাবাহিকভাবে একটি পৃষ্ঠা পড়তে হয়।
BigQuery স্টোরেজ API একটি RPC-ভিত্তিক প্রোটোকল ব্যবহার করে BigQuery-তে ডেটা অ্যাক্সেস করার ক্ষেত্রে উল্লেখযোগ্য উন্নতি এনেছে। এটি সমান্তরালভাবে ডেটা পঠন এবং লেখার পাশাপাশি Apache Avro এবং Apache Arrow- এর মতো বিভিন্ন সিরিয়ালাইজেশন ফর্ম্যাট সমর্থন করে। উচ্চ-স্তরে, এটি উল্লেখযোগ্যভাবে উন্নত কর্মক্ষমতা প্রদান করে, বিশেষ করে বৃহত্তর ডেটা সেটগুলিতে।
এই কোডল্যাবে আপনি BigQuery এবং Spark এর মধ্যে ডেটা পড়ার এবং লেখার জন্য spark-bigquery-connector ব্যবহার করবেন।
৫. একটি প্রকল্প তৈরি করা
console.cloud.google.com- এ Google Cloud Platform কনসোলে সাইন ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন:



এরপর, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে।
এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হবে না, তবে আপনি যদি আরও বেশি রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলি চালিয়ে যেতে দেন তবে এটি আরও বেশি হতে পারে। এই কোডল্যাবের শেষ অংশটি আপনাকে আপনার প্রকল্পটি পরিষ্কার করার কাজে সাহায্য করবে।
গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা $300 এর বিনামূল্যে ট্রায়ালের জন্য যোগ্য।
৬. আপনার পরিবেশ ঠিক করা
এখন আপনি আপনার পরিবেশ সেট আপ করার কাজটি এইভাবে করবেন:
- কম্পিউট ইঞ্জিন, ডেটাপ্রোক এবং বিগকুয়েরি স্টোরেজ এপিআই সক্রিয় করা
- প্রকল্প সেটিংস কনফিগার করা হচ্ছে
- একটি Dataproc ক্লাস্টার তৈরি করা হচ্ছে
- একটি গুগল ক্লাউড স্টোরেজ বাকেট তৈরি করা হচ্ছে
API সক্রিয় করা এবং আপনার পরিবেশ কনফিগার করা
আপনার ক্লাউড কনসোলের উপরের ডানদিকের কোণায় থাকা বোতামটি টিপে ক্লাউড শেলটি খুলুন।

ক্লাউড শেল লোড হওয়ার পরে, কম্পিউট ইঞ্জিন, ডেটাপ্রোক এবং বিগকুয়েরি স্টোরেজ এপিআই সক্ষম করতে নিম্নলিখিত কমান্ডগুলি চালান:
gcloud services enable compute.googleapis.com \
dataproc.googleapis.com \
bigquerystorage.googleapis.com
আপনার প্রকল্পের প্রকল্প আইডি সেট করুন। আপনি প্রকল্প নির্বাচন পৃষ্ঠায় গিয়ে আপনার প্রকল্পটি অনুসন্ধান করে এটি খুঁজে পেতে পারেন। এটি আপনার প্রকল্পের নামের সাথে এক নাও হতে পারে।


আপনার প্রকল্প আইডি সেট করতে নিম্নলিখিত কমান্ডটি চালান:
gcloud config set project <project_id>
এখানে তালিকা থেকে একটি বেছে নিয়ে আপনার প্রকল্পের অঞ্চল নির্ধারণ করুন। একটি উদাহরণ হতে পারে us-central1 ।
gcloud config set dataproc/region <region>
আপনার Dataproc ক্লাস্টারের জন্য একটি নাম নির্বাচন করুন এবং এর জন্য একটি পরিবেশ পরিবর্তনশীল তৈরি করুন।
CLUSTER_NAME=<cluster_name>
একটি ডেটাপ্রোক ক্লাস্টার তৈরি করা
নিম্নলিখিত কমান্ডটি কার্যকর করে একটি Dataproc ক্লাস্টার তৈরি করুন:
gcloud beta dataproc clusters create ${CLUSTER_NAME} \
--worker-machine-type n1-standard-8 \
--num-workers 8 \
--image-version 1.5-debian \
--initialization-actions gs://dataproc-initialization-actions/python/pip-install.sh \
--metadata 'PIP_PACKAGES=google-cloud-storage' \
--optional-components=ANACONDA \
--enable-component-gateway
এই কমান্ডটি শেষ হতে কয়েক মিনিট সময় লাগবে। কমান্ডটি ভেঙে ফেলার জন্য:
এটি আপনার পূর্বে প্রদত্ত নামের সাথে একটি Dataproc ক্লাস্টার তৈরি শুরু করবে। beta API ব্যবহার করলে Dataproc এর Component Gateway এর মতো বিটা বৈশিষ্ট্যগুলি সক্ষম হবে।
gcloud beta dataproc clusters create ${CLUSTER_NAME}
এটি আপনার কর্মীদের জন্য ব্যবহারের জন্য মেশিনের ধরণ নির্ধারণ করবে।
--worker-machine-type n1-standard-8
এটি আপনার ক্লাস্টারে কতজন কর্মী থাকবে তা নির্ধারণ করবে।
--num-workers 8
এটি Dataproc এর ইমেজ ভার্সন সেট করবে।
--image-version 1.5-debian
এটি ক্লাস্টারে ব্যবহারের জন্য ইনিশিয়ালাইজেশন অ্যাকশনগুলি কনফিগার করবে। এখানে, আপনি পাইপ ইনিশিয়ালাইজেশন অ্যাকশন অন্তর্ভুক্ত করছেন।
--initialization-actions gs://dataproc-initialization-actions/python/pip-install.sh
এটি ক্লাস্টারে অন্তর্ভুক্ত করার জন্য মেটাডেটা। এখানে, আপনি pip ইনিশিয়ালাইজেশন অ্যাকশনের জন্য মেটাডেটা প্রদান করছেন।
--metadata 'PIP_PACKAGES=google-cloud-storage'
এটি ক্লাস্টারে ইনস্টল করার জন্য ঐচ্ছিক উপাদানগুলি সেট করবে।
--optional-components=ANACONDA
এটি কম্পোনেন্ট গেটওয়ে সক্ষম করবে যা আপনাকে জেপেলিন, জুপিটার বা স্পার্ক ইতিহাসের মতো সাধারণ UI দেখার জন্য Dataproc এর কম্পোনেন্ট গেটওয়ে ব্যবহার করতে দেয়।
--enable-component-gateway
Dataproc সম্পর্কে আরও বিস্তারিত জানার জন্য, অনুগ্রহ করে এই কোডল্যাবটি দেখুন।
একটি গুগল ক্লাউড স্টোরেজ বাকেট তৈরি করা
আপনার কাজের আউটপুটের জন্য আপনার একটি Google Cloud Storage বাকেটের প্রয়োজন হবে। আপনার বাকেটের জন্য একটি অনন্য নাম নির্ধারণ করুন এবং একটি নতুন বাকেট তৈরি করতে নিম্নলিখিত কমান্ডটি চালান। সমস্ত ব্যবহারকারীর জন্য সমস্ত Google Cloud প্রকল্পে বাকেটের নাম অনন্য, তাই আপনাকে বিভিন্ন নামে কয়েকবার এটি চেষ্টা করতে হতে পারে। যদি আপনি ServiceException না পান তবে একটি বাকেট সফলভাবে তৈরি করা হয়।
BUCKET_NAME=<bucket_name>
gsutil mb gs://${BUCKET_NAME}
৭. অনুসন্ধানমূলক তথ্য বিশ্লেষণ
আপনার প্রিপ্রসেসিং করার আগে, আপনার যে ডেটা নিয়ে কাজ করছেন তার প্রকৃতি সম্পর্কে আরও জানা উচিত। এটি করার জন্য, আপনাকে ডেটা এক্সপ্লোরেশনের দুটি পদ্ধতি অন্বেষণ করতে হবে। প্রথমে, আপনি BigQuery ওয়েব UI ব্যবহার করে কিছু কাঁচা ডেটা দেখতে পাবেন এবং তারপর আপনি PySpark এবং Dataproc ব্যবহার করে প্রতি সাবরেডিটে পোস্টের সংখ্যা গণনা করবেন।
BigQuery ওয়েব UI ব্যবহার করা
আপনার ডেটা দেখার জন্য BigQuery Web UI ব্যবহার করে শুরু করুন। ক্লাউড কনসোলের মেনু আইকন থেকে, নীচে স্ক্রোল করুন এবং BigQuery Web UI খুলতে "BigQuery" টিপুন।

এরপর, BigQuery Web UI Query Editor-এ নিম্নলিখিত কমান্ডটি চালান। এটি ২০১৭ সালের জানুয়ারী থেকে ১০টি পূর্ণ সারি ডেটা ফেরত দেবে:
select * from fh-bigquery.reddit_posts.2017_01 limit 10;

আপনি পৃষ্ঠাটি স্ক্রোল করে সমস্ত উপলব্ধ কলাম এবং কিছু উদাহরণ দেখতে পারেন। বিশেষ করে, আপনি দুটি কলাম দেখতে পাবেন যা প্রতিটি পোস্টের পাঠ্য বিষয়বস্তু উপস্থাপন করে: "শিরোনাম" এবং "স্ব-পাঠ্য", দ্বিতীয়টি পোস্টের মূল অংশ। এছাড়াও অন্যান্য কলামগুলি লক্ষ্য করুন যেমন "created_utc" যা একটি পোস্ট তৈরির সময় এবং "subreddit" যা পোস্টটি বিদ্যমান সাবরেডিট।
একটি PySpark কাজ সম্পাদন করা হচ্ছে
আপনার ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলি চালান যাতে নমুনা কোড এবং সিডি সহ রেপোটি সঠিক ডিরেক্টরিতে ক্লোন করা যায়:
cd
git clone https://github.com/GoogleCloudPlatform/cloud-dataproc
প্রতিটি সাবরেডিটের জন্য কতগুলি পোস্ট বিদ্যমান তার গণনা নির্ধারণ করতে আপনি PySpark ব্যবহার করতে পারেন। আপনি ক্লাউড এডিটর খুলতে পারেন এবং পরবর্তী ধাপে এটি কার্যকর করার আগে cloud-dataproc/codelabs/spark-bigquery স্ক্রিপ্টটি পড়তে পারেন:


আপনার ক্লাউড শেলে ফিরে যেতে ক্লাউড এডিটরে "ওপেন টার্মিনাল" বোতামে ক্লিক করুন এবং আপনার প্রথম PySpark কাজটি সম্পাদন করতে নিম্নলিখিত কমান্ডটি চালান:
cd ~/cloud-dataproc/codelabs/spark-bigquery
gcloud dataproc jobs submit pyspark --cluster ${CLUSTER_NAME} \
--jars gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar \
--driver-log-levels root=FATAL \
counts_by_subreddit.py
এই কমান্ডটি আপনাকে Jobs API এর মাধ্যমে Dataproc-এ কাজ জমা দেওয়ার অনুমতি দেয়। এখানে আপনি কাজের ধরণ pyspark হিসাবে নির্দেশ করছেন। আপনি ক্লাস্টারের নাম, ঐচ্ছিক প্যারামিটার এবং কাজ ধারণকারী ফাইলের নাম সরবরাহ করতে পারেন। এখানে, আপনি --jars প্যারামিটার প্রদান করছেন যা আপনাকে আপনার কাজের সাথে spark-bigquery-connector অন্তর্ভুক্ত করতে দেয়। আপনি --driver-log-levels root=FATAL ব্যবহার করে লগ আউটপুট স্তরও সেট করতে পারেন যা ত্রুটি ছাড়া সমস্ত লগ আউটপুট দমন করবে। স্পার্ক লগগুলি বেশ শব্দযুক্ত হয়।
এটি চলতে কয়েক মিনিট সময় লাগবে এবং আপনার চূড়ান্ত আউটপুটটি এরকম কিছু দেখাবে:

৮. ডেটাপ্রোক এবং স্পার্ক ইউআই অন্বেষণ করা
Dataproc-এ Spark jobs চালানোর সময়, আপনার কাজ/ক্লাস্টারের অবস্থা পরীক্ষা করার জন্য দুটি UI-তে অ্যাক্সেস থাকে। প্রথমটি হল Dataproc UI, যা আপনি মেনু আইকনে ক্লিক করে Dataproc-এ স্ক্রোল করে খুঁজে পেতে পারেন। এখানে, আপনি বর্তমান মেমোরির পাশাপাশি মুলতুবি থাকা মেমোরি এবং কর্মীদের সংখ্যা দেখতে পাবেন।

আপনি "জবস" ট্যাবে ক্লিক করে সম্পন্ন কাজগুলি দেখতে পারেন। আপনি একটি নির্দিষ্ট কাজের জন্য জব আইডিতে ক্লিক করে সেই কাজের লগ এবং আউটপুটের মতো কাজের বিবরণ দেখতে পারেন। 

আপনি Spark UIও দেখতে পারেন। জব পেজ থেকে, পিছনের তীরটিতে ক্লিক করুন এবং তারপর Web Interfaces-এ ক্লিক করুন। কম্পোনেন্ট গেটওয়ের অধীনে আপনি বেশ কয়েকটি বিকল্প দেখতে পাবেন। আপনার ক্লাস্টার সেট আপ করার সময় এর মধ্যে অনেকগুলি Optional Components এর মাধ্যমে সক্রিয় করা যেতে পারে। এই ল্যাবের জন্য, "Spark History Server"-এ ক্লিক করুন।



এটি নিম্নলিখিত উইন্ডোটি খুলবে:

সমস্ত সম্পন্ন কাজ এখানে প্রদর্শিত হবে, এবং আপনি চাকরি সম্পর্কে আরও তথ্য জানতে যেকোনো application_id-এ ক্লিক করতে পারেন। একইভাবে, আপনি বর্তমানে চলমান সমস্ত কাজ দেখতে ল্যান্ডিং পৃষ্ঠার একেবারে নীচে "Show Incomplete Applications"-এ ক্লিক করতে পারেন।
৯. আপনার ব্যাকফিল কাজ চালানো
এখন আপনি একটি কাজ চালাবেন যা মেমোরিতে ডেটা লোড করবে, প্রয়োজনীয় তথ্য বের করবে এবং আউটপুটটি একটি Google Cloud Storage বাকেটে ডাম্প করবে। আপনি প্রতিটি reddit মন্তব্যের জন্য "title", "body" (raw text) এবং "timestamp created" বের করবেন। তারপর আপনি এই ডেটাটি নেবেন, এটিকে একটি csv তে রূপান্তর করবেন, এটিকে zip করবেন এবং gs://${BUCKET_NAME}/reddit_posts/YYYY/MM/food.csv.gz এর URI সহ একটি বাকেটে লোড করবেন।
cloud-dataproc/codelabs/spark-bigquery/backfill.sh কোডটি পড়ার জন্য আপনি আবার ক্লাউড এডিটরটি দেখতে পারেন, যা cloud-dataproc/codelabs/spark-bigquery/backfill.py কোডটি কার্যকর করার জন্য একটি র্যাপার স্ক্রিপ্ট।
cd ~/cloud-dataproc/codelabs/spark-bigquery
bash backfill.sh ${CLUSTER_NAME} ${BUCKET_NAME}
শীঘ্রই আপনি কাজ শেষ হওয়ার অনেক বার্তা দেখতে পাবেন। কাজটি শেষ হতে ১৫ মিনিট পর্যন্ত সময় লাগতে পারে। আপনি gsutil ব্যবহার করে সফলভাবে ডেটা আউটপুট হয়েছে কিনা তা যাচাই করার জন্য আপনার স্টোরেজ বাকেটটি দুবার পরীক্ষা করতে পারেন। সমস্ত কাজ শেষ হয়ে গেলে, নিম্নলিখিত কমান্ডটি চালান:
gsutil ls gs://${BUCKET_NAME}/reddit_posts/*/*/food.csv.gz
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:

অভিনন্দন, আপনি আপনার reddit মন্তব্য ডেটার জন্য একটি ব্যাকফিল সফলভাবে সম্পন্ন করেছেন! আপনি যদি এই ডেটার উপরে মডেল তৈরি করতে আগ্রহী হন, তাহলে অনুগ্রহ করে Spark-NLP কোডল্যাবে যান।
১০. পরিষ্কার-পরিচ্ছন্নতা
এই কুইকস্টার্ট সম্পন্ন হওয়ার পরে আপনার GCP অ্যাকাউন্টে অপ্রয়োজনীয় চার্জ এড়াতে:
- পরিবেশ এবং আপনার তৈরি করা ক্লাউড স্টোরেজ বাকেটটি মুছে ফেলুন।
- Dataproc পরিবেশ মুছে ফেলুন ।
যদি আপনি শুধুমাত্র এই কোডল্যাবের জন্য একটি প্রকল্প তৈরি করে থাকেন, তাহলে আপনি ঐচ্ছিকভাবে প্রকল্পটি মুছে ফেলতে পারেন:
- GCP কনসোলে, প্রজেক্ট পৃষ্ঠায় যান।
- প্রকল্পের তালিকায়, আপনি যে প্রকল্পটি মুছতে চান তা নির্বাচন করুন এবং মুছুন ক্লিক করুন।
- বাক্সে, প্রকল্প আইডি টাইপ করুন, এবং তারপর প্রকল্পটি মুছে ফেলতে Shut down এ ক্লিক করুন।
লাইসেন্স
এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ৩.০ জেনেরিক লাইসেন্স এবং অ্যাপাচি ২.০ লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।