Odwrotne ETL z Snowflake do Spanner przy użyciu BQ

1. Tworzenie potoku odwrotnego ETL z Snowflake do Spanner przy użyciu Google Cloud Storage i BigQuery

Wprowadzenie

W tym module z kodem utworzysz potok Reverse ETL z Snowflake do Spannera. Tradycyjnie potoki ETL (Extract, Transform, Load) przenoszą dane z działających baz danych do hurtowni danych, takiej jak Snowflake, na potrzeby analizy. Potok Reverse ETL działa odwrotnie: przenosi wyselekcjonowane, przetworzone dane z hurtowni danych z powrotem do systemów operacyjnych, w których mogą one zasilać aplikacje, obsługiwać funkcje dostępne dla użytkowników lub być wykorzystywane do podejmowania decyzji w czasie rzeczywistym.

Celem jest przeniesienie zagregowanego zbioru danych z tabeli Iceberg w Snowflake do Spannera, czyli globalnie rozpowszechnionej relacyjnej bazy danych idealnej do aplikacji o wysokiej dostępności.

W tym celu jako kroki pośrednie wykorzystywane są Google Cloud Storage (GCS) i BigQuery. Oto opis przepływu danych i uzasadnienie tej architektury:

  1. Snowflake do Google Cloud Storage (GCS) w formacie Iceberg:
  • Pierwszym krokiem jest wyeksportowanie danych z Snowflake w otwartym, dobrze zdefiniowanym formacie. Tabela jest eksportowana w formacie Apache Iceberg. W ramach tego procesu dane bazowe są zapisywane jako zestaw plików Parquet, a metadane tabeli (schemat, partycje, lokalizacje plików) jako pliki JSON i Avro. Przechowywanie całej struktury tabeli w GCS sprawia, że dane są przenośne i dostępne dla każdego systemu, który rozumie format Iceberg.
  1. Konwertowanie tabel Iceberg w GCS na zewnętrzne tabele BigLake w BigQuery:
  • Zamiast wczytywać dane bezpośrednio z GCS do Spannera, BigQuery jest używany jako wydajny pośrednik. W BigQuery utworzysz zewnętrzną tabelę BigLake, która będzie wskazywać bezpośrednio plik metadanych Iceberg w GCS. Takie podejście ma kilka zalet:
  • Brak duplikowania danych: BigQuery odczytuje strukturę tabeli z metadanych i wysyła zapytania do plików danych Parquet w miejscu bez ich pozyskiwania, co pozwala zaoszczędzić dużo czasu i kosztów przechowywania.
  • Zapytania sfederowane: umożliwiają uruchamianie złożonych zapytań SQL dotyczących danych GCS tak, jakby były one natywną tabelą BigQuery.
  1. BigQuery do Spanner:
  • Ostatnim krokiem jest przeniesienie danych z BigQuery do Spannera. Zrobisz to za pomocą zaawansowanej funkcji BigQuery o nazwie EXPORT DATA, która jest krokiem „Reverse ETL”.
  • Gotowość operacyjna: Spanner został zaprojektowany z myślą o zadaniach transakcyjnych, zapewniając aplikacjom silną spójność i wysoką dostępność. Przeniesienie danych do Spannera sprawia, że stają się one dostępne dla aplikacji, interfejsów API i innych systemów operacyjnych, które wymagają wyszukiwania punktowego z małymi opóźnieniami.
  • Skalowalność: ten wzorzec umożliwia wykorzystanie mocy analitycznej BigQuery do przetwarzania dużych zbiorów danych, a następnie wydajne udostępnianie wyników za pomocą globalnie skalowalnej infrastruktury Spanner.

Usługi i terminologia

  • Snowflake – platforma danych w chmurze, która udostępnia usługę hurtowni danych.
  • Spanner – w pełni zarządzana, globalnie rozproszona relacyjna baza danych.
  • Google Cloud Storage – usługa Google Cloud do przechowywania danych binarnych.
  • BigQuery – w pełni zarządzana bezserwerowa hurtownia danych do analizy.
  • Iceberg – otwarty format tabeli zdefiniowany przez Apache, który zapewnia abstrakcję nad popularnymi formatami plików danych typu open source.
  • Parquet – otwarty format binarnych plików danych w kolumnach opracowany przez Apache.

