এয়ারফ্লো ডিএজি সহ স্নোফ্লেক সঞ্চিত পদ্ধতিতে কার্যকরী ব্যর্থতার সমাধান করা
স্নোফ্লেকের প্রক্রিয়াগুলি স্বয়ংক্রিয় করতে এয়ারফ্লো ডিএজিগুলির সাথে কাজ করার সময়, জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতিগুলি সম্পাদন করা অনন্য চ্যালেঞ্জগুলি উপস্থাপন করতে পারে। ডেভেলপারদের মুখোমুখি হওয়া একটি সাধারণ সমস্যা হল লেনদেন ব্যর্থতা, বিশেষ করে যখন স্নোফ্লেকে স্কোপড লেনদেন ব্যবহার করা হয়। এটি একটি গুরুতর বাধা, কারণ ব্যর্থতার ফলে লেনদেন রোলব্যাক হয়, কর্মপ্রবাহ ব্যাহত হয়।
পাইথন স্নোফ্লেক সংযোগকারী 2.9.0 এর সাথে এয়ারফ্লো 2.5.1 ব্যবহার করার সময় ত্রুটিটি আরও প্রবল হয়ে ওঠে। এই সংমিশ্রণটি সঞ্চিত পদ্ধতির মধ্যে লেনদেন পরিচালনার সমস্যাগুলিকে ট্রিগার করে বলে মনে হচ্ছে, যা জাভাস্ক্রিপ্টের উপর নির্ভর করে। এই ক্ষেত্রে সাধারণত যে ত্রুটি বার্তাটি দেখা যায় তা হল: "সঞ্চিত পদ্ধতিতে শুরু করা স্কোপড লেনদেন অসম্পূর্ণ এবং এটি ফিরিয়ে আনা হয়েছে।"
সঞ্চিত পদ্ধতি কীভাবে ব্যতিক্রমগুলি পরিচালনা করে তা বোঝা সমস্যা সমাধানের জন্য গুরুত্বপূর্ণ। বেশিরভাগ ক্ষেত্রে, পদ্ধতিটি একটি "শুরু লেনদেন" দিয়ে শুরু হয়, এটি কমিট করে এবং যদি কোনো সমস্যা দেখা দেয়, এটি লেনদেনটি ফিরিয়ে দেয়। স্নোফ্লেক এবং এয়ারফ্লো সংস্করণের সাথে ব্যবহার করা হলে এই আদর্শ প্রবাহটি ভেঙ্গে যায় বলে মনে হয়, যা বিকাশকারীদের জন্য রেজোলিউশনকে জটিল করে তোলে।
এই নিবন্ধে, আমরা নির্দিষ্ট সমস্যাটি অন্বেষণ করব এবং সম্ভাব্য সমাধানগুলি পরীক্ষা করব যা এই কার্যকরী সমস্যা সমাধানে সহায়তা করতে পারে। অন্তর্নিহিত কারণগুলি সমাধান করে এবং আমাদের কনফিগারেশন সামঞ্জস্য করে, আমরা আরও নির্ভরযোগ্য এবং শক্তিশালী অটোমেশন প্রক্রিয়া তৈরি করার লক্ষ্য রাখি।
| আদেশ | ব্যবহারের উদাহরণ |
|---|---|
| SnowflakeOperator | এই কমান্ডটি এয়ারফ্লো-এর স্নোফ্লেক প্রদানকারীর অংশ এবং একটি এয়ারফ্লো ডিএজি থেকে এসকিউএল কমান্ড চালানো বা স্নোফ্লেকে সঞ্চিত পদ্ধতি কল করতে ব্যবহৃত হয়। এটি ডাটাবেসের কাজগুলি সরাসরি সম্পাদনের অনুমতি দিয়ে এয়ারফ্লো সহ স্নোফ্লেককে একীভূত করা সহজ করে। |
| conn.cursor().execute("BEGIN TRANSACTION") | স্নোফ্লেকে একটি স্কোপড লেনদেন শুরু করে। মাল্টি-স্টেটমেন্ট লেনদেন পরিচালনার জন্য এই কমান্ডটি গুরুত্বপূর্ণ, বিশেষ করে যখন স্নোফ্লেকের জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতিগুলির সাথে ইন্টারঅ্যাক্ট করা হয়। এটি নিশ্চিত করে যে ব্যর্থতার ক্ষেত্রে পরবর্তী অপারেশনগুলি ফিরিয়ে আনা যেতে পারে। |
| conn.cursor().execute("ROLLBACK") | স্নোফ্লেকে একটি রোলব্যাক কার্যকর করে, যদি কোনো ত্রুটির সম্মুখীন হয় তাহলে লেনদেনের সময় করা সমস্ত পরিবর্তন বাতিল করে। এই কমান্ডটি ডেটা অখণ্ডতা নিশ্চিত করে এবং জটিল কর্মপ্রবাহের জন্য ত্রুটি পরিচালনার ক্ষেত্রে অপরিহার্য। |
| PythonOperator | টাস্ক হিসাবে পাইথন ফাংশন চালানোর জন্য Airflow DAG-এর মধ্যে ব্যবহৃত হয়। এই সমাধানের পরিপ্রেক্ষিতে, এটি একটি কাস্টম পাইথন ফাংশন চালানোর অনুমতি দেয় যা স্নোফ্লেক সংযোগকারীর সাথে ইন্টারঅ্যাক্ট করে, স্ট্যান্ডার্ড SQL কমান্ডের তুলনায় আরও নমনীয়তা প্রদান করে। |
| provide_context=True | PythonOperator-এ এই যুক্তিটি এয়ারফ্লো DAG থেকে টাস্ক ফাংশনে প্রসঙ্গ ভেরিয়েবল পাস করে, যা আরও গতিশীল কাজ সম্পাদনের অনুমতি দেয়। এই সমস্যায়, এটি সঞ্চিত পদ্ধতির জন্য পরামিতি পরিচালনা করতে সাহায্য করে। |
| dag=dag | এই যুক্তিটি বর্তমান DAG উদাহরণের সাথে সংজ্ঞায়িত কাজটিকে সংযুক্ত করতে ব্যবহৃত হয়। এটা নিশ্চিত করতে সাহায্য করে যে কাজটি সঠিক ক্রমানুসারে সম্পাদনের জন্য এয়ারফ্লো শিডিউলিং সিস্টেমের মধ্যে সঠিকভাবে নিবন্ধিত হয়েছে। |
| snowflake.connector.connect() | Python ব্যবহার করে Snowflake এর ডাটাবেসের সাথে একটি সংযোগ স্থাপন করে। এই কমান্ডটি স্নোফ্লেকের সাথে সরাসরি ইন্টারঅ্যাক্ট করার জন্য গুরুত্বপূর্ণ, বিশেষ করে কাস্টম পদ্ধতিগুলি চালানো এবং ডাটাবেস লেনদেন পরিচালনা করার জন্য। |
| task_id='run_snowflake_procedure' | এটি একটি DAG-এর মধ্যে প্রতিটি কাজের জন্য একটি অনন্য শনাক্তকারী নির্দিষ্ট করে। এটি নির্দিষ্ট কাজগুলি উল্লেখ করতে এবং সেগুলি সঠিক ক্রমে কার্যকর করা হয়েছে এবং বায়ুপ্রবাহে নির্ভরতা বজায় রাখা হয়েছে তা নিশ্চিত করতে ব্যবহৃত হয়। |
| role='ROLE_NAME' | টাস্ক সম্পাদনের সময় ব্যবহার করা স্নোফ্লেক ভূমিকা সংজ্ঞায়িত করে। ভূমিকা নিয়ন্ত্রণ অনুমতি এবং অ্যাক্সেস লেভেল, নিশ্চিত করে যে সঞ্চিত পদ্ধতি বা কোনো ডেটা ম্যানিপুলেশন সঠিক নিরাপত্তা প্রসঙ্গের সাথে সম্পাদিত হয়। |
এয়ারফ্লো ডিএজি-এর মাধ্যমে স্নোফ্লেক সঞ্চিত পদ্ধতির সম্পাদন বোঝা
প্রদত্ত স্ক্রিপ্টগুলি এয়ারফ্লো ডিএজি এবং স্নোফ্লেকের মধ্যে একটি সেতু হিসাবে কাজ করে, যা স্নোফ্লেকে জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতিগুলি চালানোর স্বয়ংক্রিয়তা সক্ষম করে৷ প্রথম স্ক্রিপ্টে, আমরা ব্যবহার করি একটি এয়ারফ্লো টাস্কের মধ্যে থেকে সঞ্চিত পদ্ধতিটি কল করতে। এই অপারেটরটি অত্যন্ত গুরুত্বপূর্ণ কারণ এটি স্নোফ্লেকের সাথে সংযোগ স্থাপন এবং SQL বিবৃতি কার্যকর করার জটিলতাগুলিকে বিমূর্ত করে। স্নোফ্লেক কানেকশন আইডি, স্কিমা এবং SQL কমান্ডের মতো প্যারামিটার প্রদান করে, আমরা নিশ্চিত করি যে সংরক্ষিত পদ্ধতিটি প্রয়োজনীয় প্রসঙ্গ সহ সঠিকভাবে আহ্বান করা হয়েছে।
প্রশ্নে সংরক্ষিত পদ্ধতিটি স্কোপড লেনদেন ব্লক ব্যবহার করে সমালোচনামূলক ডাটাবেস লেনদেন পরিচালনা করে। এই লেনদেনগুলি নিশ্চিত করার জন্য গুরুত্বপূর্ণ যে একাধিক SQL কমান্ড এক ইউনিট হিসাবে কার্যকর হয়, ডেটা অখণ্ডতা রক্ষা করে। বিশেষভাবে, স্ক্রিপ্টটি a এর সাথে একটি লেনদেন শুরু করার চেষ্টা করে , তারপর সফল হলে কমিট করে, বা ত্রুটির ক্ষেত্রে রোলব্যাক করে। ত্রুটি পরিচালনার প্রক্রিয়াটি অত্যাবশ্যক, কারণ এটি স্ক্রিপ্টকে কোনো অসম্পূর্ণ পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনতে অনুমতি দেয় যদি কিছু ভুল হয়ে যায়, নিশ্চিত করে যে কোনো আংশিক ডেটা লেখা নেই।
দ্বিতীয় পদ্ধতি, যা পাইথন ব্যবহার করে , পাইথন ফাংশনের মধ্যে থেকে স্নোফ্লেকের সাথে সরাসরি মিথস্ক্রিয়া করার অনুমতি দিয়ে আরও নমনীয়তা অফার করে। এই পদ্ধতিটি স্নোফ্লেক অপারেটরকে বাইপাস করে এবং আপনাকে সংযোগ এবং লেনদেন পরিচালনার উপর আরও নিয়ন্ত্রণ করতে দেয়। স্ক্রিপ্ট স্পষ্টভাবে একটি সংযোগ খোলে, লেনদেন শুরু করে এবং সঞ্চিত পদ্ধতিতে কল করে। যদি পদ্ধতিটি ব্যর্থ হয়, এটি একটি ব্যতিক্রম উত্থাপন করে, কোন অবাঞ্ছিত ডেটা সংরক্ষণ করা হয় না তা নিশ্চিত করতে একটি রোলব্যাক ট্রিগার করে।
পদ্ধতির এই সংমিশ্রণটি এয়ারফ্লো এর মাধ্যমে স্নোফ্লেকে জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতিগুলি কার্যকর করার সমস্যা সমাধানের দুটি উপায় প্রদর্শন করে। প্রথম পদ্ধতিটি সহজতর এবং এয়ারফ্লো-এর টাস্ক অর্কেস্ট্রেশনের সাথে শক্তভাবে একত্রিত হলেও, দ্বিতীয় পদ্ধতিটি ত্রুটি পরিচালনার একটি আরও কাস্টমাইজযোগ্য এবং সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে। উভয় পদ্ধতিই ব্যাপ্ত লেনদেনের গুরুত্ব এবং ব্যর্থতার ক্ষেত্রে সঠিক রোলব্যাক প্রক্রিয়ার প্রয়োজনীয়তার উপর জোর দেয়। এই স্ক্রিপ্টগুলিকে মডুলারাইজ করার মাধ্যমে, ডেভেলপাররা পারফরম্যান্স বজায় রেখে এবং ডেটা সামঞ্জস্য নিশ্চিত করার সময় বিভিন্ন এয়ারফ্লো ডিএজি জুড়ে সহজেই তাদের পুনরায় ব্যবহার করতে পারে।
পদ্ধতি 1: অপ্টিমাইজড এসকিউএল লেনদেন ব্যবহার করে এয়ারফ্লো সহ স্নোফ্লেক সঞ্চিত পদ্ধতি সম্পাদনের সমাধান করা
এয়ারফ্লো ডিএজি-এর মাধ্যমে জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতিগুলি চালানোর জন্য পাইথন এবং স্নোফ্লেক সংযোগকারী ব্যবহার করে ব্যাকএন্ড স্ক্রিপ্ট। এই পদ্ধতিটি ডাটাবেস পরিচালনার জন্য ত্রুটি পরিচালনা এবং মডুলারিটির উপর দৃষ্টি নিবদ্ধ করে।
# Import necessary librariesfrom airflow import DAGfrom airflow.providers.snowflake.operators.snowflake import SnowflakeOperatorfrom datetime import datetime# Define default arguments for the DAGdefault_args = {'owner': 'airflow','start_date': datetime(2024, 10, 1),'retries': 1}# Create the DAG for schedulingdag = DAG('snowflake_stored_procedure_dag', default_args=default_args, schedule_interval='@daily')# Define the SQL command for invoking the stored procedurecreate_config_table = """CALL {target_schema}.STORED_PROCEDURE('{target_schema}', '{storageIntegration}', '{s3_uri}');"""# Define the Snowflake operator taskcall_CONFIG_DATA_LOAD = SnowflakeOperator(task_id='call_CONFIG_DATA_LOAD',snowflake_conn_id='snowflake_conn',database='DB_NAME',schema='SCHEMA_NAME',role='ROLE_NAME',warehouse='WAREHOUSE_NAME',sql=create_config_table,dag=dag)# Test the operatorcall_CONFIG_DATA_LOAD
পদ্ধতি 2: পাইথন এবং এয়ারফ্লো সহ স্নোফ্লেকের সঞ্চিত প্রক্রিয়া সম্পাদনে উন্নত ত্রুটি পরিচালনা
ডিবাগিংয়ের জন্য আরও ভাল লেনদেন পরিচালনা এবং লগিং নিশ্চিত করতে পাইথন এবং স্নোফ্লেকের ত্রুটি পরিচালনা ব্যবহার করে ব্যাকএন্ড সমাধান।
# Import necessary librariesimport snowflake.connectorfrom airflow import DAGfrom airflow.operators.python_operator import PythonOperatorfrom datetime import datetime# Define connection and transaction functiondef execute_snowflake_procedure(kwargs):conn = snowflake.connector.connect(user='USERNAME',password='PASSWORD',account='ACCOUNT_NAME')try:conn.cursor().execute("BEGIN TRANSACTION")conn.cursor().execute("CALL SCHEMA_NAME.STORED_PROCEDURE()")conn.cursor().execute("COMMIT")except Exception as e:conn.cursor().execute("ROLLBACK")raise Exception(f"Transaction failed: {e}")# Set up DAGdefault_args = {'owner': 'airflow','start_date': datetime(2024, 10, 1)}dag = DAG('snowflake_procedure_with_error_handling', default_args=default_args)run_snowflake_procedure = PythonOperator(task_id='run_snowflake_procedure',python_callable=execute_snowflake_procedure,provide_context=True,dag=dag)
বায়ুপ্রবাহে স্নোফ্লেক লেনদেন পরিচালনার বিকল্পগুলি অন্বেষণ করা
একটি গুরুত্বপূর্ণ দিক যা এখনও আলোচনা করা হয়নি তা হল ব্যবহারের সম্ভাবনা সঞ্চিত পদ্ধতিগুলি পরিচালনা করতে সম্পূর্ণরূপে বায়ুপ্রবাহের উপর নির্ভর করার পরিবর্তে বৈশিষ্ট্য। স্নোফ্লেক টাস্কগুলি অন্তর্নির্মিত সময়সূচী এবং কার্যকর করার উপাদান যা স্নোফ্লেকের মধ্যে সরাসরি নির্দিষ্ট প্রক্রিয়াগুলিকে স্বয়ংক্রিয় করতে পারে। যদিও এয়ারফ্লো একটি বৃহত্তর অর্কেস্ট্রেশন স্কোপ অফার করে, এয়ারফ্লো-এর সাথে সংমিশ্রণে স্নোফ্লেক টাস্কগুলি ব্যবহার করে ডাটাবেস-সম্পর্কিত কাজগুলির আরও স্থানীয়করণ, দক্ষ সম্পাদনের অনুমতি দেয়। এই সেটআপটি স্নোফ্লেকে নির্দিষ্ট কাজগুলি অফলোড করতে পারে, এয়ারফ্লো ডিএজিগুলির লোড হ্রাস করে৷
অন্বেষণ করার জন্য আরেকটি গুরুত্বপূর্ণ এলাকা হল একীকরণ স্নোফ্লেকের মধ্যে স্নোফ্লেক-এ জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতির জন্য প্রায়ই জটিল বহু-পদক্ষেপের ক্রিয়াকলাপগুলির যত্নশীল ব্যবস্থাপনার প্রয়োজন হয় যাতে বেশ কয়েকটি ডাটাবেস পরিবর্তন জড়িত থাকে। সঞ্চিত পদ্ধতিতে এই পদক্ষেপগুলি সরাসরি অন্তর্ভুক্ত করে, আপনি অসম্পূর্ণ লেনদেন বা রোলব্যাক হওয়ার সম্ভাবনা কমিয়ে দেন। এর জন্য সতর্ক ব্যবস্থাপনা প্রয়োজন কোনো বাহ্যিক প্রক্রিয়া যাতে এই বহু-পদক্ষেপের ক্রিয়াকলাপগুলি সম্পাদনে হস্তক্ষেপ না করে তা নিশ্চিত করতে, ডেটা সামঞ্জস্যের গ্যারান্টি দেয় এবং রেসের অবস্থা প্রতিরোধ করে।
সবশেষে, এয়ারফ্লো এর উন্নত বৈশিষ্ট্য যেমন কাজের মধ্যে ডেটা পাস করার জন্য আপনি কীভাবে গতিশীল এসকিউএল কল পরিচালনা করতে পারেন তা উন্নত করতে পারে। উদাহরণস্বরূপ, আপনার সঞ্চিত পদ্ধতি কলগুলিতে হার্ডকোডিং মানগুলির পরিবর্তে, আপনি XCom ব্যবহার করে গতিশীলভাবে প্যারামিটারগুলি পাস করতে পারেন। এটি শুধুমাত্র আপনার এয়ারফ্লো DAG-এর নমনীয়তা বাড়ায় না বরং স্নোফ্লেক সঞ্চিত পদ্ধতির সাথে জড়িত ওয়ার্কফ্লো অর্কেস্ট্রেট করার সময় আরও মাপযোগ্য এবং রক্ষণাবেক্ষণযোগ্য সমাধানের অনুমতি দেয়। পুরো প্রক্রিয়াটিকে আরও গতিশীল করে, আপনি অপ্রয়োজনীয়তা হ্রাস করেন এবং দক্ষতা উন্নত করেন।
- এয়ারফ্লো ডিএজিতে আমি কীভাবে স্নোফ্লেক সঞ্চিত পদ্ধতিকে কল করব?
- ব্যবহার করুন এসকিউএল কমান্ড চালানো বা একটি DAG মধ্যে সঞ্চিত পদ্ধতি কল. প্রয়োজনীয় SQL ক্যোয়ারী এবং সংযোগ পরামিতি পাস করুন।
- কেন আমি একটি "স্কোপড লেনদেন অসম্পূর্ণ" ত্রুটির সম্মুখীন হব?
- আপনার সঞ্চিত পদ্ধতিতে অনুপযুক্ত লেনদেন পরিচালনার কারণে এই ত্রুটি ঘটে। একটি অন্তর্ভুক্ত নিশ্চিত করুন , , এবং সঠিক ত্রুটি ব্যবস্থাপনার জন্য যুক্তি।
- আমি কি এয়ারফ্লোতে পাইথন স্ক্রিপ্ট থেকে সরাসরি স্নোফ্লেক লেনদেন পরিচালনা করতে পারি?
- হ্যাঁ, আপনি ব্যবহার করতে পারেন মডিউল স্নোফ্লেকের সাথে একটি সংযোগ খুলতে এবং এর মাধ্যমে একটি পাইথন ফাংশনের মধ্যে এসকিউএল কমান্ড কার্যকর করতে .
- এয়ারফ্লো ব্যবহার না করে স্নোফ্লেক কাজগুলি স্বয়ংক্রিয় করার একটি উপায় আছে কি?
- হ্যাঁ, স্নোফ্লেক নামে একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে যা নির্দিষ্ট ডাটাবেস-কেন্দ্রিক ওয়ার্কফ্লোতে বায়ুপ্রবাহের প্রয়োজনীয়তা হ্রাস করে, স্নোফ্লেকে সরাসরি প্রসেসগুলি নির্ধারণ এবং কার্যকর করতে পারে।
- কিভাবে আমি বায়ুপ্রবাহের মাধ্যমে একটি স্নোফ্লেক সঞ্চিত পদ্ধতিতে গতিশীলভাবে ভেরিয়েবল পাস করতে পারি?
- এয়ারফ্লো ব্যবহার করুন কাজগুলির মধ্যে গতিশীল মানগুলি পাস করার বৈশিষ্ট্য এবং সেগুলিকে আপনার এসকিউএল ক্যোয়ারী বা সঞ্চিত পদ্ধতি কলগুলিতে ইনজেক্ট করা।
এয়ারফ্লো-এর মাধ্যমে স্নোফ্লেক সঞ্চিত পদ্ধতিগুলি কার্যকর করার বিষয়ে সমস্যাগুলি সমাধান করার জন্য লেনদেন পরিচালনা এবং ব্যতিক্রম পরিচালনা উভয়েরই একটি দৃঢ় বোঝার প্রয়োজন। এয়ারফ্লো এর ইন্টিগ্রেশন এবং স্নোফ্লেকের শক্তিশালী লেনদেন ক্ষমতার ব্যবহার করে, ডেভেলপাররা ত্রুটি কমাতে পারে এবং মসৃণ কর্মপ্রবাহ নিশ্চিত করতে পারে।
লেনদেন ব্লক যত্ন সহকারে পরিচালনা, ত্রুটি ব্যবস্থাপনা, এবং সুবিধার মত বৈশিষ্ট্য গতিশীল পরামিতি পাস করার জন্য এই ওয়ার্কফ্লোগুলির নির্ভরযোগ্যতা ব্যাপকভাবে উন্নত করতে পারে। যেহেতু স্নোফ্লেক এবং এয়ারফ্লো ক্রমাগত বিকশিত হতে থাকে, সর্বোত্তম অনুশীলনের সাথে আপডেট থাকা সিস্টেমের কার্যকারিতাকে আরও বাড়িয়ে তুলবে এবং বাধাগুলি কমিয়ে দেবে।
- এয়ারফ্লো 2.5.1 এবং এর স্নোফ্লেক ইন্টিগ্রেশন সংক্রান্ত বিশদ বিবরণ এখানে পাওয়া যাবে Apache Airflow Snowflake প্রদানকারী ডকুমেন্টেশন .
- স্নোফ্লেকের জাভাস্ক্রিপ্ট-ভিত্তিক সঞ্চিত পদ্ধতি এবং লেনদেন পরিচালনার উপর ব্যাপক অন্তর্দৃষ্টি এখানে উপলব্ধ স্নোফ্লেক ডকুমেন্টেশন - সঞ্চিত পদ্ধতি .
- স্নোফ্লেকের স্কোপড লেনদেনের সমস্যা সমাধানের তথ্যের জন্য, পড়ুন স্নোফ্লেক কমিউনিটি ট্রাবলশুটিং গাইড .
- Snowflake Python Connector 2.9.0 ব্যবহার এবং সমস্যা এখানে নথিভুক্ত করা হয়েছে স্নোফ্লেক পাইথন সংযোগকারী ডকুমেন্টেশন .