Avro Schema Design এবং Data Types

অ্যাপাচি অভ্র (Avro) - Big Data and Analytics

456

Avro ডেটা সিরিয়ালাইজেশন ফ্রেমওয়ার্কে, স্কিমা একটি অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। Avro-তে ডেটা সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন সম্পূর্ণভাবে স্কিমার ওপর ভিত্তি করে পরিচালিত হয়। স্কিমা দিয়ে ডেটার গঠন নির্ধারণ করা হয়, এবং এটি JSON ফরম্যাটে সংজ্ঞায়িত থাকে। Avro-তে Schema Design একটি সুনির্দিষ্ট প্রক্রিয়া, যা ডেটার কাঠামো ঠিক করে এবং এর ভিতরে কোন ধরনের ডেটা থাকতে পারে তা নির্ধারণ করে।

Avro Schema Design

Avro স্কিমা ডিজাইন করার সময় কিছু মূল উপাদান রয়েছে, যা সমস্ত স্কিমাতে উপস্থিত থাকে। Avro স্কিমা JSON ফরম্যাটে সংজ্ঞায়িত করা হয় এবং এটি একটি record (রেকর্ড) ধরনের ডেটার কাঠামো তৈরি করে।

১. Schema Format

Avro স্কিমা JSON ফরম্যাটে লেখা হয়, এবং এর মধ্যে কিছু মৌলিক অংশ থাকে:

  • type: এটি ডেটার টাইপ নির্ধারণ করে, যেমন record, enum, fixed ইত্যাদি।
  • name: এটি স্কিমার নাম দেয়।
  • fields: এটি ডেটার ক্ষেত্র বা ফিল্ডের তালিকা যা স্কিমাতে উপস্থিত থাকবে।

উদাহরণ:

{
   "type": "record",
   "name": "User",
   "fields": [
      {"name": "name", "type": "string"},
      {"name": "age", "type": "int"},
      {"name": "emails", "type": {"type": "array", "items": "string"}}
   ]
}

এখানে:

  • type: record নির্দেশ করে যে এটি একটি রেকর্ড টাইপ স্কিমা।
  • name: স্কিমার নাম User
  • fields: এখানে তিনটি ফিল্ড রয়েছে — name, age, এবং emails

২. Types of Avro Schemas

Avro স্কিমাতে বিভিন্ন ধরনের ডেটা স্ট্রাকচার থাকতে পারে। এগুলো হল:

  • record: এটি সাধারণত ডেটার একটি রেকর্ড গঠন প্রকাশ করে।
  • enum: এটি একটি নির্দিষ্ট মানের তালিকা প্রকাশ করে (যেমন: "low", "medium", "high")।
  • fixed: এটি একটি নির্দিষ্ট আকারের বাইনারি ডেটা প্রকাশ করে (যেমন: 16-বাইট বাইনারি ডেটা)।
  • primitive types: এগুলি মৌলিক ডেটা টাইপ যা স্কিমাতে ব্যবহার করা যেতে পারে, যেমন int, long, string, float, boolean, double, ইত্যাদি।

Avro Data Types

Avro স্কিমাতে যে ডেটা টাইপগুলি ব্যবহার করা যেতে পারে, সেগুলি প্রধানত primitive types এবং complex types এ বিভক্ত।

১. Primitive Data Types

এগুলি সিম্পল ডেটা টাইপ, যেগুলি কোনো স্ট্রাকচার বা নেস্টেড গঠন ছাড়া সরাসরি ব্যবহার করা হয়। Avro-তে কিছু সাধারণ primitive types:

  • null: এটি একটি শূন্য মান।
  • boolean: সত্য (true) বা মিথ্যা (false) মান।
  • int: 32-বিট পূর্ণসংখ্যা।
  • long: 64-বিট পূর্ণসংখ্যা।
  • float: 32-বিট ভগ্নাংশ সংখ্যা।
  • double: 64-বিট ভগ্নাংশ সংখ্যা।
  • bytes: বাইনারি ডেটা (যেমন: ইমেজ বা ফাইল ডেটা)।
  • string: ইউনিকোড স্ট্রিং।

২. Complex Data Types

