Uruchamianie zadań BigQuery równolegle z Workflows

1. Wprowadzenie

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows to w pełni zarządzana usługa orkiestracji, która wykonuje usługi Google Cloud lub usługi zewnętrzne w zdefiniowanej przez Ciebie kolejności.

BigQuery to usługa w pełni zarządzana hurtownia danych dla firm, która pomoże Ci zarządzać terabajtami danych i je analizować za pomocą wbudowanych funkcji, takich jak uczenie maszynowe, analiza geoprzestrzenna i analityka biznesowa.

W tym module dowiesz się, jak uruchamiać zapytania BigQuery na publicznym zbiorze danych Wikipedii. Następnie dowiesz się, jak uruchamiać wiele zapytań BigQuery kolejno w sposób szeregowy w ramach orkiestracji Workflows. Na koniec zrównoleglisz zapytania za pomocą funkcji iteracji równoległej w Workflows, co pozwoli Ci nawet 5-krotnie przyspieszyć działanie.

Czego się nauczysz

  • Jak uruchamiać zapytania BigQuery dotyczące zbioru danych Wikipedii.
  • Jak uruchamiać wiele zapytań w ramach orkiestracji przepływów pracy w sposób szeregowy.
  • Jak równolegle wykonywać zapytania za pomocą iteracji równoległych w Workflows, aby zwiększyć szybkość nawet 5-krotnie.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu musi być unikalny we wszystkich projektach Google Cloud i jest niezmienny (nie można go zmienić po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać w przeglądarce. Nie musisz niczego instalować.

3. Przeglądanie zbioru danych z Wikipedii

Najpierw zapoznaj się ze zbiorem danych Wikipedii w BigQuery.

Otwórz sekcję BigQuery w konsoli Google Cloud:

ea75ab12a7c012a4.png

W sekcji bigquery-samples powinny być widoczne różne publiczne zbiory danych, w tym zbiory danych związane z Wikipedią:

c9484e305b8e1438.png

W sekcji wikipedia_pageviews zbiór danych możesz zobaczyć różne tabele wyświetleń stron z różnych lat:

c540a4162640cbb3.png

Możesz wybrać jedną z tabel (np. 201207) i wyświetl podgląd danych:

b5b2a334cd6f63c0.png

Możesz też wykonywać zapytania dotyczące tabeli. Na przykład to zapytanie wybiera 100 najpopularniejszych tytułów:

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

Po uruchomieniu zapytania wczytanie danych zajmuje około 20 sekund:

1df3877aed1653b4.png

4. Określanie przepływu pracy do wykonywania wielu zapytań

Wysłanie zapytania do jednej tabeli jest proste. Jednak wykonywanie wielu zapytań dotyczących wielu tabel i zbieranie wyników może być dość żmudne. Aby Ci w tym pomóc, przepływy pracy mają składnię iteracji.

W Cloud Shell utwórz plik workflow-serial.yaml, aby utworzyć przepływ pracy do uruchamiania wielu zapytań w wielu tabelach:

touch workflow-serial.yaml

Następnie możesz edytować plik w edytorze w Cloud Shell:

33bf9325b078ad8.png

W pliku workflow-serial.yaml w pierwszym kroku init utwórz mapę results, aby śledzić każdą iterację kluczowaną przez nazwy tabel. Zdefiniuj też tablicę tables z listą tabel, w których chcesz uruchamiać zapytania. W tym przypadku wybieramy 5 tabel:

main:
    steps:
    - init:
        assign:
            - results : {}
            - tables:
                - 201201h
                - 201202h
                - 201203h
                - 201204h
                - 201205h

Następnie zdefiniuj runQueries krok. Ten krok iteruje po każdej tabeli i używa oprogramowania sprzęgającego BigQuery w Workflows, aby uruchomić zapytanie i znaleźć 100 najpopularniejszych tytułów z największą liczbą wyświetleń strony w każdej tabeli. Następnie zapisuje najpopularniejszy tytuł i liczbę wyświetleń z każdej tabeli na mapie wyników:

    - 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}

W ostatnim kroku zwróć mapę results:

    - returnResults:
        return: ${results}

5. Uruchamianie wielu zapytań za pomocą Workflows

Zanim wdrożysz i uruchomisz przepływ pracy, musisz się upewnić, że interfejs Workflows API jest włączony. Możesz ją włączyć w konsoli Google Cloud lub za pomocą gcloud w Cloud Shell:

gcloud services enable workflows.googleapis.com

Utwórz konto usługi dla przepływów pracy:

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

Sprawdź, czy konto usługi ma role umożliwiające rejestrowanie i uruchamianie zadań 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

Wdróż przepływ pracy za pomocą konta usługi:

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Na koniec możesz uruchomić przepływ pracy.

W sekcji Workflows w konsoli Cloud znajdź przepływ pracy bigquery-serial i kliknij przycisk Execute:

b6afa4747680334f.png

Możesz też uruchomić przepływ pracy za pomocą gcloud w Cloud Shell:

gcloud workflows run bigquery-serial

Wykonanie przepływu pracy powinno trwać około 1 minuty (20 sekund w przypadku każdej z 5 tabel).

Na koniec zobaczysz dane wyjściowe z każdej tabeli z najpopularniejszymi tytułami i wyświetleniami:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Równoległe wykonywanie wielu zapytań za pomocą równoległych kroków

Przepływ pracy z poprzedniego kroku trwał około minuty, ponieważ uruchomił 5 zapytań, z których każde zajęło 20 sekund. Ponieważ są to niezależne zapytania, możesz je uruchamiać równolegle, korzystając z funkcji równoległej iteracji w przepływach pracy.

Skopiuj plik workflow-serial.yaml do nowego pliku workflow-parallel.yaml. W nowym pliku wprowadź kilka zmian, aby przekształcić kolejne etapy w etapy równoległe.

W pliku workflow-parallel.yaml zmień krok runQueries. Najpierw dodaj słowo kluczowe parallel. Dzięki temu każda iteracja pętli for może być wykonywana równolegle. Po drugie, zadeklaruj zmienną results jako zmienną shared. Dzięki temu gałąź może zapisywać wartość zmiennej. Do tej zmiennej dodamy każdy wynik.

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

Wdróż przepływ pracy równoległej:

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Uruchom przepływ pracy:

gcloud workflows run bigquery-parallel

Powinno się wyświetlić wykonanie przepływu pracy trwające około 20 sekund. Wynika to z tego, że wszystkie 5 zapytań jest uruchamianych równolegle. Nawet 5-krotne zwiększenie szybkości przy zmianie tylko kilku linii kodu!

Ostatecznie zobaczysz te same dane wyjściowe z każdej tabeli z najpopularniejszymi tytułami i wyświetleniami, ale z dużo krótszym czasem wykonania:

1825d49ef225c828.png

7. Gratulacje

Gratulacje! Codelab został ukończony. Więcej informacji znajdziesz w dokumentacji przepływów pracy dotyczącej etapów równoległych.

Omówione zagadnienia

  • Jak uruchamiać zapytania BigQuery dotyczące zbioru danych Wikipedii.
  • Jak uruchamiać wiele zapytań w ramach orkiestracji przepływów pracy w sposób szeregowy.
  • Jak równolegle wykonywać zapytania za pomocą iteracji równoległych w Workflows, aby zwiększyć szybkość nawet 5-krotnie.