اجرای کارهای BigQuery به موازات Workflows

۱. مقدمه

۱c05e3d0c2bd2b45.png74be7b376d45258a.png

گردش‌های کاری یک سرویس هماهنگ‌سازی کاملاً مدیریت‌شده است که گوگل کلود یا سرویس‌های خارجی را به ترتیبی که شما تعریف می‌کنید، اجرا می‌کند.

بیگ‌کوئری (BigQuery) یک انبار داده سازمانی کاملاً مدیریت‌شده است که به شما کمک می‌کند ترابایت‌ها داده را با ویژگی‌های داخلی مانند یادگیری ماشین، تحلیل مکانی و هوش تجاری مدیریت و تجزیه و تحلیل کنید.

در این آزمایشگاه کد، شما تعدادی کوئری BigQuery را روی مجموعه داده‌های عمومی ویکی‌پدیا اجرا خواهید کرد. سپس خواهید دید که چگونه می‌توان چندین کوئری BigQuery را یکی پس از دیگری به صورت سریالی، به عنوان بخشی از هماهنگی Workflows، اجرا کرد. در نهایت، با استفاده از ویژگی تکرار موازی Workflows، کوئری‌ها را موازی‌سازی خواهید کرد تا سرعت تا 5 برابر بهبود یابد.

آنچه یاد خواهید گرفت

  • نحوه اجرای کوئری‌های BigQuery روی مجموعه داده‌های ویکی‌پدیا.
  • نحوه اجرای چندین کوئری به عنوان بخشی از هماهنگی گردش‌های کاری به صورت سریالی.
  • نحوه موازی‌سازی کوئری‌ها با استفاده از تکرار موازی گردش‌های کاری برای بهبود سرعت تا ۵ برابر.

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه را ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول گوگل کلود ، روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

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

۴. تعریف یک گردش کار برای اجرای چندین پرس‌وجو

اجرای یک پرس‌وجو روی یک جدول واحد آسان است. با این حال، اجرای چندین پرس‌وجو روی چندین جدول و مقایسه نتایج می‌تواند بسیار خسته‌کننده باشد. برای کمک به این امر، Workflows می‌تواند با سینتکس تکرار خود به شما کمک کند!

درون پوسته ابری، یک فایل workflow-serial.yaml ایجاد کنید تا یک workflow برای اجرای چندین query روی چندین جدول ایجاد شود:

touch workflow-serial.yaml

سپس می‌توانید فایل را با ویرایشگر موجود در Cloud Shell ویرایش کنید:

33bf9325b078ad8.png

درون فایل workflow-serial.yaml ، در اولین مرحله init ، یک نقشه results ایجاد کنید تا هر تکرار را که با نام جداول کلیدگذاری شده است، پیگیری کند. همچنین یک آرایه tables با لیست جداولی که می‌خواهید پرس‌وجوها را روی آنها اجرا کنید، تعریف کنید. در این مورد، ما 5 جدول را انتخاب می‌کنیم:

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

در مرحله بعد، یک مرحله runQueries تعریف کنید. این مرحله روی هر جدول تکرار می‌شود و از رابط BigQuery در Workflows برای اجرای یک پرس‌وجو جهت یافتن ۱۰۰ عنوان برتر با بیشترین بازدید صفحه در هر جدول استفاده می‌کند. سپس عنوان و بازدیدهای برتر از هر جدول را در نقشه نتایج ذخیره می‌کند:

    - 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}

۵. اجرای چندین کوئری با Workflowها

قبل از اینکه بتوانید گردش کار را مستقر و اجرا کنید، باید مطمئن شوید که API گردش کار فعال است. می‌توانید آن را از کنسول ابری گوگل یا با استفاده از gcloud در Cloud Shell فعال کنید:

gcloud services enable workflows.googleapis.com

یک حساب کاربری سرویس برای Workflows ایجاد کنید:

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

مطمئن شوید که حساب کاربری سرویس، نقش‌های لازم برای ثبت و اجرای کارهای BigQuery را دارد:

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

در نهایت، شما آماده اجرای گردش کار هستید.

گردش کار bigquery-serial را در بخش Workflows کنسول ابری پیدا کنید و دکمه Execute بزنید:

b6afa4747680334f.png

همچنین می‌توانید گردش کار را با gcloud در Cloud Shell اجرا کنید:

gcloud workflows run bigquery-serial

باید ببینید که اجرای گردش کار حدود ۱ دقیقه طول می‌کشد (۲۰ ثانیه برای هر یک از ۵ جدول).

در نهایت، خروجی هر جدول را به همراه عناوین و نماهای برتر مشاهده خواهید کرد:

304d11a5bffdada4.png

baf31533d3671c9e.png

۶. چندین کوئری را با مراحل موازی موازی کنید

گردش کار در مرحله قبل حدود ۱ دقیقه طول کشید زیرا ۵ پرس‌وجو را اجرا کرد که هر کدام ۲۰ ثانیه طول می‌کشید. از آنجایی که اینها پرس‌وجوهای مستقلی هستند، می‌توانید آنها را به صورت موازی با استفاده از ویژگی تکرار موازی Workflows اجرا کنید.

فایل 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

باید ببینید که اجرای گردش کار حدود ۲۰ ثانیه طول می‌کشد. این به دلیل اجرای موازی هر ۵ کوئری است. بهبود سرعت تا ۵ برابر تنها با تغییر چند خط کد!

در نهایت، خروجی یکسانی از هر جدول با عناوین و نماهای برتر اما با زمان اجرای بسیار کوتاه‌تر مشاهده خواهید کرد:

۱۸۲۵d49ef225c828.png

۷. تبریک

تبریک می‌گویم، شما کار کدنویسی را تمام کردید! برای کسب اطلاعات بیشتر، مستندات گردش کار در مورد مراحل موازی را بررسی کنید.

آنچه ما پوشش داده‌ایم

  • نحوه اجرای کوئری‌های BigQuery روی مجموعه داده‌های ویکی‌پدیا.
  • نحوه اجرای چندین کوئری به عنوان بخشی از هماهنگی گردش‌های کاری به صورت سریالی.
  • نحوه موازی‌سازی کوئری‌ها با استفاده از تکرار موازی گردش‌های کاری برای بهبود سرعت تا ۵ برابر.