Avro স্কিমাতে কিছু complex types রয়েছে, যেগুলি আরেকটি ডেটা স্ট্রাকচার ধারণ করতে পারে। এই ধরনের ডেটা টাইপগুলির মধ্যে রয়েছে:

  • record: এটি একটি কাস্টম ডেটা স্ট্রাকচার যা বিভিন্ন ধরনের ফিল্ড ধারণ করে। একটি record ফিল্ড হিসেবে অন্য records, arrays বা maps ধারণ করতে পারে।

    উদাহরণ:

    {
       "type": "record",
       "name": "Employee",
       "fields": [
          {"name": "id", "type": "int"},
          {"name": "name", "type": "string"},
          {"name": "position", "type": "string"}
       ]
    }
    
  • enum: এটি একটি নির্দিষ্ট সেটের মধ্যে মানের একটি তালিকা ধারণ করে, যেগুলি স্কিমায় উল্লেখ করা হয়। উদাহরণস্বরূপ, আপনি যদি কোনো স্ট্যাটাস নির্বাচন করেন, যেমন "active", "inactive", বা "pending", তাহলে এটি একটি enum টাইপ হতে পারে।

    উদাহরণ:

    {
       "type": "enum",
       "name": "Status",
       "symbols": ["active", "inactive", "pending"]
    }
    
  • array: এটি একটি একমাত্র ডেটা টাইপের একটি তালিকা ধারণ করে। একে ব্যবহার করে আপনি একটি ডেটার একাধিক মান সংরক্ষণ করতে পারেন।

    উদাহরণ:

    {
       "type": "array",
       "items": "string"
    }
    
  • map: এটি একটি কীগুলির মাধ্যমে মানের একটি ডেটা স্ট্রাকচার ধারণ করে। এটি সাধারণত হ্যাশম্যাপ বা ডিকশনারির মতো কাজ করে, যেখানে কীগুলির ধরন string এবং মানের ধরন নির্ধারণ করা যায়।

    উদাহরণ:

    {
       "type": "map",
       "values": "string"
    }
    

৩. Union Types

Avro স্কিমাতে union টাইপ ব্যবহার করে একাধিক টাইপের মধ্যে মানের নির্বাচন করা যায়। একটি union টাইপের মধ্যে একাধিক primitive বা complex types থাকতে পারে।

এখানে একটি উদাহরণ দেখানো হলো:

{
   "type": "record",
   "name": "Person",
   "fields": [
      {"name": "name", "type": "string"},
      {"name": "age", "type": ["null", "int"]},
      {"name": "address", "type": "string"}
   ]
}

এখানে, age ফিল্ডটি null অথবা int হতে পারে, অর্থাৎ এটা optional।


Avro Schema Design Best Practices

  1. Use Simple Types: প্রাথমিক ডেটা টাইপগুলি (যেমন: string, int, long, ইত্যাদি) ব্যবহার করুন, যতটা সম্ভব জটিল ডেটা স্ট্রাকচার এড়িয়ে চলুন।
  2. Avoid Large Records: একে বারে বড় রেকর্ড ব্যবহার না করে, ছোট ছোট রেকর্ড ব্যবহার করুন, যা ডেটা প্রক্রিয়াকরণে সুবিধাজনক।
  3. Use Schema Evolution: স্কিমা ইভোলিউশনের জন্য backward এবং forward compatibility নিশ্চিত করতে চেষ্টা করুন।
  4. Document Your Schema: স্কিমার প্রতিটি ফিল্ড এবং টাইপের ব্যাখ্যা লিখুন, যাতে ভবিষ্যতে এটি ব্যবহারের ক্ষেত্রে কোন সমস্যা না হয়।

সারাংশ

Avro Schema Design একটি গুরুত্বপূর্ণ অংশ, যেহেতু এটি ডেটার কাঠামো এবং টাইপ নির্ধারণ করে। Avro স্কিমা JSON ফরম্যাটে তৈরি হয়, যেখানে বিভিন্ন ধরনের primitive types এবং complex types যেমন record, enum, array, এবং map ব্যবহার করা যায়। স্কিমা ডিজাইন করার সময় union টাইপ, schema evolution এবং best practices মনে রাখা গুরুত্বপূর্ণ। Avro-তে বিভিন্ন ধরনের ডেটা স্ট্রাকচার এবং টাইপ ব্যবহারের মাধ্যমে ডেটা খুবই দক্ষতার সাথে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা যায়, যা ডিস্ট্রিবিউটেড সিস্টেমে কার্যকরীভাবে কাজ করে।

Content added By

Avro একটি স্কিমা-ভিত্তিক ডেটা সিরিয়ালাইজেশন ফরম্যাট যা মূলত বিভিন্ন ধরনের ডেটা সিরিয়ালাইজ করার জন্য ব্যবহৃত হয়। Avro-এর প্রাইমিটিভ ডেটা টাইপগুলি হল সেই মৌলিক ডেটা ধরনের যা ডেটার সহজ এবং সরল গঠন সংরক্ষণ করে। এই টাইপগুলো প্রাথমিকভাবে ডেটার বিভিন্ন ধরণ এবং তার মান নির্ধারণ করে, এবং এগুলো Avro স্কিমায় ডেটা স্টোরেজ এবং ট্রান্সফার কার্যক্রমকে সহজ করে তোলে।

Avro-তে কয়েকটি Primitive Data Types রয়েছে, যেমন int, long, string, boolean, ইত্যাদি, যা ডেটা কাঠামোতে ব্যবহৃত হয়।


Avro Primitive Data Types

