使用 Workflows 同時執行 BigQuery 工作

1. 簡介

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows 是全代管的自動化調度管理服務,可按照您定義的順序執行 Google Cloud 或外部服務。

BigQuery 是全代管的企業資料倉儲,內建機器學習、地理空間分析和商業智慧等功能,可協助您管理及分析 TB 規模的資料。

在本程式碼研究室中,您將對公開 Wikipedia 資料集執行一些 BigQuery 查詢。您隨即會在 Workflows 自動化調度管理中,依序執行多個 BigQuery 查詢。最後,您將使用 Workflows 的平行疊代功能平行處理查詢,速度提升高達 5 倍。

課程內容

  • 如何針對 Wikipedia 資料集執行 BigQuery 查詢。
  • 如何在 Workflows 自動化調度管理程序中依序執行多項查詢。
  • 如何使用 Workflows 平行疊代功能平行處理查詢,速度提升最多 5 倍。

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。

3. 探索維基百科資料集

首先,請在 BigQuery 中探索 Wikipedia 資料集。

前往 Google Cloud 控制台的 BigQuery 部分

ea75ab12a7c012a4.png

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

c9484e305b8e1438.png

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

c540a4162640cbb3.png

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

b5b2a334cd6f63c0.png

您也可以對資料表執行查詢。舉例來說,以下查詢會選取觀看次數最多的前 100 名影視作品:

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

執行查詢後,資料大約會在 20 秒內載入:

1df3877aed1653b4.png

4. 定義執行多項查詢的工作流程

對單一資料表執行查詢十分簡單。不過,針對多個資料表執行多次查詢並統整結果,可能會相當枯燥乏味。為協助您達成這個目標,Workflows 可以協助採用疊代語法!

在 Cloud Shell 中建立 workflow-serial.yaml 檔案,藉此建構針對多個資料表執行多項查詢的工作流程:

touch workflow-serial.yaml

接著,您就能在 Cloud Shell 中使用編輯器編輯檔案:

33bf9325b078ad8.png

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 按鈕:

b6afa4747680334f.png

您也可以在 Cloud Shell 中使用 gcloud 執行工作流程:

gcloud workflows run bigquery-serial

您應該會看到工作流程執行時間為大約 1 分鐘 (這 5 個資料表各 20 秒)。

最後,您將看到每份表格的輸出內容,以及成效最佳的標題和觀看次數:

304d11a5bffdada4.png

baf31533d3671c9e.png

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

最後,您會在每個表格中看到相同的輸出內容,其中包含熱門標題和觀看次數,但執行時間會較短:

1825d49ef225c828.png

7. 恭喜

恭喜,您已完成程式碼研究室!詳情請參閱平行步驟的 Workflows 說明文件

涵蓋內容

  • 如何針對 Wikipedia 資料集執行 BigQuery 查詢。
  • 如何在 Workflows 自動化調度管理程序中依序執行多項查詢。
  • 如何使用 Workflows 平行疊代功能平行處理查詢,速度提升最多 5 倍。