Czego się nauczysz

  • Wczytywanie danych do Snowflake
  • Jak utworzyć zasobnik GCS
  • Eksportowanie tabeli Snowflake do GCS w formacie Iceberg
  • Konfigurowanie instancji usługi Spanner
  • Wczytywanie zewnętrznych tabel BigLake w BigQuery do Spannera

2. Konfiguracja, wymagania i ograniczenia

Wymagania wstępne

  • konto Snowflake,
  • Aby eksportować dane z BigQuery do Spanner, musisz mieć konto Google Cloud z rezerwacją na poziomie Enterprise lub wyższym w BigQuery.
  • Dostęp do konsoli Google Cloud w przeglądarce
  • terminal do uruchamiania poleceń Google Cloud CLI;
  • Jeśli w Twojej organizacji Google Cloud jest włączona zasada iam.allowedPolicyMemberDomains, administrator może przyznać wyjątek, aby zezwolić na konta usługi z domen zewnętrznych. W odpowiednich przypadkach omówimy to w dalszej części procesu.

Ograniczenia

W tym potoku mogą wystąpić pewne ograniczenia i niezgodności typów danych, o których warto pamiętać.

Snowflake to Iceberg

Typy danych w kolumnach różnią się w przypadku Snowflake i Iceberg. Informacje o tłumaczeniu między nimi znajdziesz w dokumentacji Snowflake.

Zapisywanie danych z Iceberga w BigQuery

Podczas wykonywania zapytań do tabel Iceberg za pomocą BigQuery obowiązują pewne ograniczenia. Pełną listę znajdziesz w dokumentacji BigQuery. Pamiętaj, że typy takie jak BIGNUMERIC, INTERVAL, JSON, RANGEGEOGRAPHY nie są obecnie obsługiwane.

BigQuery do Spanner

Polecenie EXPORT DATA z BigQuery do Spanner nie obsługuje wszystkich typów danych BigQuery. Eksportowanie tabeli z tymi typami danych spowoduje błąd:

  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME

Jeśli projekt BigQuery używa dialektu GoogleSQL, eksport do Spannera nie obsługuje też tych typów liczbowych:

  • BIGNUMERIC

Pełną i aktualną listę ograniczeń znajdziesz w oficjalnej dokumentacji: Ograniczenia eksportowania do Spannera.

Płatek śniegu

W tym samouczku możesz użyć istniejącego konta Snowflake lub utworzyć konto w bezpłatnej wersji próbnej.

Uprawnienia Google Cloud Platform IAM

Aby wykonać wszystkie czynności w tym samouczku, musisz mieć na koncie Google te uprawnienia:

Konta usługi

iam.serviceAccountKeys.create

Umożliwia tworzenie kont usługi.

Spanner

spanner.instances.create

Umożliwia utworzenie nowej instancji usługi Spanner.

spanner.databases.create

Umożliwia uruchamianie instrukcji DDL w celu tworzenia

spanner.databases.updateDdl

Umożliwia uruchamianie instrukcji DDL w celu tworzenia tabel w bazie danych.

Google Cloud Storage

storage.buckets.create

Umożliwia utworzenie nowego zasobnika GCS do przechowywania wyeksportowanych plików Parquet.

storage.objects.create

Umożliwia zapisywanie wyeksportowanych plików Parquet w zasobniku GCS.

storage.objects.get

Umożliwia BigQuery odczytywanie plików Parquet z zasobnika GCS.

storage.objects.list

Umożliwia BigQuery wyświetlanie listy plików Parquet w zasobniku GCS.

Dataflow

Dataflow.workitems.lease

Umożliwia przejmowanie elementów roboczych z Dataflow.

Dataflow.workitems.sendMessage