১. null

  • null ডেটা টাইপের মান কিছুই হতে পারে না।
  • এটি সাধারণত ডেটার উপস্থিতি চিহ্নিত করার জন্য ব্যবহার করা হয়, যেমন এক্ষেত্রে ডেটা গায়েব বা অনুপস্থিত।
  • ব্যবহার: যখন কোনো ফিল্ডের মান না থাকার প্রয়োজন হয়, তখন null ব্যবহৃত হয়।

উদাহরণ:

{
  "type": "record",
  "name": "Person",
  "fields": [
    {
      "name": "middleName",
      "type": "null"
    }
  ]
}

২. boolean

  • boolean ডেটা টাইপ দুটি মানে থাকতে পারে: true বা false
  • এটি সাধারণত যে কোনো ধরনের দুটি বিকল্পের মধ্যে নির্বাচন করতে ব্যবহৃত হয়, যেমন সক্রিয় বা নিষ্ক্রিয়।

উদাহরণ:

{
  "type": "record",
  "name": "User",
  "fields": [
    {
      "name": "isActive",
      "type": "boolean"
    }
  ]
}

৩. int

  • int ডেটা টাইপ 32-বিট সইযুক্ত পূর্ণসংখ্যা (signed integer) হিসেবে কাজ করে।
  • এটি সাধারণত ছোট সংখ্যাগুলির জন্য ব্যবহৃত হয়, যেমন 0 থেকে ২ বিলিয়ন পর্যন্ত।

উদাহরণ:

{
  "type": "record",
  "name": "Item",
  "fields": [
    {
      "name": "quantity",
      "type": "int"
    }
  ]
}

৪. long

  • long ডেটা টাইপ 64-বিট সইযুক্ত পূর্ণসংখ্যা (signed integer)।
  • এটি বড় সংখ্যাগুলির জন্য ব্যবহৃত হয়, যেমন ২ বিলিয়ন থেকে ৯৪০ একত্রিত ত্রিশ হাজার কোটি পর্যন্ত।

উদাহরণ:

{
  "type": "record",
  "name": "Transaction",
  "fields": [
    {
      "name": "transactionId",
      "type": "long"
    }
  ]
}

৫. float

  • float ডেটা টাইপ 32-বিট ভাসমান দশমিক সংখ্যা (floating-point number)।
  • এটি সাধারণত গাণিতিক হিসাবের জন্য ব্যবহৃত হয়, যেখানে কম সংবেদনশীলতা প্রয়োজন হয়।

উদাহরণ:

{
  "type": "record",
  "name": "Product",
  "fields": [
    {
      "name": "price",
      "type": "float"
    }
  ]
}

৬. double

  • double ডেটা টাইপ 64-বিট ভাসমান দশমিক সংখ্যা (floating-point number)।
  • এটি float এর তুলনায় আরও সুনির্দিষ্ট এবং বড় দশমিক সংখ্যা ধারণ করতে পারে।

উদাহরণ:

{
  "type": "record",
  "name": "Measurement",
  "fields": [
    {
      "name": "height",
      "type": "double"
    }
  ]
}

৭. bytes

  • bytes ডেটা টাইপ বাইনারি ডেটা বা বাইটের স্ট্রিং সংরক্ষণ করে। এটি সাধারণত ছবি, অডিও, ভিডিও, বা অন্য যেকোনো বাইনারি ফাইল সংরক্ষণ করতে ব্যবহৃত হয়।
  • এটি কোনও অক্ষর বা স্ট্রিং হিসেবে ডেটা রাখার পরিবর্তে বাইনারি কোড হিসেবে ডেটা ধারণ করে।

উদাহরণ:

{
  "type": "record",
  "name": "Media",
  "fields": [
    {
      "name": "imageData",
      "type": "bytes"
    }
  ]
}

৮. string

  • string ডেটা টাইপ পাঠ্য বা টেক্সট ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়।
  • এটি Unicode স্ট্রিং ধারণ করে, যা বিভিন্ন ভাষার ক্যারেক্টার সাপোর্ট করে।

উদাহরণ:

{
  "type": "record",
  "name": "Customer",
  "fields": [
    {
      "name": "name",
      "type": "string"
    }
  ]
}

সারাংশ

Avro-তে Primitive Data Types বিভিন্ন মৌলিক ডেটা ধরনের সমর্থন করে, যেমন null, boolean, int, long, float, double, bytes, এবং string। এগুলো ডেটার গঠন এবং স্ট্রাকচার নির্ধারণে সহায়তা করে এবং ডেটা সিরিয়ালাইজেশনের ক্ষেত্রে সহজতা ও কার্যকারিতা প্রদান করে। প্রতিটি প্রাইমিটিভ টাইপ ডেটার ধরন এবং গঠন স্পষ্টভাবে চিহ্নিত করে, যা ডেটা প্রসেসিং এবং ট্রান্সফারের জন্য অত্যন্ত গুরুত্বপূর্ণ।

