Workflows-এর সাথে সমান্তরালভাবে BigQuery কাজ চালানো

১. ভূমিকা

1c05e3d0c2bd2b45.png74be7b376d45258a.png

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

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

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

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

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

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে প্রজেক্ট আইডি অবশ্যই অনন্য হতে হবে এবং এটি অপরিবর্তনীয় (একবার সেট করার পর পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নাম্বার এবং কিছু এপিআই এটি ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর যাতে কোনো বিলিং না হয়, সেজন্য রিসোর্সগুলো বন্ধ করতে আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা পুরো প্রজেক্টটিই ডিলিট করে দিতে পারেন। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।

গুগল ক্লাউড কনসোল থেকে, উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনটিতে ক্লিক করুন:

55efc1aaa7a4d3ad.png

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

7ffe5cbb04455448.png

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

৩. উইকিপিডিয়া ডেটাসেট অন্বেষণ করুন

প্রথমে, BigQuery-তে উইকিপিডিয়া ডেটাসেটটি অন্বেষণ করুন।

গুগল ক্লাউড কনসোলের BigQuery বিভাগে যান:

ea75ab12a7c012a4.png

bigquery-samples অধীনে আপনি বিভিন্ন পাবলিক ডেটাসেট দেখতে পাবেন, যার মধ্যে উইকিপিডিয়া সম্পর্কিত কিছু ডেটাসেটও রয়েছে:

c9484e305b8e1438.png

wikipedia_pageviews ডেটাসেটের অধীনে, আপনি বিভিন্ন বছরের পেজ ভিউ সংক্রান্ত নানা সারণি দেখতে পাবেন:

c540a4162640cbb3.png

আপনি টেবিলগুলোর মধ্যে যেকোনো একটি (যেমন, 201207 ) নির্বাচন করে ডেটা প্রিভিউ করতে পারেন:

b5b2a334cd6f63c0.png

আপনি টেবিলটির বিরুদ্ধে কোয়েরিও চালাতে পারেন। উদাহরণস্বরূপ, এই কোয়েরিটি সর্বাধিক ভিউ পাওয়া শীর্ষ ১০০টি টাইটেল নির্বাচন করে:

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

কোয়েরিটি চালানোর পর ডেটা লোড হতে প্রায় ২০ সেকেন্ড সময় লাগে।

1df3877aed1653b4.png

৪. একাধিক কোয়েরি চালানোর জন্য একটি ওয়ার্কফ্লো নির্ধারণ করুন।

একটিমাত্র টেবিলের উপর কোয়েরি চালানো সহজ। তবে, একাধিক টেবিলের উপর একাধিক কোয়েরি চালানো এবং ফলাফল একত্রিত করা বেশ ক্লান্তিকর হয়ে উঠতে পারে। এই কাজে সাহায্য করার জন্য, ওয়ার্কফ্লো তার ইটারেশন সিনট্যাক্সের মাধ্যমে সহায়তা করতে পারে!

ক্লাউড শেলের ভিতরে, একাধিক টেবিলের উপর একাধিক কোয়েরি চালানোর জন্য একটি ওয়ার্কফ্লো তৈরি করতে workflow-serial.yaml ফাইলটি তৈরি করুন:

touch workflow-serial.yaml

এরপর আপনি ক্লাউড শেল-এর এডিটর দিয়ে ফাইলটি সম্পাদনা করতে পারবেন:

33bf9325b078ad8.png

workflow-serial.yaml ফাইলের প্রথম init ধাপে, টেবিলের নাম দিয়ে কী (key) ব্যবহার করে প্রতিটি ইটারেশনের হিসাব রাখার জন্য একটি results ম্যাপ তৈরি করুন। এছাড়াও, যে টেবিলগুলোর ওপর আপনি কোয়েরি চালাতে চান, সেগুলোর তালিকা দিয়ে একটি tables অ্যারে সংজ্ঞায়িত করুন। এক্ষেত্রে, আমরা ৫টি টেবিল বেছে নিচ্ছি:

main:
    steps:
    - init:
        assign:
            - results : {}
            - tables:
                - 201201h
                - 201202h
                - 201203h
                - 201204h
                - 201205h

এরপরে, একটি runQueries স্টেপ সংজ্ঞায়িত করুন। এই স্টেপটি প্রতিটি টেবিলের উপর পুনরাবৃত্তি করে এবং Workflows-এর BigQuery কানেক্টর ব্যবহার করে প্রতিটি টেবিলের সর্বাধিক পেজ ভিউ সহ শীর্ষ ১০০টি টাইটেল খুঁজে বের করার জন্য একটি কোয়েরি চালায়। তারপর এটি প্রতিটি টেবিল থেকে শীর্ষ টাইটেল এবং ভিউগুলো results ম্যাপে সংরক্ষণ করে:

    - runQueries:
        for:
            value: table
            in: ${tables}
            steps:
            - runQuery:
                call: googleapis.bigquery.v2.jobs.query
                args:
                    projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    body:
                        useLegacySql: false
                        useQueryCache: false
                        timeoutMs: 30000
                        # Find the top 100 titles with most views on Wikipedia
                        query: ${
                            "SELECT TITLE, SUM(views)
                            FROM `bigquery-samples.wikipedia_pageviews." + table + "`
                            WHERE LENGTH(TITLE) > 10
                            GROUP BY TITLE
                            ORDER BY SUM(VIEWS) DESC
                            LIMIT 100"
                            }
                result: queryResult
            - returnResult:
                assign:
                    # Return the top title from each table
                    - results[table]: {}
                    - results[table].title: ${queryResult.rows[0].f[0].v}
                    - results[table].views: ${queryResult.rows[0].f[1].v}

চূড়ান্ত ধাপে, results ম্যাপটি ফেরত দিন:

    - returnResults:
        return: ${results}

৫. ওয়ার্কফ্লো ব্যবহার করে একাধিক কোয়েরি চালান

ওয়ার্কফ্লোটি ডেপ্লয় এবং রান করার আগে, আপনাকে নিশ্চিত করতে হবে যে ওয়ার্কফ্লোস এপিআই (Workflows API) সক্রিয় করা আছে। আপনি এটি গুগল ক্লাউড কনসোল (Google Cloud Console) থেকে অথবা ক্লাউড শেল (Cloud Shell)-এ gcloud ব্যবহার করে সক্রিয় করতে পারেন:

gcloud services enable workflows.googleapis.com

ওয়ার্কফ্লো-এর জন্য একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন:

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

নিশ্চিত করুন যে সার্ভিস অ্যাকাউন্টের BigQuery জব লগ করার এবং চালানোর জন্য প্রয়োজনীয় ভূমিকা (role) রয়েছে:

PROJECT_ID=your-project-id
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/logging.logWriter \
  --role roles/bigquery.jobUser \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

সার্ভিস অ্যাকাউন্ট দিয়ে ওয়ার্কফ্লোটি ডিপ্লয় করুন:

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

অবশেষে, আপনি ওয়ার্কফ্লোটি চালানোর জন্য প্রস্তুত।

ক্লাউড কনসোলের Workflows সেকশনের অধীনে bigquery-serial ওয়ার্কফ্লোটি খুঁজুন এবং Execute বাটনে ক্লিক করুন:

b6afa4747680334f.png

বিকল্পভাবে, আপনি ক্লাউড শেলে gcloud ব্যবহার করে ওয়ার্কফ্লোটি চালাতে পারেন:

gcloud workflows run bigquery-serial

ওয়ার্কফ্লোটি সম্পন্ন হতে প্রায় ১ মিনিট সময় লাগবে (৫টি টেবিলের প্রতিটির জন্য ২০ সেকেন্ড)।

শেষে, আপনি প্রতিটি টেবিলের শীর্ষ শিরোনাম এবং ভিউ সহ আউটপুট দেখতে পাবেন:

304d11a5bffdada4.png

baf31533d3671c9e.png

৬. সমান্তরাল ধাপ ব্যবহার করে একাধিক কোয়েরিকে সমান্তরাল করুন।

পূর্ববর্তী ধাপের ওয়ার্কফ্লোটি সম্পন্ন হতে প্রায় ১ মিনিট সময় লেগেছিল, কারণ এটি ৫টি কোয়েরি চালিয়েছিল, যেগুলোর প্রতিটিতে ২০ সেকেন্ড করে সময় লেগেছিল। যেহেতু এগুলো স্বাধীন কোয়েরি, তাই আপনি ওয়ার্কফ্লো-এর প্যারালাল ইটারেশন ফিচারটি ব্যবহার করে এগুলোকে সমান্তরালভাবে চালাতে পারেন।

workflow-serial.yaml ফাইলটি কপি করে একটি নতুন workflow-parallel.yaml ফাইল তৈরি করুন। নতুন ফাইলটিতে, সিরিয়াল স্টেপগুলোকে প্যারালাল স্টেপে পরিণত করার জন্য আপনাকে কয়েকটি পরিবর্তন করতে হবে।

workflow-parallel.yaml ফাইলে, runQueries স্টেপটি পরিবর্তন করুন। প্রথমে, ` parallel কীওয়ার্ডটি যোগ করুন। এটি for লুপের প্রতিটি পুনরাবৃত্তিকে সমান্তরালভাবে চলতে সাহায্য করে। দ্বিতীয়ত, ` results ভেরিয়েবলটিকে একটি shared ভেরিয়েবল হিসেবে ঘোষণা করুন। এর ফলে একটি ব্রাঞ্চ এই ভেরিয়েবলটিতে লিখতে পারবে। আমরা প্রতিটি ফলাফল এই ভেরিয়েবলে যুক্ত করব।

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

সমান্তরাল কর্মপ্রবাহ স্থাপন করুন:

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ওয়ার্কফ্লোটি চালান:

gcloud workflows run bigquery-parallel

আপনি দেখবেন ওয়ার্কফ্লোটি সম্পন্ন হতে প্রায় ২০ সেকেন্ড সময় লাগছে। এর কারণ হলো, ৫টি কোয়েরিই সমান্তরালভাবে চলছে। মাত্র কয়েক লাইন কোড পরিবর্তনেই গতি ৫ গুণ পর্যন্ত বৃদ্ধি!

অবশেষে, আপনি প্রতিটি টেবিল থেকে শীর্ষ শিরোনাম এবং ভিউ সহ একই আউটপুট দেখতে পাবেন, কিন্তু এক্সিকিউশন টাইম অনেক কম হবে:

1825d49ef225c828.png

৭. অভিনন্দন

অভিনন্দন, আপনি কোডল্যাবটি সম্পন্ন করেছেন! আরও জানতে, প্যারালাল স্টেপস সম্পর্কিত ওয়ার্কফ্লো ডকুমেন্টেশন দেখুন।

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

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