1. 簡介

Workflows 是全代管的自動化調度管理服務,可按照您定義的順序執行 Google Cloud 或外部服務。
BigQuery 是全代管的企業資料倉儲,內建機器學習、地理空間分析和商業智慧等功能,可協助您管理及分析 TB 規模的資料。
在本程式碼研究室中,您將對公開 Wikipedia 資料集執行一些 BigQuery 查詢。您隨即會在 Workflows 自動化調度管理中,依序執行多個 BigQuery 查詢。最後,您將使用 Workflows 的平行疊代功能平行處理查詢,速度提升高達 5 倍。
課程內容
- 如何針對 Wikipedia 資料集執行 BigQuery 查詢。
- 如何在 Workflows 自動化調度管理程序中依序執行多項查詢。
- 如何使用 Workflows 平行疊代功能平行處理查詢,速度提升最多 5 倍。
2. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
- 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟動 Cloud Shell
雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
在 Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。
3. 探索維基百科資料集
首先,請在 BigQuery 中探索 Wikipedia 資料集。
前往 Google Cloud 控制台的 BigQuery 部分:

bigquery-samples 下方應該會顯示各種公開資料集,包括一些 Wikipedia 相關資料集:

在 wikipedia_pageviews 資料集下,您可以看到不同年份的網頁瀏覽量各種表格:

您可以選取其中一個資料表 (例如201207),並預覽資料:

您也可以對資料表執行查詢。舉例來說,以下查詢會選取觀看次數最多的前 100 名影視作品:
SELECT TITLE, SUM(views) FROM bigquery-samples.wikipedia_pageviews.201207h GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100
執行查詢後,資料大約會在 20 秒內載入:

4. 定義執行多項查詢的工作流程
對單一資料表執行查詢十分簡單。不過,針對多個資料表執行多次查詢並統整結果,可能會相當枯燥乏味。為協助您達成這個目標,Workflows 可以協助採用疊代語法!
在 Cloud Shell 中建立 workflow-serial.yaml 檔案,藉此建構針對多個資料表執行多項查詢的工作流程:
touch workflow-serial.yaml
接著,您就能在 Cloud Shell 中使用編輯器編輯檔案:

在 workflow-serial.yaml 檔案的第一個 init 步驟中,建立 results 對應,以追蹤每個具有資料表名稱的疊代作業。此外,您也可以將要執行查詢的資料表清單定義 tables 陣列。本例中我們選擇了 5 個資料表:
main:
steps:
- init:
assign:
- results : {}
- tables:
- 201201h
- 201202h
- 201203h
- 201204h
- 201205h
接下來,請定義 runQueries 步驟。這個步驟會反覆檢查每個資料表,並使用 WorkflowsBigQuery 連接器可執行查詢,找出各資料表中前 100 名書籍瀏覽量的前 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 控制台或在 Cloud Shell 中使用 gcloud:
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
最後,您現在可以開始執行工作流程。
在 Cloud 控制台的「Workflows」部分下找到 bigquery-serial 工作流程,然後點選 Execute 按鈕:

您也可以在 Cloud Shell 中使用 gcloud 執行工作流程:
gcloud workflows run bigquery-serial
您應該會看到工作流程執行時間為大約 1 分鐘 (這 5 個資料表各 20 秒)。
最後,您將看到每份表格的輸出內容,以及成效最佳的標題和觀看次數:


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 倍!
最後,您會在每個表格中看到相同的輸出內容,其中包含熱門標題和觀看次數,但執行時間會較短:

7. 恭喜
恭喜,您已完成程式碼研究室!詳情請參閱平行步驟的 Workflows 說明文件。
涵蓋內容
- 如何針對 Wikipedia 資料集執行 BigQuery 查詢。
- 如何在 Workflows 自動化調度管理程序中依序執行多項查詢。
- 如何使用 Workflows 平行疊代功能平行處理查詢,速度提升最多 5 倍。