Content added By

Avro হল একটি স্কিমা-ভিত্তিক ডেটা সিরিয়ালাইজেশন সিস্টেম, যা বিভিন্ন ধরনের ডেটা স্ট্রাকচার এবং টাইপ সাপোর্ট করে। Avro ডেটা স্টোরেজ এবং ট্রান্সফারের জন্য কয়েকটি complex data types ব্যবহার করে, যেমন record, enum, array, map, এবং union। এগুলি ডেটার গঠন নির্ধারণ করে এবং স্কিমার মাধ্যমে ডেটাকে সঠিকভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা সম্ভব করে।

এই সমস্ত ডেটা টাইপগুলি ব্যবহার করার মাধ্যমে আমরা জটিল ডেটা গঠন তৈরি করতে পারি, যা ডিস্ট্রিবিউটেড সিস্টেমে কার্যকরীভাবে ব্যবহার করা যায়।


১. Record (রেকর্ড)

Record হল একটি কমপ্লেক্স ডেটা টাইপ যা বিভিন্ন fields বা attributes ধারণ করে। এটি একটি অবজেক্টের মতো কাজ করে, যেখানে প্রতিটি ফিল্ডের নাম এবং ডেটা টাইপ উল্লেখ করা থাকে। Avro তে record টাইপের মাধ্যমে একটি গঠনগত (structured) ডেটা তৈরি করা হয়, যা নির্দিষ্ট স্কিমার মাধ্যমে নির্ধারিত।

স্কিমা উদাহরণ:

{
  "type": "record",
  "name": "Person",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int"},
    {"name": "email", "type": "string"}
  ]
}

এখানে, Person নামে একটি রেকর্ড তৈরি করা হয়েছে, যেখানে তিনটি ফিল্ড রয়েছে: name, age, এবং email

ব্যবহার:

  • Record ব্যবহার করে ডেটা স্ট্রাকচার তৈরি করা হয় যেখানে একাধিক ফিল্ড থাকে।
  • এটি সাধারণত অবজেক্টের গঠন সংজ্ঞায়িত করতে ব্যবহৃত হয়।

২. Enum (এনাম)

Enum হল একটি ডেটা টাইপ যা একাধিক নির্ধারিত মানের মধ্যে একটি মান নির্বাচন করতে ব্যবহৃত হয়। এটি সাধারণত একটি তালিকা বা কনস্ট্যান্টের সেট তৈরি করতে ব্যবহৃত হয়। Avro তে enum ব্যবহার করে আপনি নির্দিষ্ট ভ্যালুগুলির একটি সেট তৈরি করতে পারেন, যেগুলি ডেটা ভ্যালু হিসেবে ব্যবহার করা হবে।

স্কিমা উদাহরণ:

{
  "type": "enum",
  "name": "Status",
  "symbols": ["ACTIVE", "INACTIVE", "PENDING"]
}

এখানে, Status নামে একটি এনাম ডিফাইন করা হয়েছে, যার তিনটি মান আছে: ACTIVE, INACTIVE, এবং PENDING

ব্যবহার:

  • Enum ব্যবহার করে নির্দিষ্ট মানের সেট তৈরি করা হয়, যেগুলির মধ্যে থেকে একটি নির্বাচন করা হয়।
  • সাধারণত, স্থির কনস্ট্যান্ট বা স্টেটস (যেমন: ACTIVE, INACTIVE) মডেল করার জন্য ব্যবহার হয়।

৩. Array (এরে)

Array হল একটি ডেটা টাইপ যা একাধিক মান ধারণ করে, যেখানে সব মান একই ডেটা টাইপের হয়। Avro তে array ব্যবহার করে একই ধরনের ডেটা একটি লিস্ট বা অ্যারে আকারে ধারণ করা হয়।

স্কিমা উদাহরণ:

{
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "emails", "type": {"type": "array", "items": "string"}}
  ]
}

এখানে, emails একটি অ্যারে যা string ধরনের একাধিক ইমেইল ধারণ করতে পারে।

ব্যবহার:

  • Array ব্যবহার করে একাধিক একই ধরনের ডেটা একত্রে ধারণ করা যায়। এটি তালিকা বা সংগ্রহের (collection) জন্য উপযুক্ত।
  • এটি ডেটার ভ্যারিয়েন্ট বা সংখ্যা অনুযায়ী ডেটা উপস্থাপন করতে ব্যবহৃত হয়।

৪. Map (ম্যাপ)

Map হল একটি ডেটা টাইপ যা কীগুলোর সাথে মান সংরক্ষণ করে। এটি একটি মানচিত্রের মতো কাজ করে যেখানে প্রতিটি কীগুলির সাথে সম্পর্কিত একটি মান থাকে। Avro তে map ব্যবহার করে আমরা কীগুলির সাথে মান সংরক্ষণ করতে পারি, যেগুলি নির্দিষ্ট টাইপের।