Umożliwia procesowi roboczemu Dataflow wysyłanie wiadomości z powrotem do usługi Dataflow.

Logging.logEntries.create

Umożliwia procesom roboczym Dataflow zapisywanie wpisów logów w Google Cloud Logging.

Dla wygody możesz użyć zdefiniowanych ról, które zawierają te uprawnienia.

roles/resourcemanager.projectIamAdmin

roles/iam.serviceAccountKeyAdmin

roles/spanner.instanceAdmin

roles/spanner.databaseAdmin

roles/storage.admin

roles/dataflow.serviceAgent

roles/dataflow.worker

roles/dataflow.serviceAgent

Konfigurowanie właściwości wielokrotnego użytku

W tym module będziesz wielokrotnie potrzebować kilku wartości. Aby to ułatwić, ustawimy te wartości jako zmienne powłoki, które będą używane później.

  • GCP_REGION – konkretny region, w którym będą się znajdować zasoby GCP. Listę regionów znajdziesz tutaj.
  • GCP_PROJECT – identyfikator projektu GCP do użycia.
  • GCP_BUCKET_NAME – nazwa zasobnika GCS, który ma zostać utworzony i w którym będą przechowywane pliki danych.
export GCP_REGION = <GCP REGION HERE> 
export GCP_PROJECT= <GCP PROJECT HERE>
export GCS_BUCKET_NAME = <GCS BUCKET NAME HERE>
export SPANNER_INSTANCE = <SPANNER INSTANCE ID HERE>
export SPANNER_DB = <SPANNER DATABASE ID HERE>

Projekt Google Cloud

Projekt to podstawowa jednostka organizacji w Google Cloud. Jeśli administrator udostępnił adres e-mail do użycia, ten krok można pominąć.

Projekt można utworzyć za pomocą interfejsu wiersza poleceń w ten sposób:

gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT

Więcej informacji o tworzeniu projektów i zarządzaniu nimi znajdziesz tutaj.

Konfigurowanie usługi Spanner

Aby zacząć korzystać ze Spannera, musisz udostępnić instancję i bazę danych. Szczegółowe informacje o konfigurowaniu i tworzeniu instancji Spanner znajdziesz tutaj.

Tworzenie instancji

gcloud spanner instances create $SPANNER_INSTANCE \
--config=regional-$GCP_REGION \
--description="Codelabs Snowflake RETL" \
--processing-units=100 \
--edition=ENTERPRISE

Tworzenie bazy danych

gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE

3. Utworzysz zasobnik Google Cloud Storage

Google Cloud Storage (GCS) będzie używany do przechowywania plików danych Parquet i metadanych Iceberg wygenerowanych przez Snowflake. W tym celu musisz najpierw utworzyć nowy zasobnik, który będzie miejscem docelowym pliku. W oknie terminala na komputerze lokalnym wykonaj te czynności.

Tworzenie zasobnika

Aby utworzyć zasobnik pamięci w określonym regionie (np. us-central1), użyj tego polecenia.

gcloud storage buckets create gs://$GCS_BUCKET_NAME --location=$GCP_REGION

Sprawdź, czy zasobnik został utworzony

Po pomyślnym wykonaniu tego polecenia sprawdź wynik, wyświetlając listę wszystkich zasobników. Nowy zasobnik powinien pojawić się na liście wyników. Odwołania do zasobników zwykle mają przed nazwą zasobnika prefiks gs://.

gcloud storage ls | grep gs://$GCS_BUCKET_NAME

Testowanie uprawnień do zapisu

Ten krok zapewnia prawidłowe uwierzytelnianie środowiska lokalnego i przyznanie mu niezbędnych uprawnień do zapisywania plików w nowo utworzonym zasobniku.

echo "Hello, GCS" | gcloud storage cp - gs://$GCS_BUCKET_NAME/hello.txt

Sprawdzanie przesłanego pliku

Wyświetl listę obiektów w zasobniku. Powinna się wyświetlić pełna ścieżka do przesłanego pliku.

gcloud storage ls gs://$GCS_BUCKET_NAME

