1. Giới thiệu

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
- Đă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.



- 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.
- 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:

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:

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:

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:

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:

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

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:

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:

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:

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:


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:

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.