স্কিমা উদাহরণ:

{
  "type": "record",
  "name": "Config",
  "fields": [
    {"name": "settings", "type": {"type": "map", "values": "string"}}
  ]
}

এখানে, settings নামক একটি map তৈরি করা হয়েছে, যার মান string টাইপের। এতে কীগুলির সাথে মান সংরক্ষণ করা হবে।

ব্যবহার:

  • Map ব্যবহার করে কীগুলির সাথে মান সংরক্ষণ করা হয়, যা ডাইনামিক ডেটা গঠনের জন্য উপযুক্ত।
  • এটি একাধিক কীগুলির মান সংরক্ষণ করতে ব্যবহৃত হয়, যেখানে কীগুলি নির্দিষ্ট হতে পারে এবং মান পরিবর্তনশীল।

৫. Union (ইউনিয়ন)

Union হল একটি ডেটা টাইপ যা একাধিক টাইপের মধ্যে যেকোনো একটি মান গ্রহণ করতে পারে। এটি একটি প্রকারের মধ্যে একাধিক মান হতে পারে। Avro তে union ব্যবহার করা হয় যখন একাধিক ডেটা টাইপের মধ্যে কোনো একটি টাইপ হতে পারে।

স্কিমা উদাহরণ:

{
  "type": "record",
  "name": "Item",
  "fields": [
    {"name": "value", "type": ["string", "int"]}
  ]
}

এখানে, value ফিল্ডটি string অথবা int হতে পারে, অর্থাৎ এটি union টাইপ ব্যবহার করেছে, যা একাধিক টাইপের মান গ্রহণ করতে পারে।

ব্যবহার:

  • Union ব্যবহার করে একাধিক ডেটা টাইপের মধ্যে যেকোনো একটি টাইপ সংরক্ষণ করা হয়।
  • এটি এমন ক্ষেত্রের জন্য উপযুক্ত যেখানে ডেটা ভ্যালু বিভিন্ন টাইপের মধ্যে হতে পারে।

সারাংশ

Avro তে complex data types যেমন record, enum, array, map, এবং union ডেটার গঠন এবং ভ্যারিয়েশন তৈরি করতে ব্যবহৃত হয়। এগুলির মাধ্যমে আমরা ডেটাকে আরও শক্তিশালী এবং নমনীয়ভাবে ডিজাইন করতে পারি, যা ডিস্ট্রিবিউটেড সিস্টেমে এবং বড় ডেটা প্রক্রিয়াকরণের জন্য খুবই কার্যকরী। প্রতিটি টাইপ আলাদা আলাদা প্রয়োজনে ব্যবহার করা হয়, যেমন:

  • Record: গঠনমূলক ডেটার জন্য।
  • Enum: সীমিত মানের সেটের জন্য।
  • Array: একাধিক সমান টাইপের মান ধারণ করার জন্য।
  • Map: কীগুলির সাথে মান সংরক্ষণের জন্য।
  • Union: একাধিক ডেটা টাইপের মধ্যে যেকোনো একটি টাইপ ধারণ করার জন্য।

Avro এর মাধ্যমে এইসব কমপ্লেক্স ডেটা টাইপ ব্যবহারে ডেটার গঠন অনেক বেশি নমনীয় ও সুষম হয়।

Content added By

Avro স্কিমার কম্প্যাটিবিলিটি এমন একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা স্কিমা পরিবর্তন (schema evolution) পরিচালনা করতে সাহায্য করে, বিশেষ করে ডিস্ট্রিবিউটেড সিস্টেম এবং বড় ডেটা প্রসেসিং সিস্টেমে। Avro-তে স্কিমা কম্প্যাটিবিলিটি বিভিন্ন উপায়ে ব্যাখ্যা করা হয়: Backward Compatibility, Forward Compatibility, এবং Full Compatibility। এগুলোর মাধ্যমে স্কিমা পরিবর্তন বা আপডেটের পরও ডেটার সঠিকতা এবং উপযোগিতা বজায় রাখা যায়।


১. Backward Compatibility (পেছনে-কম্প্যাটিবিলিটি)

Backward Compatibility নিশ্চিত করে যে নতুন স্কিমার সাথে ডেটা পুরোনো স্কিমা অনুযায়ী পাঠ করা যাবে। অর্থাৎ, যদি নতুন স্কিমায় কিছু পরিবর্তন করা হয়, তবে পুরোনো স্কিমায় ডেটা পড়ার ক্ষমতা বজায় থাকে।

Backwards Compatible হলে, নতুন স্কিমাতে কিছু ফিল্ড যুক্ত করা যেতে পারে বা কিছু ফিল্ডের ডিফল্ট মান দেওয়া যেতে পারে, কিন্তু পুরোনো স্কিমা অনুযায়ী ডেটা এখনও সঠিকভাবে রিড (read) করা যাবে।