Powinny się wyświetlić te dane wyjściowe:

gs://$GCS_BUCKET_NAME/hello.txt

Aby wyświetlić zawartość obiektu w zasobniku, można użyć gcloud storage cat.

gcloud storage cat gs://$GCS_BUCKET_NAME/hello.txt

Zawartość pliku powinna być widoczna:

Hello, GCS

Usuwanie pliku testowego

Zasobnik Cloud Storage jest już skonfigurowany. Teraz możesz usunąć tymczasowy plik testowy.

gcloud storage rm gs://$GCS_BUCKET_NAME/hello.txt

Dane wyjściowe powinny potwierdzać usunięcie:

Removing gs://$GCS_BUCKET_NAME/hello.txt...
/ [1 objects]
Operation completed over 1 objects.

4. Eksportowanie ze Snowflake do GCS

W tym module wykorzystasz zbiór danych TPC-H, który jest standardowym w branży testem porównawczym systemów wspomagających podejmowanie decyzji. Jego schemat modeluje realistyczne środowisko biznesowe z klientami, zamówieniami, dostawcami i częściami, dzięki czemu idealnie nadaje się do zademonstrowania rzeczywistego scenariusza analityki i przenoszenia danych. Ten zbiór danych jest domyślnie dostępny na wszystkich kontach Snowflake.

Zamiast korzystać z surowych, znormalizowanych tabel TPC-H, utworzysz nową, zagregowaną tabelę. Ta nowa tabela połączy dane z tabel orders, customernation, aby utworzyć zdenormalizowany, podsumowany widok łącznej sprzedaży w poszczególnych krajach. Ten krok wstępnej agregacji jest powszechnie stosowany w analityce, ponieważ przygotowuje dane do konkretnego zastosowania – w tym przypadku do wykorzystania przez aplikację operacyjną.

Zezwalanie Snowflake na dostęp do Google Cloud Storage

Aby umożliwić Snowflake zapisywanie danych w zasobniku GCS, musisz utworzyć wolumin zewnętrzny i przyznać niezbędne uprawnienia.

  • Wolumin zewnętrzny to obiekt Snowflake, który zapewnia bezpieczne połączenie z określoną lokalizacją w zasobniku GCS. Nie przechowuje on danych, ale zawiera konfigurację potrzebną Snowflake do uzyskania dostępu do pamięci w chmurze.
  • Ze względów bezpieczeństwa zasobniki pamięci w chmurze są domyślnie prywatne. Gdy tworzony jest wolumin zewnętrzny, Snowflake generuje dedykowane konto usługi. To konto usługi musi mieć przyznane uprawnienia do odczytu z zasobnika i zapisu w nim.

Utwórz bazę danych

  1. W menu po lewej stronie w sekcji Horizon Catalog najedź kursorem na Catalog (Katalog), a następnie kliknij Database Explorer (Eksplorator bazy danych).
  2. Na stronie Bazy danych w prawym górnym rogu kliknij przycisk + Baza danych.
  3. Nadaj nazwę nowej bazie danych codelabs_retl_db

Tworzenie arkusza

Aby uruchamiać polecenia SQL w bazie danych, potrzebne będą arkusze.

Aby utworzyć arkusz:

  1. W menu po lewej stronie w sekcji Praca z danymi najedź kursorem na Projekty, a następnie kliknij Obszary robocze.
  2. Na pasku bocznym Moje obszary robocze kliknij przycisk + Dodaj nowy i wybierz Plik SQL.

Tworzenie woluminu zewnętrznego

Aby utworzyć wolumin, uruchom to polecenie w arkuszu Snowflake.

CREATE EXTERNAL VOLUME codelabs_retl_ext_vol
STORAGE_LOCATIONS = 
(
  (
    NAME = 'codelabs_retl_ext_vol'
    STORAGE_PROVIDER = 'GCS'
    STORAGE_BASE_URL = 'gcs://<Your bucket name>/snowflake_extvol'
  )
); 

Pobieranie konta usługi Snowflake

