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 倍。