এটি কিভাবে কাজ করে:

  • পুরোনো স্কিমার সাথে নতুন স্কিমার সংযুক্ত করা হলে, পুরোনো স্কিমায় যেসব ফিল্ড ছিল, সেগুলোর মান এখনও নতুন স্কিমায় পাওয়া যাবে, যদিও নতুন স্কিমায় কিছু অতিরিক্ত ফিল্ড থাকতে পারে।
  • নতুন স্কিমায় কোনো ফিল্ড অতিরিক্ত থাকলে, পূর্ববর্তী ডেটা সেই ফিল্ড বাদ দিয়েও সঠিকভাবে রিড করা যাবে, যদি ডিফল্ট মান নির্ধারণ করা থাকে।

উদাহরণ:

  • পুরোনো স্কিমায় "age" নামে একটি ফিল্ড ছিল এবং নতুন স্কিমায় "age" এর সাথে "address" নামে নতুন একটি ফিল্ড যুক্ত করা হয়েছে। নতুন স্কিমা পূর্ববর্তী ডেটাকে সঠিকভাবে গ্রহণ করবে, কারণ "age" ফিল্ডটি পরিবর্তন করা হয়নি।

২. Forward Compatibility (সামনের দিকে-কম্প্যাটিবিলিটি)

Forward Compatibility নিশ্চিত করে যে, পুরোনো স্কিমা দিয়ে নতুন স্কিমা অনুযায়ী ডেটা সঠিকভাবে রিড করা যাবে। এটি মূলত নতুন স্কিমার থেকে পুরোনো স্কিমায় ডেটার রিডিংকে সঠিকভাবে পরিচালনা করার ক্ষমতা।

Forward Compatible হলে, পুরোনো স্কিমার মাধ্যমে নতুন স্কিমার সাথে রিডিং করা সম্ভব হয়, যেহেতু নতুন স্কিমায় অতিরিক্ত ফিল্ড থাকতে পারে, এবং পুরোনো স্কিমা সেগুলোকে উপেক্ষা করতে পারে বা ডিফল্ট মান ব্যবহার করতে পারে।

এটি কিভাবে কাজ করে:

  • নতুন স্কিমায় অতিরিক্ত ফিল্ড থাকতে পারে যা পুরোনো স্কিমায় নেই। কিন্তু পুরোনো স্কিমা দিয়ে সেই নতুন ফিল্ডকে অগ্রাহ্য করা হবে বা ডিফল্ট মান হিসেবে ধরা হবে।
  • পুরোনো স্কিমা দিয়ে নতুন স্কিমায় থাকা অতিরিক্ত তথ্যের প্রভাব ফেলা যাবে না।

উদাহরণ:

  • পুরোনো স্কিমায় "name" এবং "age" ফিল্ড ছিল, কিন্তু নতুন স্কিমায় "name", "age", এবং "address" ফিল্ডগুলো রয়েছে। পুরোনো স্কিমা দিয়ে "address" ফিল্ডটি উপেক্ষা করা হবে, এবং ডেটা সঠিকভাবে পাঠ করা যাবে।

৩. Full Compatibility (পূর্ণ-কম্প্যাটিবিলিটি)

Full Compatibility হল একটি সংমিশ্রণ, যেখানে Backward এবং Forward উভয় ধরনের কম্প্যাটিবিলিটি নিশ্চিত করা হয়। এটি নিশ্চিত করে যে, ডেটা যে কোন স্কিমা সংস্করণে পাঠানো ও পড়া যাবে, এবং স্কিমা ইভোলিউশন (schema evolution) প্রক্রিয়ায় কোনো সমস্যা তৈরি হবে না। এটি সর্বোত্তম কম্প্যাটিবিলিটি প্রদান করে এবং ডেটা প্রসেসিংয়ের ধারাবাহিকতা নিশ্চিত করে।

Full Compatible হলে, ডেটা পুরোনো স্কিমা বা নতুন স্কিমা উভয় অবস্থাতেই কাজ করবে এবং সব ফিল্ড সমানভাবে প্রসেস করা যাবে।

এটি কিভাবে কাজ করে:

  • নতুন স্কিমা পূর্ববর্তী স্কিমার মধ্যে যেকোনো পরিবর্তন করতে পারে, তবে সব ফিল্ডের মান ঠিকভাবে পাওয়া যাবে এবং কোন ভুল ঘটবে না।
  • স্কিমার কোনো একটি অংশের পরিবর্তন বা সংশোধন করলে, পুরোনো এবং নতুন স্কিমা উভয় দ্বারা একই ডেটা ব্যবহৃত হতে পারে।

উদাহরণ:

  • পুরোনো স্কিমায় "name", "age" ছিল, এবং নতুন স্কিমায় "name", "age", "address" রয়েছে। যদি "address" ফিল্ডটির জন্য ডিফল্ট মান দেওয়া থাকে, তবে এটি পুরোনো স্কিমার মাধ্যমে সঠিকভাবে রিড করা যাবে, আর নতুন স্কিমা "address" ফিল্ডটি গ্রহণ করবে।

