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.png 74be7b376d45258a.png

Workflows là một dịch vụ điều phối được quản lý toàn diện, thực thi các dịch vụ bên ngoài hoặc Google Cloud theo thứ tự mà bạn xác định.

BigQuery là một 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 những tính năng tích hợp sẵn như công nghệ học máy, số liệu phân tích theo không gian địa lý và dữ liệu thông minh cho doanh nghiệp.

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 của Wikipedia. Sau đó, bạn sẽ thấy cách chạy nhiều truy vấn BigQuery lần lượt theo cách tuần tự, trong quá trình điều phối quy trình công việc. Cuối cùng, bạn sẽ 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 độ 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 Wikipedia.
  • Cách chạy nhiều truy vấn trong quá trình điều phối Workflows theo tuần tự.
  • Cách song song hoá 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 đến 5 lần.

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

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ự mà các API của Google không 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 trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.

Khởi động Cloud Shell

Mặc dù 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 trên Cloud.

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

55efc1aaa7a4d3ad.png

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tá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 bất cứ thứ gì.

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 phần BigQuery của 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 cả một số tập dữ liệu liên quan đến Wikipedia:

c9484e305b8e1438.png

Trong tập dữ liệu wikipedia_pageviews, bạn có thể thấy nhiều bảng 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 đối với bảng. Ví dụ: truy vấn này chọn 100 tiêu đề 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, dữ liệu sẽ mất khoảng 20 giây để tải:

1df3877aed1653b4.png

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

Việc chạy một truy vấn đối với một bảng duy nhất rất dễ dàng. Tuy nhiên, việc chạy nhiều truy vấn dựa 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ể giúp bạn bằng cú pháp vòng lặp!

Trong Cloud Shell, hãy tạo một tệp workflow-serial.yaml để tạo quy trình làm việc nhằm 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.png

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 được khoá theo tên bảng. Đồng thời, 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 một bước runQueries. Bước này lặp lại trên từng bảng và sử dụng trình kết nối BigQuery của Workflows để chạy một truy vấn nhằm tìm ra 100 tiêu đề hàng đầu có nhiều lượt xem trang nhất trong mỗi bảng. Sau đó, hàm này sẽ lưu tiêu đề và số lượt xem hàng đầu của 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}

Ở 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 tính năng này trong Bảng điều khiển Google Cloud hoặc bằng cách sử dụng gcloud trong Cloud Shell:

gcloud services enable workflows.googleapis.com

Tạo tài khoản dịch vụ cho quy trình công việc:

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ó các vai trò để ghi nhật ký và chạy các công việc 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 bằng 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.

Tìm quy trình 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 bằng gcloud trong Cloud Shell:

gcloud workflows run bigquery-serial

Bạn sẽ thấy quy trình thực thi 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 từng bảng có tiêu đề và 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 ở bước trước mất khoảng 1 phút vì quy trình này 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 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 một tệp workflow-parallel.yaml mới. Trong tệp mới, bạn sẽ thực hiện một số thay đổi để chuyể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 lại của vòng lặp for chạy song song. Thứ hai, khai báo biến results dưới dạng biến shared. Điều này cho phép một nhánh ghi vào biến. 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 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 quy trình thực thi kéo dài khoảng 20 giây. Điều này là do cả 5 truy vấn đều chạy song song. Tăng tốc độ lên đến 5 lần chỉ với một vài dòng mã thay đổi!

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

1825d49ef225c828.png

7. Xin chúc mừng

Xin chúc mừng, bạn đã hoàn tất lớp học lập trình này! Để tìm hiểu thêm, hãy xem tài liệu về quy trình làm việc đối với 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 Wikipedia.
  • Cách chạy nhiều truy vấn trong quá trình điều phối Workflows theo 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 đến 5 lần.