DESC (describe) nowo utworzony wolumin zewnętrzny, aby uzyskać unikalne konto usługi wygenerowane dla niego przez Snowflake.

DESC EXTERNAL VOLUME codelabs_retl_ext_vol;
  1. W panelu wyników poszukaj właściwości JSON i znajdź wpis property_value, który zawiera ciąg znaków JSON zaczynający się od "NAME":"codelabs_retl_ext_vol".
  2. Znajdź właściwość STORAGE_GCP_SERVICE_ACCOUNT w obiekcie JSON i skopiuj jej wartość (będzie ona wyglądać jak adres e-mail). Jest to identyfikator konta usługi, które potrzebuje dostępu do zasobnika GCS.
  3. Zapisz to konto usługi w zmiennej środowiskowej w instancji powłoki, aby móc je później ponownie wykorzystać.
export GCP_SERVICE_ACCOUNT=<Your service account>

Przyznawanie Snowflake uprawnień GCS

Teraz musisz przyznać kontu usługi Snowflake uprawnienia do zapisu w zasobniku GCS.

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.objectAdmin"

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.legacyBucketReader"

Sprawdzanie dostępu w Snowflake

Wróć do arkusza Snowflake i uruchom to polecenie, aby sprawdzić, czy Snowflake może teraz połączyć się z zasobnikiem GCS.

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('codelabs_retl_ext_vol');

Wynikiem powinien być obiekt JSON zawierający "success":true.

Więcej informacji o woluminach zewnętrznych w Snowflake znajdziesz w oficjalnej dokumentacji.

Eksportowanie przykładowych danych zamówienia

Teraz możesz utworzyć tabelę Iceberg w Snowflake. To polecenie nakazuje Snowflake uruchomienie zapytania i zapisanie wyników w GCS w formacie Iceberg. Pliki danych będą w formacie Parquet, a metadane w formatach Avro i JSON. Wszystkie będą przechowywane w lokalizacji zdefiniowanej przez codelabs_retl_ext_vol wolumin zewnętrzny.

Utwórz bazę danych

  1. W menu po lewej stronie w sekcji Horizon Catalog najedź kursorem na Catalog (Katalog), a następnie kliknij Database Explorer (Eksplorator bazy danych).
  2. Na stronie Bazy danych w prawym górnym rogu kliknij przycisk + Baza danych.
  3. Nadaj nazwę nowej bazie danych codelabs_retl_db
USE DATABASE codelabs_retl_db; 

CREATE ICEBERG TABLE REGIONAL_SALES_ICEBERG (
    NATION_NAME STRING,
    MARKET_SEGMENT STRING,
    ORDER_YEAR INTEGER,
    ORDER_PRIORITY STRING,
    TOTAL_ORDER_COUNT INTEGER,
    TOTAL_REVENUE NUMBER(24,2),
    UNIQUE_CUSTOMER_COUNT INTEGER
) 
EXTERNAL_VOLUME = 'codelabs_retl_ext_vol'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'regional_sales_iceberg'
AS (
    SELECT 
        n.n_name AS nation_name,
        c.c_mktsegment AS market_segment,
        YEAR(o.o_orderdate) AS order_year,
        o.o_orderpriority AS order_priority,
        COUNT(o.o_orderkey) AS total_order_count,
        ROUND(SUM(o.o_totalprice), 2) AS total_revenue,
        COUNT(DISTINCT c.c_custkey) AS unique_customer_count
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.orders AS o
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.customer AS c 
        ON o.o_custkey = c.c_custkey
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.nation AS n
        ON c.c_nationkey = n.n_nationkey
    GROUP BY 
        n.n_name, 
        c.c_mktsegment, 
        YEAR(o.o_orderdate), 
        o.o_orderpriority
);

Więcej informacji o tworzeniu tabel Iceberg i zarządzaniu nimi za pomocą Snowflake znajdziesz w oficjalnej dokumentacji.

Weryfikowanie danych w GCP

