BQ ব্যবহার করে স্নোফ্লেক থেকে স্প্যানারে ETL বিপরীত করুন

১. গুগল ক্লাউড স্টোরেজ এবং বিগকোয়েরি ব্যবহার করে স্নোফ্লেক থেকে স্প্যানার পর্যন্ত একটি রিভার্স ইটিএল পাইপলাইন তৈরি করুন।

ভূমিকা

এই কোডল্যাবে, স্নোফ্লেক থেকে স্প্যানার পর্যন্ত একটি রিভার্স ইটিএল পাইপলাইন তৈরি করা হয়েছে। প্রচলিতভাবে, ইটিএল (এক্সট্র্যাক্ট, ট্রান্সফর্ম, লোড) পাইপলাইনগুলো ডেটা অ্যানালিটিক্সের জন্য অপারেশনাল ডেটাবেস থেকে স্নোফ্লেকের মতো ডেটা ওয়্যারহাউসে স্থানান্তর করে। একটি রিভার্স ইটিএল পাইপলাইন এর বিপরীত কাজ করে: এটি ডেটা ওয়্যারহাউস থেকে সংগৃহীত ও প্রক্রিয়াজাত ডেটাকে আবার অপারেশনাল সিস্টেমে ফিরিয়ে নিয়ে আসে, যেখানে এটি অ্যাপ্লিকেশনগুলোকে শক্তি জোগাতে, ব্যবহারকারী-মুখী ফিচার সরবরাহ করতে, অথবা রিয়েল-টাইম সিদ্ধান্ত গ্রহণের জন্য ব্যবহৃত হতে পারে।

লক্ষ্য হলো একটি একত্রিত ডেটাসেটকে স্নোফ্লেক আইসবার্গ টেবিল থেকে স্প্যানারে স্থানান্তর করা, যা উচ্চ-প্রাপ্যতা সম্পন্ন অ্যাপ্লিকেশনের জন্য আদর্শ একটি বিশ্বব্যাপী বিতরণকৃত রিলেশনাল ডেটাবেস।

এটি অর্জন করতে, মধ্যবর্তী ধাপ হিসেবে গুগল ক্লাউড স্টোরেজ (GCS) এবং বিগকোয়েরি ব্যবহার করা হয়। নিচে ডেটা প্রবাহের একটি বিশদ বিবরণ এবং এই আর্কিটেকচারের পেছনের যুক্তি তুলে ধরা হলো:

  1. আইসবার্গ ফরম্যাটে স্নোফ্লেক থেকে গুগল ক্লাউড স্টোরেজ (GCS):
  • প্রথম ধাপ হলো Snowflake থেকে ডেটা একটি উন্মুক্ত ও সুসংজ্ঞায়িত ফরম্যাটে বের করে আনা। টেবিলটি Apache Iceberg ফরম্যাটে এক্সপোর্ট করা হয়। এই প্রক্রিয়ায় মূল ডেটা একগুচ্ছ Parquet ফাইল হিসেবে এবং টেবিলের মেটাডেটা (স্কিমা, পার্টিশন, ফাইলের অবস্থান) JSON ও Avro ফাইল হিসেবে লেখা হয়। GCS-এ এই সম্পূর্ণ টেবিল কাঠামোটি স্টেজিং করার ফলে ডেটাটি পোর্টেবল হয় এবং Iceberg ফরম্যাট বোঝে এমন যেকোনো সিস্টেমের কাছে তা অ্যাক্সেসযোগ্য হয়ে ওঠে।
  1. GCS-এর Iceberg টেবিলগুলোকে BigQuery BigLake এক্সটার্নাল টেবিলে রূপান্তর করুন:
  • GCS থেকে সরাসরি স্প্যানারে ডেটা লোড করার পরিবর্তে, BigQuery-কে একটি শক্তিশালী মধ্যস্থতাকারী হিসেবে ব্যবহার করা হয়। আপনি BigQuery-তে একটি BigLake এক্সটার্নাল টেবিল তৈরি করবেন যা সরাসরি GCS-এর Iceberg মেটাডেটা ফাইলকে নির্দেশ করবে। এই পদ্ধতির বেশ কিছু সুবিধা রয়েছে:
  • ডেটার পুনরাবৃত্তি হয় না: BigQuery মেটাডেটা থেকে টেবিলের কাঠামো পড়ে এবং Parquet ডেটা ফাইলগুলোকে ইনজেস্ট না করেই সরাসরি কোয়েরি করে, যা উল্লেখযোগ্য পরিমাণে সময় এবং স্টোরেজ খরচ বাঁচায়।
  • ফেডারেটেড কোয়েরি: এর মাধ্যমে GCS ডেটার উপর জটিল SQL কোয়েরি চালানো যায়, ঠিক যেমনটি একটি নেটিভ BigQuery টেবিলের ক্ষেত্রে করা হয়।
  1. BigQuery থেকে স্প্যানার:
  • চূড়ান্ত ধাপটি হলো BigQuery থেকে Spanner-এ ডেটা স্থানান্তর করা। আপনি BigQuery-এর একটি শক্তিশালী বৈশিষ্ট্য, EXPORT DATA কোয়েরি ব্যবহার করে এটি সম্পন্ন করবেন, যা হলো "রিভার্স ETL" ধাপ।
  • অপারেশনাল প্রস্তুতি: স্প্যানার ট্রানজ্যাকশনাল ওয়ার্কলোডের জন্য ডিজাইন করা হয়েছে, যা অ্যাপ্লিকেশনগুলির জন্য শক্তিশালী সামঞ্জস্যতা এবং উচ্চ প্রাপ্যতা প্রদান করে। ডেটা স্প্যানারে স্থানান্তর করার মাধ্যমে, এটি ব্যবহারকারী-মুখী অ্যাপ্লিকেশন, এপিআই এবং অন্যান্য অপারেশনাল সিস্টেমগুলির কাছে অ্যাক্সেসযোগ্য হয়ে ওঠে, যেগুলির জন্য কম-লেটেন্সি পয়েন্ট লুকআপ প্রয়োজন।
  • স্কেলেবিলিটি: এই প্যাটার্নটি BigQuery-এর বিশ্লেষণাত্মক ক্ষমতাকে কাজে লাগিয়ে বিশাল ডেটাসেট প্রসেস করতে এবং তারপর Spanner-এর বিশ্বব্যাপী স্কেলেবল পরিকাঠামোর মাধ্যমে দক্ষতার সাথে ফলাফল পরিবেশন করতে সাহায্য করে।

