Chạy các công việc trong BigQuery song song với Quy trình công việc

1. Giới thiệu

1c05e3d0c2bd2b45.pngS 74be7b376d45258a.png.

Quy trình công việc là một dịch vụ điều phối được quản lý hoàn toàn. Dịch vụ này thực thi Google Cloud hoặc các dịch vụ bên ngoài theo thứ tự do bạn xác định.

BigQuery là kho dữ liệu doanh nghiệp được quản lý toàn diện, giúp bạn quản lý và phân tích hàng terabyte dữ liệu bằng các tính năng tích hợp sẵn như học máy, phân tích không gian địa lý và thông tin kinh doanh.

Trong lớp học lập trình này, bạn sẽ chạy một số truy vấn BigQuery dựa trên tập dữ liệu công khai trên Wikipedia. Sau đó, bạn sẽ thấy cách chạy lần lượt nhiều truy vấn BigQuery theo tuần tự, như một phần của sự điều phối Quy trình công việc. Cuối cùng, bạn sẽ song song hoá các truy vấn bằng tính năng lặp lại song song của Workflows để cải thiện tốc độ lên đến 5 lần.

Kiến thức bạn sẽ học được

  • Cách chạy truy vấn BigQuery dựa trên tập dữ liệu trên Wikipedia.
  • Cách chạy nhiều truy vấn trong quá trình điều phối Quy trình công việc tuần tự.
  • Cách tải song song các truy vấn bằng cách sử dụng tính năng lặp lại song song của Workflows để cải thiện tốc độ lên tới 5 lần.

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Trong Google Cloud Console, hãy nhấp vào biểu tượng Cloud Shell ở thanh công cụ trên cùng bên phải:

55efc1aaa7a4d3ad.pngS

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường. Sau khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Bạn có thể thực hiện mọi công việc trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt gì cả.

3. Khám phá tập dữ liệu Wikipedia

Trước tiên, hãy khám phá tập dữ liệu Wikipedia trong BigQuery.

Chuyển đến mục BigQuery trên Google Cloud Console:

ea75ab12a7c012a4.png

Trong bigquery-samples, bạn sẽ thấy nhiều tập dữ liệu công khai, bao gồm một số tập dữ liệu có liên quan đến Wikipedia:

c9484e305b8e1438.png

Trong tập dữ liệu wikipedia_pageviews, bạn có thể thấy các bảng khác nhau về lượt xem trang từ các năm khác nhau:

c540a4162640cbb3.png

Bạn có thể chọn một trong các bảng (ví dụ: 201207) và xem trước dữ liệu:

b5b2a334cd6f63c0.png

Bạn cũng có thể chạy các truy vấn trong bảng. Ví dụ: truy vấn này chọn 100 bộ phim/chương trình hàng đầu có nhiều lượt xem nhất:

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

Sau khi bạn chạy truy vấn, sẽ mất khoảng 20 giây để tải dữ liệu:

1df3877aed1653b4.pngs

4. Xác định quy trình làm việc để chạy nhiều truy vấn

Việc chạy truy vấn trên một bảng duy nhất rất dễ thực hiện. Tuy nhiên, việc chạy nhiều truy vấn trên nhiều bảng và đối chiếu kết quả có thể khá tẻ nhạt. Để hỗ trợ việc này, Workflows có thể trợ giúp về cú pháp vòng lặp!

Bên trong Cloud Shell, hãy tạo một tệp workflow-serial.yaml để xây dựng quy trình công việc chạy nhiều truy vấn trên nhiều bảng:

touch workflow-serial.yaml

Sau đó, bạn có thể chỉnh sửa tệp bằng trình chỉnh sửa trong Cloud Shell:

33bf9325b078ad8.pngs

Bên trong tệp workflow-serial.yaml, ở bước init đầu tiên, hãy tạo một bản đồ results để theo dõi từng lần lặp lại được khoá theo tên bảng. Ngoài ra, hãy xác định một mảng tables có danh sách các bảng mà bạn muốn chạy truy vấn. Trong trường hợp này, chúng ta sẽ chọn 5 bảng:

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