সারাংশ

Avro স্কিমার কম্প্যাটিবিলিটি ডেটা ইভোলিউশনের ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে। Backward Compatibility, Forward Compatibility, এবং Full Compatibility এর মাধ্যমে ডেটা এবং স্কিমার পরিবর্তনসমূহ সঠিকভাবে পরিচালিত হয় এবং ডিস্ট্রিবিউটেড সিস্টেমের মধ্যে ডেটার ধারাবাহিকতা বজায় থাকে। এগুলো নিশ্চিত করে যে, বিভিন্ন স্কিমা সংস্করণে ডেটা সঠিকভাবে রিড এবং রাইট করা যাবে, যা দীর্ঘমেয়াদী ডেটা ব্যবস্থাপনার জন্য অপরিহার্য।

Content added By

Schema Evolution এবং Versioning Avro-এর অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য। এই দুটি ধারণা মূলত ডেটা স্কিমাতে পরিবর্তন আনার ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে, বিশেষ করে যখন ডিস্ট্রিবিউটেড সিস্টেমে ডেটা প্রক্রিয়া করা হয়। Avro-এর মাধ্যমে স্কিমা ইভোলিউশন সম্ভব হয়, অর্থাৎ স্কিমাতে পরিবর্তন করা হলেও পুরানো ডেটা সঠিকভাবে ডেসিরিয়ালাইজ করা যেতে পারে।

এই গুণটি বিশেষভাবে গুরুত্বপূর্ণ যখন একটি সিস্টেমে নিয়মিতভাবে নতুন ফিচার এবং পরিবর্তন আনা হয় এবং পুরানো ডেটা রেখে নতুন স্কিমা অনুযায়ী কাজ চালিয়ে যেতে হয়।


Schema Evolution কী?

Schema Evolution এমন একটি প্রক্রিয়া যার মাধ্যমে একটি ডেটার স্কিমাতে পরিবর্তন আনা হয়, কিন্তু পুরানো ডেটা তার পূর্ণতা বজায় রেখে নতুন স্কিমার সাথে সামঞ্জস্যপূর্ণ থাকে। Avro এটি সমর্থন করে এবং ব্যবহারকারীদের তাদের ডেটার কাঠামো পরিবর্তন করার সুযোগ প্রদান করে, এক্ষেত্রে পুরানো ডেটা সম্পূর্ণভাবে অক্ষুন্ন থাকে।

Avro-তে স্কিমা ইভোলিউশন সাপোর্টের ফলে পূর্ববর্তী স্কিমা এবং নতুন স্কিমা উভয়কেই একসাথে ব্যবহার করা সম্ভব হয়।


Schema Evolution এর জন্য Avro কীভাবে কাজ করে?

Avro-তে স্কিমা ইভোলিউশনের সুবিধা পাওয়ার জন্য একটি স্কিমা রেজিস্ট্রি ব্যবহৃত হয়, যা পুরানো এবং নতুন স্কিমার মধ্যে তুলনা করে এবং কোন কোন পরিবর্তন অনুমোদিত তা নির্ধারণ করে। যখন কোনো স্কিমা পরিবর্তন করা হয়, তখন তা স্কিমা রেজিস্ট্রিতে সঞ্চিত হয় এবং ডেটা প্রসেসিংয়ের সময় প্রয়োজনীয় স্কিমা নির্বাচন করা হয়।

কিছু সাধারণ পরিবর্তন যা Avro সমর্থন করে:

  1. ফিল্ড যুক্ত বা অপসারণ করা: নতুন ফিল্ড যোগ করা বা পুরানো ফিল্ড অপসারণ করা।
  2. ফিল্ডের ডেটা টাইপ পরিবর্তন: ফিল্ডের ডেটা টাইপ পরিবর্তন করা (যেমন, একটি ফিল্ডকে string থেকে int এ পরিবর্তন করা)।
  3. ডিফল্ট মান যোগ করা: নতুন ফিল্ডের জন্য ডিফল্ট মান নির্ধারণ করা, যাতে পুরানো ডেটা সঠিকভাবে ডেসিরিয়ালাইজ করা যায়।

Avro Schema Evolution এর উদাহরণ

ধরা যাক, আপনার একটি স্কিমা ছিল যেটি শুধুমাত্র id এবং name ফিল্ড ধারণ করত। এখন, আপনি একটি নতুন ফিল্ড, age যোগ করতে চান। এটি করা সম্ভব, এবং পুরানো ডেটা ঠিকঠাক কাজ করবে, যেহেতু নতুন ফিল্ডের জন্য একটি ডিফল্ট মান দেওয়া হবে।

পুরানো স্কিমা (Version 1)