Sprawdź teraz zasobnik GCS. Powinny być widoczne pliki utworzone przez Snowflake. Potwierdza to, że eksport zakończył się powodzeniem. Metadane Iceberg znajdziesz w folderze metadata, a rzeczywiste dane w postaci plików Parquet w folderze data.

gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**"

Nazwy plików mogą się różnić, ale struktura powinna wyglądać tak:

gs://$GCS_BUCKET_NAME/snowflake_extvol/
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/data/snow_cbsKIRmdDmo_wLg128fugxg_0_2_009.parquet
...
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/metadata/00001-62f831ff-6708-4494-94c5-c891b7ad447f.metadata.json
...

Dane zostały skopiowane z Snowflake do Google Cloud Storage w formacie Iceberg.

Zapiszmy plik metadata.json w zmiennej środowiskowej, ponieważ będzie nam potrzebny później.

export GCS_METADATA_JSON=$(gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**" | grep .metadata.json)

5. Konfigurowanie tabeli zewnętrznej BigQuery

Tabela Iceberg znajduje się już w Google Cloud Storage. Następnym krokiem jest udostępnienie jej BigQuery. Możesz to zrobić, tworząc tabelę zewnętrzną BigLake.

BigLake to mechanizm przechowywania danych, który umożliwia tworzenie w BigQuery tabel odczytujących dane bezpośrednio ze źródeł zewnętrznych, takich jak Google Cloud Storage. W tym module jest to kluczowa technologia, która umożliwia BigQuery zrozumienie właśnie wyeksportowanej tabeli Iceberg bez konieczności pozyskiwania danych.

Aby to działało, potrzebne są 2 komponenty:

  1. Połączenie z zasobem w chmurze: jest to bezpieczne połączenie między BigQuery a GCS. Do obsługi uwierzytelniania używa specjalnego konta usługi, dzięki czemu BigQuery ma uprawnienia do odczytywania plików z zasobnika GCS.
  2. Definicja tabeli zewnętrznej: informuje BigQuery, gdzie w GCS znajduje się plik metadanych tabeli Iceberg i jak należy go interpretować.

Konfigurowanie połączenia z Google Cloud Storage

Najpierw zostanie utworzone połączenie, które umożliwi BigQuery dostęp do GCS. To polecenie tworzy zasób połączenia w BigQuery.

bq mk \
  --connection \
  --project_id=$GCP_PROJECT \
  --location=$GCP_REGION \
  --connection_type=CLOUD_RESOURCE \
  codelabs-retl-connection

Sukces będzie wyglądał mniej więcej tak:

Connection 12345678.region.codelabs-retl-connection successfully created

Więcej informacji o połączeniach zasobów Cloud w BigQuery znajdziesz w dokumentacji Google Cloud.

Autoryzowanie połączenia BigQuery do odczytywania danych

Nowe połączenie BigQuery ma własne konto usługi, które musi mieć uprawnienia do odczytu danych z zasobnika Google Cloud Storage.

1. Pobieranie konta usługi połączenia

Najpierw uzyskaj identyfikator konta usługi z utworzonego właśnie połączenia:

bq show \
  --location $GCP_REGION \
  --connection codelabs-retl-connection

Wyniki będą zawierać tabelę pasujących połączeń.

Ustawmy serviceAccountId jako zmienną środowiskową, która będzie używana później.

export GCP_BQ_SERVICE_ACCOUNT=<Your service account email>

2. Przyznaj uprawnienia

Uruchom to polecenie, aby autoryzować konto usługi do wyświetlania danych w zasobniku GCS.

gcloud storage buckets add-iam-policy-binding \
  gs://$GCS_BUCKET_NAME \
  --member serviceAccount:$GCP_BQ_SERVICE_ACCOUNT \
  --role roles/storage.objectViewer

Tworzenie tabeli zewnętrznej

Teraz utwórz zewnętrzną tabelę BigLake w BigQuery. To polecenie nie przenosi żadnych danych. Po prostu tworzy wskaźnik do istniejących danych w GCS. Będziesz potrzebować ścieżki do jednego z plików .metadata.json utworzonych przez Snowflake.

bq mk --dataset --location=$GCP_REGION codelabs_retl

bq mk \
    --table \
    --location=$GCP_REGION \
--external_table_definition=ICEBERG=$GCS_METADATA_JSON@projects/$GCP_PROJECT/locations/$GCP_REGION/connections/codelabs-retl-connection \
    codelabs_retl.regional_sales

Sprawdzanie danych w BigQuery

Teraz możesz wykonywać na tej tabeli zapytania w standardowej wersji SQL, tak jak w przypadku każdej innej tabeli BigQuery. BigQuery będzie używać połączenia do odczytywania plików Parquet z GCS na bieżąco.

bq query \
  --location=$GCP_REGION \
  --nouse_legacy_sql "SELECT * FROM \`$GCP_PROJECT.codelabs_retl.regional_sales\` LIMIT 10;"

6. Importowanie danych z BigQuery do Spannera: ostatni krok

Osiągnięto ostatnią i najważniejszą część potoku: przeniesienie danych z tabeli BigLake do Spannera. Jest to krok „Reverse ETL”, w którym dane po przetworzeniu i wyselekcjonowaniu w hurtowni danych są ładowane do systemu operacyjnego w celu wykorzystania przez aplikacje.

Spanner to w pełni zarządzana, globalnie rozpowszechniona relacyjna baza danych. Zapewnia spójność transakcyjną tradycyjnej relacyjnej bazy danych, ale z możliwością skalowania w poziomie bazy danych NoSQL. Dzięki temu jest to idealny wybór do tworzenia skalowalnych aplikacji o wysokiej dostępności.

Proces będzie przebiegał w ten sposób:

  1. Utwórz w bazie danych Spanner schemat tabeli, który będzie zgodny ze strukturą danych.
  2. Uruchom zapytanie BigQuery EXPORT DATA, aby wczytać dane z tabeli BigLake bezpośrednio do tabeli Spanner.

Tworzenie tabeli Spanner

Przed przeniesieniem danych z BigQuery w Spannerze musi zostać utworzona tabela docelowa ze zgodnym schematem.

gcloud spanner databases ddl update $SPANNER_DB \
  --instance=$SPANNER_INSTANCE \
  --ddl="$(cat <<EOF
CREATE TABLE regional_sales (
    nation_name STRING(MAX),
    market_segment STRING(MAX),
    order_year INT64,
    order_priority STRING(MAX),
    total_order_count INT64,
    total_revenue NUMERIC,
    unique_customer_count INT64
) PRIMARY KEY (nation_name, market_segment, order_year, order_priority);
EOF
)"

