Importa dati da database non Spanner

Questa pagina descrive come preparare i file Avro esportati da database non Spanner e quindi importarli in Spanner. Se vuoi importare un database Spanner che hai esportato in precedenza, consulta Importare i file Avro Spanner.

Il processo utilizza Dataflow; importa i dati da un bucket Cloud Storage contenente un set di file Avro e un file manifest JSON che specifica le tabelle di destinazione e i file Avro che popolano ciascuna tabella.

Prima di iniziare

Per importare un database Spanner, devi prima abilitare le API Spanner, Cloud Storage, Compute Engine e Dataflow:

Abilita le API

Devi inoltre disporre di una quota sufficiente e delle autorizzazioni IAM richieste.

Requisiti per le quote

I requisiti di quota per i job di importazione sono i seguenti:

  • Spanner: devi avere una capacità di calcolo sufficiente per supportare la quantità di dati che stai importando. Per importare un database, non è necessaria capacità di calcolo aggiuntiva, anche se potrebbe essere necessario aggiungerne maggiore in modo che il job venga completato in un periodo di tempo ragionevole. Per ulteriori dettagli, vedi Ottimizzare i lavori.
  • Cloud Storage: per l'importazione, devi avere un bucket contenente i file esportati in precedenza. Non è necessario impostare le dimensioni del bucket.
  • Dataflow: i job di importazione sono soggetti alle stesse quote di Compute Engine di CPU, utilizzo del disco e indirizzo IP degli altri job Dataflow.
  • Compute Engine: prima di eseguire il job di importazione, devi impostare le quote iniziali per Compute Engine, utilizzato da Dataflow. Queste quote rappresentano il numero massimo di risorse che Dataflow può utilizzare per il tuo job. I valori iniziali consigliati sono:

    • CPU: 200
    • Indirizzi IP in uso: 200
    • Disco permanente standard: 50 TB

    In genere, non devi apportare altre modifiche. Dataflow fornisce la scalabilità automatica in modo che tu paghi solo per le risorse effettive utilizzate durante l'importazione. Se il job può utilizzare più risorse, la UI di Dataflow mostra un'icona di avviso. Il job dovrebbe terminare anche se è presente un'icona di avviso.

Requisiti IAM

Per importare un database, devi anche disporre di ruoli IAM con autorizzazioni sufficienti per utilizzare tutti i servizi coinvolti in un job di importazione. Per informazioni sulla concessione di ruoli e autorizzazioni, consulta Applicare i ruoli IAM.

Per importare un database, sono necessari i seguenti ruoli:

Esportare i dati da un database non Spanner in file Avro

Il processo di importazione importa i dati dai file Avro che si trovano in un bucket Cloud Storage. Puoi esportare i dati in formato Avro da qualsiasi origine e utilizzare qualsiasi metodo disponibile per farlo.

Per esportare i dati da un database non Spanner in file Avro:

Quando esporti i dati, tieni presente quanto segue:

  • Puoi eseguire l'esportazione utilizzando uno qualsiasi dei tipi primitivi Avro e il tipo complesso di array.
  • Ogni colonna nei file Avro deve utilizzare uno dei seguenti tipi di colonna:

    • ARRAY
    • BOOL
    • BYTES*
    • DOUBLE
    • FLOAT
    • INT
    • LONG
    • STRING

    * Una colonna di tipo BYTES viene utilizzata per importare NUMERIC Spanner. Per i dettagli, consulta le mappature consigliate riportate di seguito.

    †,‡ Puoi importare un LONG con un timestamp o un STRING che memorizza un timestamp come TIMESTAMP Spanner; consulta le mappature consigliate di seguito per i dettagli.

  • Non è necessario includere o generare metadati quando esporti i file Avro.

  • Non è necessario seguire nessuna convenzione di denominazione particolare per i file.

Se non esporti i file direttamente in Cloud Storage, devi caricare i file Avro in un bucket Cloud Storage. Per istruzioni dettagliate, consulta Caricare oggetti in Cloud Storage.

Importa i file Avro da database non Spanner in Spanner