পরিষেবা এবং পরিভাষা

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

আপনি যা শিখবেন

  • স্নোফ্লেকে কীভাবে ডেটা লোড করবেন
  • কীভাবে একটি GCS বাকেট তৈরি করবেন
  • কীভাবে একটি Snowflake টেবিলকে Iceberg ফরম্যাটে GCS-এ এক্সপোর্ট করবেন
  • কীভাবে একটি স্প্যানার ইনস্ট্যান্স সেট আপ করবেন
  • BigQuery ব্যবহার করে Spanner-এ BigLake এক্সটার্নাল টেবিলগুলো কীভাবে লোড করবেন

২. স্থাপন, প্রয়োজনীয়তা ও সীমাবদ্ধতা

পূর্বশর্ত

  • একটি স্নোফ্লেক অ্যাকাউন্ট
  • BigQuery থেকে Spanner-এ ডেটা এক্সপোর্ট করার জন্য BigQuery Enterprise-tier বা তার চেয়ে উচ্চতর স্তরের রিজার্ভেশনসহ একটি Google Cloud অ্যাকাউন্ট প্রয়োজন।
  • ওয়েব ব্রাউজারের মাধ্যমে গুগল ক্লাউড কনসোলে প্রবেশ
  • গুগল ক্লাউড সিএলআই কমান্ড চালানোর জন্য একটি টার্মিনাল।
  • যদি আপনার গুগল ক্লাউড অর্গানাইজেশনে iam.allowedPolicyMemberDomains পলিসিটি সক্রিয় থাকে, তাহলে একজন অ্যাডমিনিস্ট্রেটরকে বাইরের ডোমেইনের সার্ভিস অ্যাকাউন্টগুলোকে অনুমতি দেওয়ার জন্য একটি ব্যতিক্রমী অনুমোদন দিতে হতে পারে। প্রযোজ্য ক্ষেত্রে, এই বিষয়টি পরবর্তী ধাপে আলোচনা করা হবে।

সীমাবদ্ধতা

এই পাইপলাইনে যে নির্দিষ্ট সীমাবদ্ধতা এবং ডেটা টাইপের অসামঞ্জস্যতা দেখা দিতে পারে, সে সম্পর্কে সচেতন থাকা গুরুত্বপূর্ণ।

তুষারকণা থেকে হিমশৈল

Snowflake এবং Iceberg-এর মধ্যে কলাম ডেটা টাইপ ভিন্ন। এগুলোর মধ্যে ডেটা টাইপ পরিবর্তনের তথ্য Snowflake ডকুমেন্টেশনে পাওয়া যায়।

আইসবার্গ থেকে বিগকোয়েরি

BigQuery ব্যবহার করে Iceberg টেবিল কোয়েরি করার ক্ষেত্রে কিছু সীমাবদ্ধতা রয়েছে। সম্পূর্ণ তালিকার জন্য BigQuery ডকুমেন্টেশন দেখুন। উল্লেখ্য যে, BIGNUMERIC , INTERVAL , JSON , RANGE বা GEOGRAPHY মতো টাইপগুলো বর্তমানে সমর্থিত নয়।

BigQuery থেকে স্প্যানার

BigQuery থেকে Spanner-এ EXPORT DATA কমান্ডটি সব BigQuery ডেটা টাইপ সমর্থন করে না। নিম্নলিখিত টাইপগুলো সহ একটি টেবিল এক্সপোর্ট করলে একটি ত্রুটি দেখা দেবে:

  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME

এছাড়াও, যদি BigQuery প্রজেক্টটি GoogleSQL ডায়ালেক্ট ব্যবহার করে, তাহলে Spanner-এ এক্সপোর্ট করার জন্য নিম্নলিখিত নিউমেরিক টাইপগুলোও সমর্থিত নয়:

  • BIGNUMERIC

সীমাবদ্ধতার একটি সম্পূর্ণ এবং হালনাগাদ তালিকার জন্য, অফিসিয়াল ডকুমেন্টেশন দেখুন: স্প্যানারে এক্সপোর্ট করার সীমাবদ্ধতা

তুষারকণা

এই কোডল্যাবের জন্য, আপনি আপনার বিদ্যমান স্নোফ্লেক অ্যাকাউন্ট ব্যবহার করতে পারেন, অথবা একটি ফ্রি ট্রায়াল অ্যাকাউন্ট তৈরি করে নিতে পারেন।

গুগল ক্লাউড প্ল্যাটফর্ম আইএএম অনুমতি

এই কোডল্যাবের সমস্ত ধাপগুলি সম্পাদন করার জন্য গুগল অ্যাকাউন্টের নিম্নলিখিত অনুমতিগুলির প্রয়োজন হবে।

পরিষেবা অ্যাকাউন্ট