Tiếp theo, hãy xác định bước runQueries. Bước này sẽ lặp lại qua từng bảng và sử dụng quy trình làm việc Trình kết nối BigQuery để chạy truy vấn nhằm tìm 100 bộ phim/chương trình hàng đầu có nhiều lượt xem trang nhất trong mỗi bảng. Sau đó, thao tác này sẽ lưu tiêu đề và các lượt xem hàng đầu từ mỗi bảng trong bản đồ kết quả:

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

Trong bước cuối cùng, hãy trả về bản đồ results:

    - returnResults:
        return: ${results}

5. Chạy nhiều truy vấn bằng Workflows

Trước khi có thể triển khai và chạy quy trình công việc, bạn cần đảm bảo đã bật Workflows API. Bạn có thể bật dịch vụ này trong Google Cloud Console hoặc sử dụng gcloud trong Cloud Shell:

gcloud services enable workflows.googleapis.com

Tạo tài khoản dịch vụ cho Workflows:

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

Đảm bảo tài khoản dịch vụ có vai trò để ghi nhật ký và chạy các công việc trong 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

Triển khai quy trình công việc với tài khoản dịch vụ:

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

Cuối cùng, bạn đã sẵn sàng chạy quy trình làm việc.

Tìm quy trình công việc bigquery-serial trong phần Quy trình công việc của Cloud Console rồi nhấn vào nút Execute:

b6afa4747680334f.png

Ngoài ra, bạn cũng có thể chạy quy trình công việc bằng gcloud trong Cloud Shell:

gcloud workflows run bigquery-serial

Bạn sẽ thấy quá trình thực thi quy trình công việc kéo dài khoảng 1 phút (20 giây cho mỗi bảng trong số 5 bảng).

Cuối cùng, bạn sẽ thấy kết quả của mỗi bảng kèm theo tiêu đề và số lượt xem hàng đầu:

304d11a5bffdada4.png.

baf31533d3671c9e.png

6. Song song hoá nhiều truy vấn bằng các bước song song

Quy trình làm việc trong bước trước mất khoảng 1 phút vì chạy 5 truy vấn, mỗi truy vấn mất 20 giây. Vì đây là các truy vấn độc lập, nên thực tế bạn có thể chạy song song các truy vấn này bằng tính năng lặp lại song song của Workflows.

Sao chép tệp workflow-serial.yaml vào tệp workflow-parallel.yaml mới. Trong tệp mới, bạn sẽ thực hiện một vài thay đổi để biến các bước nối tiếp thành các bước song song.

Trong tệp workflow-parallel.yaml, hãy thay đổi bước runQueries. Trước tiên, hãy thêm từ khoá parallel. Điều này cho phép mỗi lần lặp của vòng lặp for chạy song song. Tiếp theo, hãy khai báo biến results dưới dạng biến shared. Điều này cho phép một nhánh có thể ghi biến này. Chúng ta sẽ thêm từng kết quả vào biến này.

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

Triển khai quy trình công việc song song:

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

Chạy quy trình công việc:

gcloud workflows run bigquery-parallel

Bạn sẽ thấy quá trình thực thi quy trình kéo dài khoảng 20 giây. Điều này là do cả 5 truy vấn đang chạy song song. Tốc độ cải thiện gấp 5 lần chỉ với vài thay đổi mã!

Cuối cùng, bạn sẽ thấy kết quả tương tự ở mỗi bảng có tiêu đề và lượt xem hàng đầu nhưng với thời gian thực thi ngắn hơn nhiều:

1825d49ef225c828.pngS

7. Xin chúc mừng

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình! Để tìm hiểu thêm, hãy xem tài liệu về Quy trình công việc về các bước song song.

Nội dung đã đề cập

  • Cách chạy truy vấn BigQuery dựa trên tập dữ liệu trên Wikipedia.
  • Cách chạy nhiều truy vấn trong quá trình điều phối Quy trình công việc tuần tự.
  • Cách tải song song các truy vấn bằng tính năng lặp lại song song của Workflows để cải thiện tốc độ tối đa 5 lần.