使用 Workflows 同時執行 BigQuery 工作

1. 簡介

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

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

BigQuery 是全代管的企業資料倉儲,內建機器學習、地理空間分析和商業智慧等功能,有助於管理及分析數兆位元組的資料。

在本程式碼研究室中,您將對公開的 Wikipedia 資料集執行一些 BigQuery 查詢。接著,您會瞭解如何在 Workflows 協調流程中,以序列方式依序執行多個 BigQuery 查詢。最後,您將使用 Workflows 的平行疊代功能平行處理查詢,最多可提升 5 倍速度。

課程內容

  • 如何針對 Wikipedia 資料集執行 BigQuery 查詢。
  • 如何以工作流程調度管理服務的一部分,依序執行多個查詢。
  • 如何使用 Workflows 平行疊代功能平行處理查詢,最多可提升 5 倍速度。

2. 設定和需求

自修實驗室環境設定

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
  • 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試自訂名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。
  • 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

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

Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

7ffe5cbb04455448.png

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。

3. 探索維基百科資料集

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

前往 Google Cloud 控制台的 BigQuery 專區

ea75ab12a7c012a4.png

在「bigquery-samples」下方,您應該會看到各種公開資料集,包括一些與維基百科相關的資料集:

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 步驟。這個步驟會逐一疊代每個資料表,並使用 Workflows 的 BigQuery 連接器執行查詢,找出每個資料表中網頁瀏覽次數最多的前 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 控制台的「工作流程」部分下方,找到 bigquery-serial 工作流程,然後按下 Execute 按鈕:

b6afa4747680334f.png

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

gcloud workflows run bigquery-serial

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

最後,您會看到每個表格的輸出內容,其中包含熱門影片和觀看次數:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. 使用平行步驟平行處理多個查詢

由於上一個步驟的工作流程執行了 5 個查詢,每個查詢耗時 20 秒,因此總共耗時約 1 分鐘。由於這些是獨立查詢,您可以使用 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 平行疊代功能平行處理查詢,最多可提升 5 倍速度。