iam.serviceAccountKeys.create

সার্ভিস অ্যাকাউন্ট তৈরি করার সুযোগ দেয়।

স্প্যানার

spanner.instances.create

একটি নতুন স্প্যানার ইনস্ট্যান্স তৈরি করার সুযোগ দেয়।

spanner.databases.create

DDL স্টেটমেন্ট চালানোর মাধ্যমে তৈরি করার অনুমতি দেয়

spanner.databases.updateDdl

ডাটাবেসে টেবিল তৈরি করার জন্য DDL স্টেটমেন্ট চালানোর সুযোগ দেয়।

গুগল ক্লাউড স্টোরেজ

storage.buckets.create

এক্সপোর্ট করা Parquet ফাইলগুলো সংরক্ষণ করার জন্য একটি নতুন GCS বাকেট তৈরি করার সুযোগ দেয়।

storage.objects.create

এক্সপোর্ট করা Parquet ফাইলগুলোকে GCS বাকেটে লেখার অনুমতি দেয়।

storage.objects.get

BigQuery-কে GCS বাকেট থেকে Parquet ফাইলগুলো পড়ার অনুমতি দেয়।

storage.objects.list

BigQuery-কে GCS বাকেটে থাকা Parquet ফাইলগুলির তালিকা তৈরি করার অনুমতি দেয়।

ডেটাফ্লো

Dataflow.workitems.lease

ডেটাফ্লো থেকে ওয়ার্ক আইটেম দাবি করার সুযোগ দেয়।

Dataflow.workitems.sendMessage

ডেটাফ্লো ওয়ার্কারকে ডেটাফ্লো সার্ভিসে বার্তা ফেরত পাঠানোর অনুমতি দেয়।

Logging.logEntries.create

ডেটাফ্লো ওয়ার্কারদের গুগল ক্লাউড লগিং-এ লগ এন্ট্রি লেখার অনুমতি দেয়।

সুবিধার জন্য, এই অনুমতিগুলো অন্তর্ভুক্ত থাকা পূর্বনির্ধারিত ভূমিকাগুলো ব্যবহার করা যেতে পারে।

roles/resourcemanager.projectIamAdmin

roles/iam.serviceAccountKeyAdmin

roles/spanner.instanceAdmin

roles/spanner.databaseAdmin

roles/storage.admin

roles/dataflow.serviceAgent

roles/dataflow.worker

roles/dataflow.serviceAgent

পুনঃব্যবহারযোগ্য বৈশিষ্ট্য সেটআপ করুন

এই ল্যাব জুড়ে কয়েকটি মানের বারবার প্রয়োজন হবে। কাজটি সহজ করার জন্য, আমরা এই মানগুলোকে শেল ভেরিয়েবলে সেট করে রাখব, যা পরে ব্যবহার করা যাবে।

  • GCP_REGION - এটি সেই নির্দিষ্ট অঞ্চল যেখানে GCP রিসোর্সগুলো অবস্থিত হবে। অঞ্চলগুলোর তালিকা এখানে পাওয়া যাবে।
  • GCP_PROJECT - ব্যবহারযোগ্য GCP প্রজেক্ট আইডি।
  • GCP_BUCKET_NAME - যে GCS বাকেটটি তৈরি করা হবে তার নাম, এবং যেখানে ডেটা ফাইলগুলো সংরক্ষণ করা হবে।
export GCP_REGION = <GCP REGION HERE> 
export GCP_PROJECT= <GCP PROJECT HERE>
export GCS_BUCKET_NAME = <GCS BUCKET NAME HERE>
export SPANNER_INSTANCE = <SPANNER INSTANCE ID HERE>
export SPANNER_DB = <SPANNER DATABASE ID HERE>

গুগল ক্লাউড প্রজেক্ট

প্রজেক্ট হলো গুগল ক্লাউডে ব্যবস্থাপনার একটি মৌলিক একক। যদি কোনো প্রশাসক ব্যবহারের জন্য একটি প্রজেক্ট প্রদান করে থাকেন, তবে এই ধাপটি এড়িয়ে যাওয়া যেতে পারে।

এইভাবে CLI ব্যবহার করে একটি প্রজেক্ট তৈরি করা যায়:

gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT

প্রজেক্ট তৈরি ও পরিচালনা সম্পর্কে এখানে আরও জানুন।

স্প্যানার সেট আপ করুন

স্প্যানার ব্যবহার শুরু করতে, আপনাকে একটি ইনস্ট্যান্স এবং একটি ডেটাবেস প্রোভিশন করতে হবে। স্প্যানার ইনস্ট্যান্স কনফিগার এবং তৈরি করার বিষয়ে বিস্তারিত তথ্য এখানে পাওয়া যাবে।

ইনস্ট্যান্স তৈরি করুন

gcloud spanner instances create $SPANNER_INSTANCE \
--config=regional-$GCP_REGION \
--description="Codelabs Snowflake RETL" \
--processing-units=100 \
--edition=ENTERPRISE

ডাটাবেস তৈরি করুন

gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE

৩. একটি গুগল ক্লাউড স্টোরেজ বাকেট তৈরি করুন

Snowflake দ্বারা তৈরি Parquet ডেটা ফাইল এবং Iceberg মেটাডেটা সংরক্ষণের জন্য Google Cloud Storage (GCS) ব্যবহার করা হবে। এর জন্য, ফাইল গন্তব্য হিসেবে ব্যবহারের জন্য প্রথমে একটি নতুন বাকেট তৈরি করতে হবে। আপনার স্থানীয় মেশিনের একটি টার্মিনাল উইন্ডো থেকে, এই ধাপগুলো অনুসরণ করুন।