{
  "type": "record",
  "name": "Employee",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"}
  ]
}

নতুন স্কিমা (Version 2)

{
  "type": "record",
  "name": "Employee",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int", "default": 30}
  ]
}

এখানে, age ফিল্ডটি নতুনভাবে যোগ করা হয়েছে এবং এর জন্য একটি ডিফল্ট মান (30) নির্ধারণ করা হয়েছে। এর ফলে পুরানো স্কিমার ডেটাও সঠিকভাবে প্রসেস হতে থাকবে।


Schema Versioning কী?

Schema Versioning হল একটি কৌশল যার মাধ্যমে একটি নির্দিষ্ট ডেটা স্কিমার বিভিন্ন সংস্করণ সংরক্ষণ করা হয়, যাতে ডেটা প্রসেসিংয়ে স্কিমার পূর্ববর্তী সংস্করণগুলোকে সমর্থন করা যায়। যখন স্কিমায় পরিবর্তন আনা হয়, তখন তার একটি নতুন সংস্করণ তৈরি হয়, যাতে স্কিমার প্রতিটি সংস্করণের রেকর্ড রাখা যায় এবং ব্যবহার করা যায়।

Avro-তে Versioning এর ভূমিকা:

  1. স্কিমার রিভিশন ট্র্যাকিং: যখন স্কিমা পরিবর্তন করা হয়, প্রতিটি সংস্করণের জন্য একটি নতুন স্কিমা রিভিশন তৈরি হয়। স্কিমা রেজিস্ট্রিতে প্রতিটি সংস্করণের হালনাগাদ তথ্য সংরক্ষিত থাকে।
  2. স্কিমা রিভিশন: যখন স্কিমার মধ্যে কোনো পরিবর্তন হয়, Avro নতুন সংস্করণের জন্য রিভিশন নম্বর জেনারেট করে। এটি নতুন এবং পুরানো সংস্করণের মধ্যে সঠিক ম্যাচ খুঁজে বের করতে সাহায্য করে।

উদাহরণ: স্কিমা সংস্করণ

ধরা যাক, প্রথম স্কিমা সংস্করণ ছিল এমন:

{
  "type": "record",
  "name": "Employee",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"}
  ]
}

এবং দ্বিতীয় সংস্করণে, একটি নতুন ফিল্ড যোগ করা হয়েছে:

{
  "type": "record",
  "name": "Employee",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int", "default": 30}
  ]
}

Avro একে একটি নতুন সংস্করণ হিসেবে ট্র্যাক করবে এবং পুরানো ডেটাকে নতুন স্কিমা অনুযায়ী প্রসেস করবে।


Schema Evolution এবং Versioning-এ কিছু সাধারণ নিয়ম

  1. নতুন ফিল্ড যোগ করা: নতুন ফিল্ড যোগ করা হলে, তাকে একটি ডিফল্ট মান দিতে হবে। যদি ডিফল্ট মান না দেওয়া হয়, তবে এটি পুরানো ডেটার সাথে সামঞ্জস্যপূর্ণ হবে না।
  2. ফিল্ড মুছে ফেলা: যদি কোনো ফিল্ড মুছে ফেলা হয়, তবে পুরানো স্কিমার ডেটা সেই ফিল্ডটি মিস করবে। এই কারণে, ফিল্ড মুছে ফেলার আগে এটি গুরুত্ব সহকারে বিবেচনা করা উচিত।
  3. ফিল্ড টাইপ পরিবর্তন করা: একটি ফিল্ডের টাইপ পরিবর্তন করা হলে, এই পরিবর্তনটি পুরানো ডেটার সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে। এটি শুধুমাত্র তখনই করা উচিত যখন আপনি নিশ্চিত যে সমস্ত ডেটা নতুন টাইপের সাথে সামঞ্জস্যপূর্ণ।

সারাংশ

Schema Evolution এবং Versioning অ্যাপাচি অ্যাভ্রোর (Apache Avro) গুরুত্বপূর্ণ বৈশিষ্ট্য যা স্কিমাতে পরিবর্তন আনা হলেও পুরানো ডেটা সঠিকভাবে প্রসেস করার ক্ষমতা প্রদান করে। Avro স্কিমা ইভোলিউশনের মাধ্যমে নতুন ফিল্ড যোগ করা, পুরানো ফিল্ড অপসারণ করা এবং ডিফল্ট মান প্রদান করার মতো পরিবর্তন করা সম্ভব, যা স্কিমা সংস্করণের সমর্থন করে। স্কিমা ইভোলিউশনের মাধ্যমে ডেটা সঠিকভাবে প্রসেসিংয়ের সুবিধা মিললেও, কিছু সীমাবদ্ধতা এবং নিয়ম রয়েছে, যা নির্দিষ্টভাবে মেনে চলতে হয়।

Content added By
Promotion

Are you sure to start over?

Loading...