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

1. مقدمه

1c05e3d0c2bd2b45.png74be7b376d45258a.png

Workflows یک سرویس ارکستراسیون کاملاً مدیریت شده است که Google Cloud یا سرویس های خارجی را به ترتیبی که شما تعریف کرده اید اجرا می کند.

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

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

چیزی که یاد خواهید گرفت

  • نحوه اجرای پرس و جوهای BigQuery در برابر مجموعه داده ویکی پدیا.
  • چگونه چندین پرس و جو را به عنوان بخشی از یک مجموعه ارکستراسیون Workflows اجرا کنیم.
  • نحوه موازی سازی پرس و جوها با استفاده از تکرار موازی Workflows برای بهبود سرعت تا 5 برابر.

2. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

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

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.

3. مجموعه داده ویکی پدیا را کاوش کنید

ابتدا مجموعه داده های ویکی پدیا را در BigQuery کاوش کنید.

به بخش BigQuery در Google Cloud Console بروید:

ea75ab12a7c012a4.png

در قسمت bigquery-samples ، باید مجموعه داده‌های عمومی مختلف، از جمله مجموعه‌های داده مرتبط با ویکی‌پدیا را ببینید:

c9484e305b8e1438.png

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

c540a4162640cbb3.png

می توانید یکی از جداول را انتخاب کنید (مثلاً 201207 ) و پیش نمایش داده ها را مشاهده کنید:

b5b2a334cd6f63c0.png

همچنین می توانید پرس و جوها را در مقابل جدول اجرا کنید. به عنوان مثال، این پرس و جو 100 عنوان برتر با بیشترین بازدید را انتخاب می کند:

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

پس از اجرای پرس و جو، بارگیری داده ها حدود 20 ثانیه طول می کشد:

1df3877aed1653b4.png

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

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

در داخل Cloud Shell، یک فایل workflow-serial.yaml ایجاد کنید تا یک گردش کار برای اجرای چندین پرس و جو در برابر چندین جدول ایجاد کنید:

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 برای اجرای یک پرس و جو برای یافتن 100 عنوان برتر با بیشترین بازدید از صفحه در هر جدول استفاده می‌کند. سپس عنوان و نماهای برتر هر جدول را در نقشه نتایج ذخیره می کند:

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

5. چند پرس و جو را با Workflows اجرا کنید

قبل از اینکه بتوانید گردش کار را اجرا و اجرا کنید، باید مطمئن شوید که Workflows API فعال است. می‌توانید آن را از Google Cloud Console یا با استفاده از 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 در Cloud Console پیدا کنید و دکمه Execute را بزنید:

b6afa4747680334f.png

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

gcloud workflows run bigquery-serial

شما باید اجرای گردش کار را در حدود 1 دقیقه (20 ثانیه برای هر یک از 5 جدول) مشاهده کنید.

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

304d11a5bffdada4.png

baf31533d3671c9e.png

6. چند پرس و جو را با مراحل موازی موازی کنید

گردش کار در مرحله قبل حدود 1 دقیقه طول کشید زیرا 5 پرس و جو را اجرا کرد که هر کدام 20 ثانیه طول کشید. از آنجایی که این کوئری‌ها مستقل هستند، می‌توانید با استفاده از ویژگی تکرار موازی 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

باید شاهد اجرای گردش کار حدود 20 ثانیه باشید. این به دلیل اجرای هر 5 کوئری به صورت موازی است. تا 5 برابر بهبود سرعت تنها با چند خط تغییر کد!

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

1825d49ef225c828.png

7. تبریک می گویم

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

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

  • نحوه اجرای پرس و جوهای BigQuery در برابر مجموعه داده ویکی پدیا.
  • چگونه چندین پرس و جو را به عنوان بخشی از یک مجموعه ارکستراسیون Workflows اجرا کنیم.
  • نحوه موازی سازی پرس و جوها با استفاده از تکرار موازی Workflows برای بهبود سرعت تا 5 برابر.