বালতি তৈরি করুন

একটি নির্দিষ্ট অঞ্চলে (যেমন us-central1) স্টোরেজ বাকেট তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন।

gcloud storage buckets create gs://$GCS_BUCKET_NAME --location=$GCP_REGION

বাকেট তৈরি যাচাই করুন

কমান্ডটি সফল হলে, সমস্ত বাকেট তালিকাভুক্ত করে ফলাফলটি যাচাই করুন। নতুন বাকেটটি ফলাফলের তালিকায় দেখা যাবে। বাকেট রেফারেন্সগুলিতে সাধারণত বাকেটের নামের সামনে gs:// উপসর্গটি দেখা যায়।

gcloud storage ls | grep gs://$GCS_BUCKET_NAME

লেখার অনুমতি পরীক্ষা করুন

এই ধাপটি নিশ্চিত করে যে স্থানীয় পরিবেশটি সঠিকভাবে প্রমাণীকৃত এবং নতুন তৈরি করা বাকেটে ফাইল লেখার জন্য প্রয়োজনীয় অনুমতি রয়েছে।

echo "Hello, GCS" | gcloud storage cp - gs://$GCS_BUCKET_NAME/hello.txt

আপলোড করা ফাইলটি যাচাই করুন

বাকেটে থাকা অবজেক্টগুলো তালিকাভুক্ত করুন। এইমাত্র আপলোড করা ফাইলটির সম্পূর্ণ পাথ দেখা যাবে।

gcloud storage ls gs://$GCS_BUCKET_NAME

আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:

gs://$GCS_BUCKET_NAME/hello.txt

একটি বাকেটের মধ্যে থাকা কোনো অবজেক্টের বিষয়বস্তু দেখতে, gcloud storage cat ব্যবহার করা যেতে পারে।

gcloud storage cat gs://$GCS_BUCKET_NAME/hello.txt

ফাইলটির বিষয়বস্তু দৃশ্যমান হওয়া উচিত:

Hello, GCS

টেস্ট ফাইলটি পরিষ্কার করুন

The Cloud Storage bucket is now set up. The temporary test file can now be deleted.

gcloud storage rm gs://$GCS_BUCKET_NAME/hello.txt

আউটপুটটি মুছে ফেলার বিষয়টি নিশ্চিত করবে:

Removing gs://$GCS_BUCKET_NAME/hello.txt...
/ [1 objects]
Operation completed over 1 objects.

৪. স্নোফ্লেক থেকে জিসিএস-এ রপ্তানি করা

এই ল্যাবের জন্য, আপনি TPC-H ডেটাসেটটি ব্যবহার করবেন, যা ডিসিশন সাপোর্ট সিস্টেমের জন্য একটি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড বেঞ্চমার্ক। এর স্কিমা গ্রাহক, অর্ডার, সরবরাহকারী এবং যন্ত্রাংশ সহ একটি বাস্তবসম্মত ব্যবসায়িক পরিবেশের মডেল তৈরি করে, যা এটিকে একটি বাস্তব-জগতের অ্যানালিটিক্স এবং ডেটা মুভমেন্ট সিনারিও প্রদর্শনের জন্য উপযুক্ত করে তোলে। এই ডেটাসেটটি সমস্ত স্নোফ্লেক অ্যাকাউন্টে ডিফল্টরূপে উপলব্ধ।

কাঁচা, নর্মালাইজড TPC-H টেবিলগুলো ব্যবহার করার পরিবর্তে, আপনি একটি নতুন, অ্যাগ্রিগেটেড টেবিল তৈরি করবেন। এই নতুন টেবিলটি orders , customer এবং nation টেবিলগুলো থেকে ডেটা যুক্ত করে জাতীয় বিক্রয়ের মোট পরিমাণের একটি ডিনরমালাইজড ও সংক্ষিপ্ত চিত্র তৈরি করবে। ডেটা অ্যাগ্রিগেশনের এই পূর্ব-ধাপটি অ্যানালিটিক্সে একটি প্রচলিত পদ্ধতি, কারণ এটি একটি নির্দিষ্ট ব্যবহারের জন্য ডেটাকে প্রস্তুত করে—এই ক্ষেত্রে, কোনো অপারেশনাল অ্যাপ্লিকেশনের ব্যবহারের জন্য।

স্নোফ্লেককে গুগল ক্লাউড স্টোরেজ অ্যাক্সেস করার অনুমতি দিন

Snowflake-কে GCS বাকেটে ডেটা লেখার অনুমতি দেওয়ার জন্য দুটি জিনিস তৈরি করতে হবে: একটি এক্সটার্নাল ভলিউম এবং প্রয়োজনীয় অনুমতি

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

একটি ডাটাবেস তৈরি করুন

  1. বাম দিকের মেনুতে, Horizon Catalog-এর নিচে থাকা Catalog-এর উপর মাউস রাখুন, তারপর Database Explorer- এ ক্লিক করুন।
  2. ডেটাবেস পৃষ্ঠায় গেলে, উপরের ডানদিকে থাকা + ডেটাবেস বোতামটিতে ক্লিক করুন।
  3. নতুন ডেটাবেসটির নাম দিন codelabs_retl_db

একটি ওয়ার্কশীট তৈরি করুন

ডাটাবেসে sql কমান্ড চালানোর জন্য ওয়ার্কশিটের প্রয়োজন হবে।

একটি ওয়ার্কশিট তৈরি করতে:

  1. বাম দিকের মেনুতে, ‘Work with data’-এর নিচে ‘Projects’-এর উপর মাউস রাখুন, তারপর ‘Workspaces’- এ ক্লিক করুন।
  2. My Workspaces সাইড বারের নিচে, + Add new বাটনে ক্লিক করুন এবং SQL File নির্বাচন করুন।