Per importare file Avro da un database non Spanner a Spanner:

  1. Crea tabelle di destinazione e definisci lo schema per il tuo database Spanner.
  2. Crea un file spanner-export.json nel tuo bucket Cloud Storage.
  3. Esegui un job di importazione di Dataflow utilizzando gcloud CLI.

Passaggio 1: crea lo schema per il database Spanner

Prima di eseguire l'importazione, devi creare la tabella di destinazione in Spanner e definirne lo schema.

Devi creare uno schema che utilizzi il tipo di colonna appropriato per ogni colonna nei file Avro.

GoogleSQL

Tipo di colonna Avro Tipo di colonna Spanner
ARRAY ARRAY
BOOL BOOL
BYTES

BYTES

NUMERIC (quando il tipo di colonna è BYTES e logicalType=decimal, precision=38 e scale=9. Se queste specifiche vengono omesse, il campo viene considerato come un valore BYTES di Spanner. Per saperne di più, consulta la documentazione relativa al tipo logico decimale Avro.

DOUBLE FLOAT64
FLOAT FLOAT64
INT INT64
LONG

INT64

TIMESTAMP quando LONG rappresenta un timestamp del numero di microsecondi dall'1/01/1970 alle 00:00:00 UTC

STRING

STRING

TIMESTAMP quando STRING rappresenta un timestamp nel formato canonico per le query SQL

PostgreSQL

Tipo di colonna Avro Tipo di colonna Spanner
ARRAY ARRAY
BOOL BOOLEAN
BYTES

BYTEA

NUMERIC (quando il tipo di colonna è BYTEA e logicalType=decimal, precision=147455 e scale=16383. Se queste specifiche esatte vengono omesse, il campo viene considerato come un valore BYTEA. Per saperne di più, consulta la documentazione relativa al tipo logico decimale Avro.

DOUBLE DOUBLE PRECISION
FLOAT DOUBLE PRECISION
INT BIGINT
LONG

BIGINT

TIMESTAMP quando LONG rappresenta un timestamp del numero di microsecondi dall'1/01/1970 alle 00:00:00 UTC

STRING

CHARACTER VARYING

TIMESTAMP quando STRING rappresenta un timestamp nel formato canonico per le query SQL, ad esempio "2022-05-28T07:08:21.123456789Z" o "2021-12-19T16:39:57-08:00".

Passaggio 2: crea un file spanner-export.json

Devi inoltre creare un file denominato spanner-export.json nel tuo bucket Cloud Storage. Questo file specifica il dialetto del database e contiene un array tables che elenca il nome e le posizioni dei file di dati per ogni tabella.

I contenuti del file hanno il seguente formato:

{
  "tables": [
   {
    "name": "TABLE1",
    "dataFiles": [
      "RELATIVE/PATH/TO/TABLE1_FILE1",
      "RELATIVE/PATH/TO/TABLE1_FILE2"
    ]
   },
   {
    "name": "TABLE2",
    "dataFiles": ["RELATIVE/PATH/TO/TABLE2_FILE1"]
   }
  ],
  "dialect":"DATABASE_DIALECT"
}

Dove DATABASE_DIALECT = {GOOGLE_STANDARD_SQL | POSTGRESQL}

Se l'elemento dialetto viene omesso, per impostazione predefinita il dialetto sarà GOOGLE_STANDARD_SQL.

Passaggio 3: esegui un job di importazione di Dataflow utilizzando gcloud CLI

Per avviare il job di importazione, segui le istruzioni per utilizzare Google Cloud CLI per eseguire un job con il modello da Avro a Spanner.

Dopo aver avviato un job di importazione, puoi visualizzarne i dettagli nella console Google Cloud.

Al termine del job di importazione, aggiungi eventuali indici secondari e chiavi esterne necessari.

Scegli una regione per il job di importazione

Puoi scegliere una regione diversa in base alla località del bucket Cloud Storage. Per evitare addebiti per il trasferimento di dati in uscita, scegli una regione che corrisponda alla località del bucket Cloud Storage.

  • Se la località del bucket Cloud Storage è una regione, puoi usufruire dell'utilizzo gratuito della rete scegliendo la stessa regione per il job di importazione, supponendo che quella regione sia disponibile.

  • Se la località del bucket Cloud Storage è a due regioni, puoi usufruire dell'utilizzo gratuito della rete scegliendo una delle due regioni che compongono la doppia regione per il job di importazione, supponendo che una delle regioni sia disponibile.

  • Se una regione con sede condivisa non è disponibile per il job di importazione o se la località bucket Cloud Storage è multiregionale, si applicano i costi per il trasferimento dei dati in uscita. Consulta i prezzi del trasferimento di dati di Cloud Storage per scegliere una regione in cui vengono addebitati i costi più bassi per il trasferimento di dati.

Visualizza o risolvi i problemi dei job nell'interfaccia utente di Dataflow

Dopo aver avviato un job di importazione, puoi visualizzare i dettagli del job, inclusi i log, nella sezione Dataflow della console Google Cloud.

Visualizza dettagli job Dataflow

Per visualizzare i dettagli di eventuali job di importazione/esportazione che hai eseguito nell'ultima settimana, inclusi eventuali job attualmente in esecuzione:

  1. Vai alla pagina Panoramica del database per il database.
  2. Fai clic sulla voce di menu Importa/Esporta nel riquadro a sinistra. La pagina Importa/Esporta del database mostra un elenco dei job recenti.
  3. Nella pagina Importa/Esporta del database, fai clic sul nome del job nella colonna Nome job Dataflow:

    Messaggio sullo stato del job in corso

    Nella console Google Cloud vengono visualizzati i dettagli del job Dataflow.

Per visualizzare un lavoro che hai eseguito più di una settimana fa:

  1. Vai alla pagina dei job Dataflow nella console Google Cloud.

    Vai alla pagina dei job

  2. Trova il job nell'elenco e fai clic sul suo nome.

    Nella console Google Cloud vengono visualizzati i dettagli del job Dataflow.

Visualizza i log di Dataflow per il tuo job

Per visualizzare i log di un job Dataflow, vai alla pagina dei dettagli del job come descritto in precedenza, quindi fai clic su Log a destra del nome del job.

Se un job non riesce, cerca gli errori nei log. In caso di errori, il numero di errori viene visualizzato accanto a Log:

Esempio di conteggio degli errori accanto al pulsante Log

Per visualizzare gli errori del job:

  1. Fai clic sul conteggio degli errori accanto a Log.

    Nella console Google Cloud vengono visualizzati i log del job. Potresti dover scorrere per vedere gli errori.

  2. Individua le voci con l'icona di errore Icona di errore.

  3. Fai clic su una singola voce di log per espanderne il contenuto.

Per ulteriori informazioni sulla risoluzione dei problemi dei job Dataflow, consulta Risoluzione dei problemi della pipeline.

Risolvere i problemi dei job di importazione non riusciti

Se visualizzi i seguenti errori nei log del job:

com.google.cloud.spanner.SpannerException: NOT_FOUND: Session not found

--or--

com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED: Deadline expired before operation could complete.

Controlla la latenza di scrittura del 99% nella scheda Monitoring del database Spanner nella console Google Cloud. Se mostra valori elevati (più secondi), significa che l'istanza è sovraccarico, causando un timeout delle scritture e un errore.

Una causa dell'alta latenza è che il job Dataflow viene eseguito utilizzando troppi worker, determinando un carico eccessivo sull'istanza Spanner.

Per specificare un limite per il numero di worker Dataflow, anziché utilizzare la scheda Importa/Esporta nella pagina dei dettagli dell'istanza del database Spanner nella console Google Cloud, devi avviare l'importazione utilizzando il modello da Cloud Storage Avro a Cloud Spanner di Dataflow e specificare il numero massimo di worker come descritto di seguito:
  • Se utilizzi la console di Dataflow, il parametro Numero massimo di worker si trova nella sezione Parametri facoltativi della pagina Crea job da modello.

  • Se utilizzi gcloud, specifica l'argomento max-workers. Ad esempio:

    gcloud dataflow jobs run my-import-job \
    --gcs-location='gs://dataflow-templates/latest/GCS_Avro_to_Cloud_Spanner' \
    --region=us-central1 \
    --parameters='instanceId=test-instance,databaseId=example-db,inputDir=gs://my-gcs-bucket' \
    --max-workers=10
    

Ottimizza i job di importazione a esecuzione lenta

Se hai seguito i suggerimenti nelle impostazioni iniziali, in genere non dovresti apportare altre modifiche. Se il job viene eseguito lentamente, puoi provare alcune altre ottimizzazioni:

  • Ottimizza il job e la località dei dati: esegui il job Dataflow nella stessa regione in cui si trovano l'istanza Spanner e il bucket Cloud Storage.

  • Garantisci un numero sufficiente di risorse Dataflow: se le quote di Compute Engine pertinenti limitano le risorse del tuo job Dataflow, nella pagina Dataflow del job nella console Google Cloud vengono visualizzati un'icona di avviso Icona di avviso e messaggi di log:

    Screenshot dell'avviso di limite di quota

    In questo caso, l'aumento delle quote per CPU, indirizzi IP in uso e disco permanente standard potrebbe ridurre il tempo di esecuzione del job, ma potresti incorrere in addebiti più alti di Compute Engine.

  • Controlla l'utilizzo della CPU di Spanner: se noti che l'utilizzo della CPU per l'istanza è superiore al 65%, puoi aumentare la capacità di calcolo in quell'istanza. La capacità aggiunge più risorse di Spanner e il job dovrebbe velocizzare il processo, ma ti verranno addebitati ulteriori costi di Spanner.

Fattori che influiscono sulle prestazioni del job di importazione

Il tempo necessario per completare un job di importazione dipende da diversi fattori.

  • Dimensioni del database Spanner: l'elaborazione di più dati richiede più tempo e risorse.

  • Schema del database Spanner, che include:

    • Il numero di tabelle
    • La dimensione delle righe.
    • Il numero di indici secondari
    • Il numero di chiavi esterne
    • Il numero di modifiche in tempo reale

  • Posizione dei dati: i dati vengono trasferiti tra Spanner e Cloud Storage utilizzando Dataflow. Idealmente, tutti e tre i componenti si trovano nella stessa regione. Se i componenti non si trovano nella stessa regione, lo spostamento dei dati tra regioni rallenta il job.

  • Numero di worker Dataflow: per buone prestazioni sono necessari worker Dataflow ottimali. Mediante la scalabilità automatica, Dataflow sceglie il numero di worker per il job in base alla quantità di lavoro da svolgere. Il numero di worker sarà tuttavia limitato dalle quote per CPU, indirizzi IP in uso e disco permanente standard. La UI di Dataflow mostra un'icona di avviso in caso di limiti di quota. In questo caso, l'avanzamento è più lento, ma il job dovrebbe comunque essere completato. La scalabilità automatica può sovraccaricare Spanner causando errori quando è presente una grande quantità di dati da importare.

  • Carico esistente su Spanner: un job di importazione aggiunge un carico della CPU significativo su un'istanza Spanner. Se l'istanza ha già un carico esistente considerevole, il job viene eseguito più lentamente.

  • Quantità di capacità di calcolo di Spanner: se l'utilizzo della CPU per l'istanza è superiore al 65%, il job viene eseguito più lentamente.

Ottimizza i worker per buone prestazioni di importazione

Quando avvii un job di importazione di Spanner, i worker Dataflow devono essere impostati su un valore ottimale per ottenere buone prestazioni. Troppi worker causino il sovraccarico di Spanner e un numero insufficiente di worker si traduce in prestazioni di importazione insufficienti.

Il numero massimo di worker dipende fortemente dalle dimensioni dei dati, ma Idealmente, l'utilizzo totale della CPU di Spanner dovrebbe essere compreso tra il 70% e il 90%. Questo offre un buon equilibrio tra efficienza di Spanner e completamento del job senza errori.

Per raggiungere questo target di utilizzo nella maggior parte degli schemi e degli scenari, consigliamo un numero massimo di vCPU worker compreso tra 4 e 6 volte il numero di nodi Spanner.

Ad esempio, per un'istanza Spanner a 10 nodi con worker n1-standard-2, imposterai il numero massimo di worker su 25, per ottenere 50 vCPU.