Eksportowanie danych z BigQuery

To ostatni krok. Gdy dane źródłowe są gotowe w tabeli BigLake w BigQuery, a tabela docelowa jest utworzona w Spannerze, rzeczywiste przenoszenie danych jest zaskakująco proste. Zostanie użyte jedno zapytanie BigQuery SQL: EXPORT DATA.

To zapytanie zostało zaprojektowane specjalnie na potrzeby takich scenariuszy. Umożliwia wydajne eksportowanie danych z tabeli BigQuery (w tym tabel zewnętrznych, takich jak tabela BigLake) do miejsca docelowego. W tym przypadku miejscem docelowym jest tabela Spannera.

bq query --location=$GCP_REGION --use_legacy_sql=false <<EOF
EXPORT DATA OPTIONS (
uri="https://spanner.googleapis.com/projects/${GCP_PROJECT}/instances/${SPANNER_INSTANCE}/databases/${SPANNER_DB}",
  format='CLOUD_SPANNER',
  spanner_options="""{ 
      "table": "regional_sales", 
      "priority": "HIGH" 
      }"""
) AS 
SELECT * FROM \`${PROJECT_ID}.codelabs_retl.regional_sales\`
EOF

Gdy zapytanie się zakończy, w panelu Wyniki powinien pojawić się komunikat „Aktualizacja zakończona”.

7. Weryfikowanie danych w usłudze Spanner

Gratulacje! Udało Ci się utworzyć i uruchomić pełny potok Reverse ETL. Ostatni krok to sprawdzenie, czy dane zostały przesłane do usługi Spanner zgodnie z oczekiwaniami.

gcloud spanner databases execute-sql \
  --instance=$SPANNER_INSTANCE \
  $SPANNER_DB \
  --sql='SELECT * FROM regional_sales LIMIT 10'

Zaimportowane przykładowe dane pojawią się zgodnie z żądaniem:

nation_name  market_segment  order_year  order_priority   total_order_count  total_revenue  unique_customer_count
ALGERIA      AUTOMOBILE      1992        1-URGENT         375                59232423.66    298
ALGERIA      AUTOMOBILE      1992        2-HIGH           328                47371891.08    269
ALGERIA      AUTOMOBILE      1992        3-MEDIUM         346                52823195.87    262
ALGERIA      AUTOMOBILE      1992        4-NOT SPECIFIED  365                52935998.34    288
ALGERIA      AUTOMOBILE      1992        5-LOW            380                54920263.68    293
ALGERIA      AUTOMOBILE      1993        1-URGENT         394                63145618.78    312
ALGERIA      AUTOMOBILE      1993        2-HIGH           340                50737488.4     277
ALGERIA      AUTOMOBILE      1993        3-MEDIUM         383                55871057.46    298
ALGERIA      AUTOMOBILE      1993        4-NOT SPECIFIED  365                56424662.05    291
ALGERIA      AUTOMOBILE      1993        5-LOW            363                54673249.06    283

Udało się połączyć światy danych analitycznych i operacyjnych.

8. Porządkowanie roszczeń

Czyszczenie Spannera

Usuwanie bazy danych i instancji usługi Spanner

gcloud spanner instances delete $SPANNER_INSTANCE

Czyszczenie GCS

Usuwanie zasobnika GCS utworzonego na potrzeby hostowania danych

gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

Czyszczenie BigQuery

bq rm -r codelabs_retl
bq rm --connection --location=$GCP_REGION codelabs-retl-connection

Czyszczenie Snowflake

Usuwanie bazy danych

  1. W menu po lewej stronie w sekcji Horizon Catalog najedź kursorem na Catalog (Katalog), a następnie kliknij Database Explorer (Eksplorator bazy danych).
  2. Kliknij po prawej stronie bazy danych CODELABS_RETL_DB, aby rozwinąć opcje, i wybierz Usuń.
  3. W wyświetlonym oknie potwierdzenia kliknij Drop Database (Usuń bazę danych).

Usuwanie skoroszytów

  1. W menu po lewej stronie w sekcji Praca z danymi najedź kursorem na Projekty, a następnie kliknij Obszary robocze.
  2. Na pasku bocznym Mój obszar roboczy najedź kursorem na różne pliki obszaru roboczego, których używasz w tym module, aby wyświetlić ... dodatkowe opcje, a następnie kliknij je.
  3. Kliknij Usuń, a następnie jeszcze raz Usuń w oknie potwierdzenia.
  4. Zrób to w przypadku wszystkich plików obszaru roboczego SQL utworzonych na potrzeby tego modułu.

Usuwanie woluminów zewnętrznych

  1. W menu po lewej stronie w sekcji Katalog Horizon najedź kursorem na Katalog, a następnie kliknij Dane zewnętrzne.
  2. Kliknij 227b3e306c3d609d.pngpo prawej stronie CODELABS_RETL_EXT_VOL i wybierz Odłącz wolumin zewnętrzny, a następnie ponownie kliknij Odłącz wolumin zewnętrzny w oknie potwierdzenia.

9. Gratulacje

Gratulujemy ukończenia ćwiczenia.

Omówione zagadnienia

  • Wczytywanie danych do Snowflake
  • Jak utworzyć zasobnik GCS
  • Eksportowanie tabeli Snowflake do GCS w formacie CSV
  • Konfigurowanie instancji usługi Spanner
  • Jak wczytywać tabele CSV do Spannera za pomocą Dataflow