একটি বাহ্যিক ভলিউম তৈরি করুন

ভলিউমটি তৈরি করতে একটি Snowflake ওয়ার্কশিটে নিম্নলিখিত কমান্ডটি চালান।

CREATE EXTERNAL VOLUME codelabs_retl_ext_vol
STORAGE_LOCATIONS = 
(
  (
    NAME = 'codelabs_retl_ext_vol'
    STORAGE_PROVIDER = 'GCS'
    STORAGE_BASE_URL = 'gcs://<Your bucket name>/snowflake_extvol'
  )
); 

স্নোফ্লেক সার্ভিস অ্যাকাউন্টটি নিন

নতুন তৈরি করা এক্সটার্নাল ভলিউমটির বর্ণনা ( DESC ) দিন, তাহলে Snowflake এটির জন্য যে অনন্য সার্ভিস অ্যাকাউন্টটি তৈরি করেছে তা পেয়ে যাবেন।

DESC EXTERNAL VOLUME codelabs_retl_ext_vol;
  1. ফলাফল প্যানে, json properties-এর মধ্যে property_value এন্ট্রিটি খুঁজুন, যেটিতে "NAME":"codelabs_retl_ext_vol" দিয়ে শুরু হওয়া একটি JSON স্ট্রিং রয়েছে।
  2. json অবজেক্টের মধ্যে STORAGE_GCP_SERVICE_ACCOUNT প্রপার্টিটি খুঁজুন এবং এর মানটি কপি করুন (এটি একটি ইমেল ঠিকানার মতো দেখতে হবে)। এটি হলো সেই সার্ভিস অ্যাকাউন্ট আইডেন্টিফায়ার, যেটির GCS বাকেটে অ্যাক্সেস প্রয়োজন।
  3. পরবর্তীতে পুনরায় ব্যবহারের জন্য এই সার্ভিস অ্যাকাউন্টটি আপনার শেল ইনস্ট্যান্সের একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন।
export GCP_SERVICE_ACCOUNT=<Your service account>

স্নোফ্লেককে GCS অনুমতি প্রদান করুন

এখন, Snowflake সার্ভিস অ্যাকাউন্টকে GCS বাকেটে লেখার অনুমতি দিতে হবে।

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.objectAdmin"

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.legacyBucketReader"

স্নোফ্লেকে অ্যাক্সেস যাচাই করুন

Snowflake ওয়ার্কশিটে ফিরে গিয়ে, এই কমান্ডটি চালিয়ে যাচাই করুন যে Snowflake এখন সফলভাবে GCS বাকেটের সাথে সংযোগ করতে পারছে।

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('codelabs_retl_ext_vol');

ফলাফলটি একটি JSON অবজেক্ট হবে, যার মধ্যে "success":true অন্তর্ভুক্ত থাকবে।

Snowflake-এর এক্সটার্নাল ভলিউম সম্পর্কে আরও তথ্যের জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন।

নমুনা অর্ডারের ডেটা রপ্তানি করুন

এখন আপনি Snowflake-এ একটি Iceberg টেবিল তৈরি করতে পারেন। নিম্নলিখিত কমান্ডটি Snowflake-কে একটি কোয়েরি চালাতে এবং Iceberg ফরম্যাট ব্যবহার করে GCS-এ ফলাফল সংরক্ষণ করতে নির্দেশ দেয়। ডেটা ফাইলগুলো Parquet ফরম্যাটে এবং মেটাডেটা Avro ও JSON ফরম্যাটে থাকবে, যা codelabs_retl_ext_vol এক্সটার্নাল ভলিউম দ্বারা নির্ধারিত স্থানে সংরক্ষিত হবে।

একটি ডাটাবেস তৈরি করুন

  1. বাম দিকের মেনুতে, Horizon Catalog-এর নিচে থাকা Catalog-এর উপর মাউস রাখুন, তারপর Database Explorer- এ ক্লিক করুন।
  2. ডেটাবেস পৃষ্ঠায় গেলে, উপরের ডানদিকে থাকা + ডেটাবেস বোতামটিতে ক্লিক করুন।
  3. নতুন ডেটাবেসটির নাম দিন codelabs_retl_db
USE DATABASE codelabs_retl_db; 

CREATE ICEBERG TABLE REGIONAL_SALES_ICEBERG (
    NATION_NAME STRING,
    MARKET_SEGMENT STRING,
    ORDER_YEAR INTEGER,
    ORDER_PRIORITY STRING,
    TOTAL_ORDER_COUNT INTEGER,
    TOTAL_REVENUE NUMBER(24,2),
    UNIQUE_CUSTOMER_COUNT INTEGER
) 
EXTERNAL_VOLUME = 'codelabs_retl_ext_vol'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'regional_sales_iceberg'
AS (
    SELECT 
        n.n_name AS nation_name,
        c.c_mktsegment AS market_segment,
        YEAR(o.o_orderdate) AS order_year,
        o.o_orderpriority AS order_priority,
        COUNT(o.o_orderkey) AS total_order_count,
        ROUND(SUM(o.o_totalprice), 2) AS total_revenue,
        COUNT(DISTINCT c.c_custkey) AS unique_customer_count
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.orders AS o
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.customer AS c 
        ON o.o_custkey = c.c_custkey
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.nation AS n
        ON c.c_nationkey = n.n_nationkey
    GROUP BY 
        n.n_name, 
        c.c_mktsegment, 
        YEAR(o.o_orderdate), 
        o.o_orderpriority
);

Snowflake ব্যবহার করে Iceberg টেবিল তৈরি ও পরিচালনা সম্পর্কে আরও তথ্যের জন্য, অফিসিয়াল ডকুমেন্টেশন দেখুন।

GCP-তে ডেটা যাচাই করুন

এখন GCS বাকেটটি পরীক্ষা করুন। Snowflake দ্বারা তৈরি ফাইলগুলো সেখানে দেখা যাওয়ার কথা। এটি নিশ্চিত করে যে এক্সপোর্টটি সফল হয়েছে। Iceberg মেটাডেটা metadata ফোল্ডারে এবং আসল ডেটা Parquet ফাইল হিসেবে data ফোল্ডারে পাওয়া যাবে।

gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**"

ফাইলের নামগুলো ভিন্ন হতে পারে, কিন্তু কাঠামোটি দেখতে এইরকম হবে:

gs://$GCS_BUCKET_NAME/snowflake_extvol/
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/data/snow_cbsKIRmdDmo_wLg128fugxg_0_2_009.parquet
...
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/metadata/00001-62f831ff-6708-4494-94c5-c891b7ad447f.metadata.json
...

ডেটা এখন স্নোফ্লেক থেকে আইসবার্গ ফরম্যাটে গুগল ক্লাউড স্টোরেজে কপি করা হয়েছে।

যেহেতু আমাদের কাছে এই তালিকাটি আছে, চলুন metadata.json ফাইলটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সেভ করে রাখি, কারণ পরে আমাদের এটি প্রয়োজন হবে।

export GCS_METADATA_JSON=$(gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**" | grep .metadata.json)

৫. একটি BigQuery এক্সটার্নাল টেবিল কনফিগার করুন

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

বিগলেক হলো একটি স্টোরেজ ইঞ্জিন যা বিগকোয়েরিতে এমন টেবিল তৈরি করতে দেয়, যা গুগল ক্লাউড স্টোরেজের মতো বাহ্যিক উৎস থেকে সরাসরি ডেটা পড়তে পারে। এই ল্যাবের জন্য, এটিই মূল প্রযুক্তি যা বিগকোয়েরিকে ডেটা ইনজেস্ট করার প্রয়োজন ছাড়াই সদ্য এক্সপোর্ট করা আইসবার্গ টেবিলটি বুঝতে সক্ষম করে।

এটি কার্যকর করতে দুটি উপাদানের প্রয়োজন:

  1. ক্লাউড রিসোর্স কানেকশন: এটি BigQuery এবং GCS-এর মধ্যে একটি সুরক্ষিত সংযোগ। এটি প্রমাণীকরণ পরিচালনার জন্য একটি বিশেষ সার্ভিস অ্যাকাউন্ট ব্যবহার করে, যা নিশ্চিত করে যে GCS বাকেট থেকে ফাইলগুলি পড়ার জন্য BigQuery-এর প্রয়োজনীয় অনুমতি রয়েছে।
  2. এক্সটার্নাল টেবিল ডেফিনিশন: এটি BigQuery-কে বলে দেয় যে GCS-এ Iceberg টেবিলের মেটাডেটা ফাইলটি কোথায় খুঁজে পাওয়া যাবে এবং সেটিকে কীভাবে ব্যাখ্যা করা উচিত।

গুগল ক্লাউড স্টোরেজের সাথে একটি সংযোগ কনফিগার করুন

প্রথমে, BigQuery-কে GCS অ্যাক্সেস করার অনুমতি দেয় এমন সংযোগটি তৈরি করা হবে। এই কমান্ডটি BigQuery-এর মধ্যে একটি সংযোগ রিসোর্স তৈরি করে।

bq mk \
  --connection \
  --project_id=$GCP_PROJECT \
  --location=$GCP_REGION \
  --connection_type=CLOUD_RESOURCE \
  codelabs-retl-connection

সাফল্য দেখতে অনেকটা এইরকম হবে:

Connection 12345678.region.codelabs-retl-connection successfully created

BigQuery-তে ক্লাউড রিসোর্স সংযোগ সম্পর্কে আরও তথ্য Google Cloud ডকুমেন্টেশনে পাওয়া যাবে।

ডেটা পড়ার জন্য BigQuery সংযোগকে অনুমোদন দিন

নতুন BigQuery কানেকশনটির নিজস্ব একটি সার্ভিস অ্যাকাউন্ট রয়েছে, যেটির Google Cloud Storage বাকেট থেকে ডেটা পড়ার জন্য অনুমতি প্রয়োজন।

১. কানেকশন সার্ভিস অ্যাকাউন্টটি সংগ্রহ করুন

প্রথমে, সদ্য তৈরি করা সংযোগটি থেকে পরিষেবা অ্যাকাউন্ট আইডিটি নিন:

bq show \
  --location $GCP_REGION \
  --connection codelabs-retl-connection

ফলাফলে মিলে যাওয়া সংযোগগুলোর একটি সারণি দেখানো হবে।

পরবর্তীতে ব্যবহারের জন্য serviceAccountId কে একটি এনভায়রনমেন্ট ভেরিয়েবলে সেট করা যাক।

export GCP_BQ_SERVICE_ACCOUNT=<Your service account email>

২. অনুমতি প্রদান

নিম্নলিখিত কমান্ডটি চালিয়ে সার্ভিস অ্যাকাউন্টকে GCS বাকেটের ডেটা দেখার অনুমোদন দিন।

gcloud storage buckets add-iam-policy-binding \
  gs://$GCS_BUCKET_NAME \
  --member serviceAccount:$GCP_BQ_SERVICE_ACCOUNT \
  --role roles/storage.objectViewer

এক্সটার্নাল টেবিল তৈরি করুন

এখন, BigQuery-তে BigLake এক্সটার্নাল টেবিলটি তৈরি করুন। এই কমান্ডটি কোনো ডেটা স্থানান্তর করে না। এটি কেবল GCS-এ বিদ্যমান ডেটার দিকে একটি পয়েন্টার তৈরি করে। Snowflake দ্বারা তৈরি করা .metadata.json ফাইলগুলোর মধ্যে একটির পাথ প্রয়োজন হবে।

bq mk --dataset --location=$GCP_REGION codelabs_retl

bq mk \
    --table \
    --location=$GCP_REGION \
--external_table_definition=ICEBERG=$GCS_METADATA_JSON@projects/$GCP_PROJECT/locations/$GCP_REGION/connections/codelabs-retl-connection \
    codelabs_retl.regional_sales

BigQuery-তে ডেটা যাচাই করুন

এই টেবিলটি এখন অন্য যেকোনো BigQuery টেবিলের মতোই সাধারণ SQL ব্যবহার করে কোয়েরি করা যাবে। BigQuery তাৎক্ষণিকভাবে GCS থেকে Parquet ফাইলগুলো পড়ার জন্য কানেকশনটি ব্যবহার করবে।

bq query \
  --location=$GCP_REGION \
  --nouse_legacy_sql "SELECT * FROM \`$GCP_PROJECT.codelabs_retl.regional_sales\` LIMIT 10;"

৬. BigQuery থেকে Spanner-এ ডেটা ইম্পোর্ট করা: চূড়ান্ত ধাপ

পাইপলাইনের চূড়ান্ত এবং সবচেয়ে গুরুত্বপূর্ণ অংশে পৌঁছানো গেছে: বিগলেক টেবিল থেকে স্প্যানারে ডেটা স্থানান্তর করা। এটি হলো "রিভার্স ইটিএল" ধাপ, যেখানে ডেটা ওয়্যারহাউসে প্রক্রিয়াজাত ও সংকলিত হওয়ার পর, অ্যাপ্লিকেশনগুলোর ব্যবহারের জন্য ডেটা একটি অপারেশনাল সিস্টেমে লোড করা হয়।

স্প্যানার হলো একটি সম্পূর্ণভাবে পরিচালিত, বিশ্বব্যাপী বিতরণযোগ্য রিলেশনাল ডেটাবেস। এটি একটি প্রচলিত রিলেশনাল ডেটাবেসের মতো লেনদেনগত সামঞ্জস্য প্রদান করে, কিন্তু এর সাথে রয়েছে NoSQL ডেটাবেসের মতো অনুভূমিক প্রসারণযোগ্যতা। এই কারণে এটি প্রসারণযোগ্য এবং উচ্চ প্রাপ্যতা সম্পন্ন অ্যাপ্লিকেশন তৈরির জন্য একটি আদর্শ পছন্দ।

প্রক্রিয়াটি হবে:

  1. স্প্যানার ডেটাবেসে ডেটার কাঠামোর সাথে মেলে এমন একটি টেবিল স্কিমা তৈরি করুন।
  2. BigLake টেবিল থেকে সরাসরি Spanner টেবিলে ডেটা লোড করতে একটি BigQuery EXPORT DATA কোয়েরি চালান।

স্প্যানার টেবিল তৈরি করুন

BigQuery থেকে ডেটা স্থানান্তর করার আগে, Spanner-এ একটি সামঞ্জস্যপূর্ণ স্কিমা সহ একটি গন্তব্য টেবিল তৈরি করতে হবে।

gcloud spanner databases ddl update $SPANNER_DB \
  --instance=$SPANNER_INSTANCE \
  --ddl="$(cat <<EOF
CREATE TABLE regional_sales (
    nation_name STRING(MAX),
    market_segment STRING(MAX),
    order_year INT64,
    order_priority STRING(MAX),
    total_order_count INT64,
    total_revenue NUMERIC,
    unique_customer_count INT64
) PRIMARY KEY (nation_name, market_segment, order_year, order_priority);
EOF
)"

BigQuery থেকে ডেটা রপ্তানি করুন

এটিই চূড়ান্ত ধাপ। BigQuery BigLake টেবিলে সোর্স ডেটা প্রস্তুত থাকলে এবং Spanner-এ ডেস্টিনেশন টেবিল তৈরি হয়ে গেলে, প্রকৃত ডেটা স্থানান্তর আশ্চর্যজনকভাবে সহজ। একটিমাত্র BigQuery SQL কোয়েরি ব্যবহার করা হবে: EXPORT DATA .

এই কোয়েরিটি বিশেষভাবে এই ধরনের পরিস্থিতির জন্যই ডিজাইন করা হয়েছে। এটি একটি BigQuery টেবিল (BigLake টেবিলের মতো বাহ্যিক টেবিলগুলো সহ) থেকে দক্ষতার সাথে একটি বাহ্যিক গন্তব্যে ডেটা এক্সপোর্ট করে। এক্ষেত্রে, গন্তব্যটি হলো Spanner টেবিল।

bq query --location=$GCP_REGION --use_legacy_sql=false <<EOF
EXPORT DATA OPTIONS (
uri="https://spanner.googleapis.com/projects/${GCP_PROJECT}/instances/${SPANNER_INSTANCE}/databases/${SPANNER_DB}",
  format='CLOUD_SPANNER',
  spanner_options="""{ 
      "table": "regional_sales", 
      "priority": "HIGH" 
      }"""
) AS 
SELECT * FROM \`${PROJECT_ID}.codelabs_retl.regional_sales\`
EOF

কোয়েরিটি শেষ হলে, রেজাল্টস প্যানে "আপডেট সম্পন্ন হয়েছে" লেখাটি দেখা যাবে।

৭. স্প্যানারে ডেটা যাচাই করুন

অভিনন্দন! একটি সম্পূর্ণ রিভার্স ইটিএল পাইপলাইন সফলভাবে তৈরি এবং কার্যকর করা হয়েছে। চূড়ান্ত ধাপ হলো ডেটা প্রত্যাশা অনুযায়ী স্প্যানারে পৌঁছেছে কিনা তা যাচাই করা।

gcloud spanner databases execute-sql \
  --instance=$SPANNER_INSTANCE \
  $SPANNER_DB \
  --sql='SELECT * FROM regional_sales LIMIT 10'

আমদানিকৃত নমুনা ডেটা অনুরোধ অনুযায়ী প্রদর্শিত হচ্ছে:

nation_name  market_segment  order_year  order_priority   total_order_count  total_revenue  unique_customer_count
ALGERIA      AUTOMOBILE      1992        1-URGENT         375                59232423.66    298
ALGERIA      AUTOMOBILE      1992        2-HIGH           328                47371891.08    269
ALGERIA      AUTOMOBILE      1992        3-MEDIUM         346                52823195.87    262
ALGERIA      AUTOMOBILE      1992        4-NOT SPECIFIED  365                52935998.34    288
ALGERIA      AUTOMOBILE      1992        5-LOW            380                54920263.68    293
ALGERIA      AUTOMOBILE      1993        1-URGENT         394                63145618.78    312
ALGERIA      AUTOMOBILE      1993        2-HIGH           340                50737488.4     277
ALGERIA      AUTOMOBILE      1993        3-MEDIUM         383                55871057.46    298
ALGERIA      AUTOMOBILE      1993        4-NOT SPECIFIED  365                56424662.05    291
ALGERIA      AUTOMOBILE      1993        5-LOW            363                54673249.06    283

বিশ্লেষণাত্মক এবং পরিচালনগত ডেটা জগতের মধ্যকার ব্যবধান সফলভাবে পূরণ করা হয়েছে।

৮. পরিষ্কার-পরিচ্ছন্নতা

পরিষ্কার করুন স্প্যানার

স্প্যানার ডেটাবেস এবং ইনস্ট্যান্সটি মুছে ফেলুন।

gcloud spanner instances delete $SPANNER_INSTANCE

জিসিএস পরিষ্কার করুন

ডেটা হোস্ট করার জন্য তৈরি করা GCS Bucket-টি মুছে ফেলুন।

gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

BigQuery পরিষ্কার করুন

bq rm -r codelabs_retl
bq rm --connection --location=$GCP_REGION codelabs-retl-connection

স্নোফ্লেক পরিষ্কার করুন

ডাটাবেসটি মুছে ফেলুন

  1. বাম দিকের মেনুতে, Horizon Catalog-এর নিচে Catalog-এর উপর মাউস রাখুন, তারপর Database Explorer- এ ক্লিক করুন।
  2. CODELABS_RETL_DB ডাটাবেসের ডানদিকে থাকা ... চিহ্নে ক্লিক করে অপশনগুলো প্রসারিত করুন এবং ড্রপ (Drop) নির্বাচন করুন।
  3. পপ-আপ হওয়া কনফার্মেশন ডায়ালগ বক্সে, 'ড্রপ ডেটাবেস' নির্বাচন করুন।

ওয়ার্কবুকগুলো মুছে ফেলুন

  1. বাম দিকের মেনুতে, ‘Work with data’-এর নিচে ‘Projects’-এর উপর মাউস রাখুন, তারপর ‘Workspaces’-এ ক্লিক করুন।
  2. 'My Workspace' সাইড বারে, এই ল্যাবের জন্য ব্যবহৃত বিভিন্ন ওয়ার্কস্পেস ফাইলগুলির উপর মাউস রাখুন, তাহলে অতিরিক্ত অপশনগুলি দেখা যাবে এবং সেটিতে ক্লিক করুন
  3. প্রথমে ডিলিট নির্বাচন করুন, এবং তারপরে যে নিশ্চিতকরণ ডায়ালগটি পপ-আপ হবে, সেখানে আবার ডিলিট নির্বাচন করুন
  4. এই ল্যাবের জন্য আপনার তৈরি করা সমস্ত sql ওয়ার্কস্পেস ফাইলের ক্ষেত্রে এটি করুন।

বাহ্যিক ভলিউমগুলি মুছুন

  1. বাম দিকের মেনুতে, Horizon Catalog-এর নিচে থাকা Catalog-এর উপর মাউস রাখুন, তারপর External Data- তে ক্লিক করুন।
  2. ক্লিক করুন 227b3e306c3d609d.png CODELABS_RETL_EXT_VOL এর ডানদিকে, 'Drop external volume' নির্বাচন করুন, এবং তারপরে নিশ্চিতকরণ ডায়ালগে আবার 'Drop external volume'- এ ক্লিক করুন।

৯. অভিনন্দন

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন।

আমরা যা আলোচনা করেছি

  • স্নোফ্লেকে কীভাবে ডেটা লোড করবেন
  • কীভাবে একটি GCS বাকেট তৈরি করবেন
  • কীভাবে একটি Snowflake টেবিলকে CSV ফরম্যাটে GCS-এ এক্সপোর্ট করবেন
  • কীভাবে একটি স্প্যানার ইনস্ট্যান্স সেট আপ করবেন
  • ডেটাফ্লো ব্যবহার করে স্প্যানারে CSV টেবিল লোড করার পদ্ধতি