Importare dati da database non Spanner

Questa pagina descrive come preparare i file Avro esportati da database non Spanner e poi importarli in Spanner. Queste procedure includono informazioni per i database con dialetto GoogleSQL e per quelli con dialetto PostgreSQL. Se vuoi importare un database Spanner che hai esportato in precedenza, consulta Importare file Avro di Spanner.

La procedura utilizza Dataflow e importa i dati da un bucket Cloud Storage che contiene un insieme di file Avro e un file manifest JSON che specifica le tabelle di destinazione e i file Avro che popolano ogni tabella.

Prima di iniziare

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

Ruoli richiesti per abilitare le API

Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin), che contiene l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

Abilita le API

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

Requisiti di quota

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

  • Spanner: devi disporre di una capacità di calcolo sufficiente per supportare la quantità di dati che stai importando. Non è necessaria ulteriore capacità di calcolo per importare un database, anche se potrebbe essere necessario aggiungerne altra per consentire al job di terminare in un periodo di tempo ragionevole. Per ulteriori dettagli, consulta Ottimizzare i job.
  • Cloud Storage: per importare, devi disporre di un bucket contenente i file esportati in precedenza. Non è necessario impostare una dimensione per il bucket.
  • Dataflow: i job di importazione sono soggetti alle stesse quote di CPU, utilizzo del disco e indirizzo IP di Compute Engine degli altri job Dataflow.
  • Compute Engine: prima di eseguire il job di importazione, devi configurare le quote iniziali per Compute Engine, che Dataflow utilizza. Queste quote rappresentano il numero massimo di risorse che consenti a Dataflow di utilizzare per il tuo job. I valori iniziali consigliati sono:

    • CPU: 200
    • Indirizzi IP in uso: 200
    • Standard Persistent Disk: 50 TB

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

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per esportare un database, chiedi all'amministratore di concederti i seguenti ruoli IAM sul account di servizio worker di Dataflow:

Esportare i dati da un database non Spanner in file Avro

La procedura 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 esportare i dati da un database non Spanner in file Avro:

Tieni presente quanto segue quando esporti i dati:

  • Puoi esportare utilizzando uno dei tipi primitivi Avro e il tipo complesso di array.
  • Ogni colonna dei 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 un NUMERIC di Spanner; per ulteriori dettagli, consulta la sezione seguente relativa alle mappature consigliate.

    †,‡ Puoi importare un LONG che memorizza un timestamp o una STRING che memorizza un timestamp come TIMESTAMP di Spanner; per ulteriori dettagli, consulta la sezione seguente relativa alle mappature consigliate.

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

  • Non devi seguire una convenzione di denominazione specifica per i file.

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

Importare file Avro da database non Spanner in Spanner

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

  1. Crea le tabelle di destinazione e definisci lo schema per il database Spanner.
  2. Crea un file spanner-export.json nel bucket Cloud Storage.
  3. Esegui un job di importazione 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 dei 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 esatte vengono omesse, il campo viene trattato come un valore BYTES di Spanner. Per ulteriori informazioni, consulta la documentazione sul tipo logico decimale di Avro .)

DOUBLE FLOAT64
FLOAT FLOAT64
INT INT64
LONG

INT64

TIMESTAMP quando LONG rappresenta un timestamp del numero di microsecondi dal giorno 01/01/1970 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 trattato come un valore BYTEA. Per ulteriori informazioni, consulta la documentazione sul tipo logico decimale di Avro .)

DOUBLE DOUBLE PRECISION
FLOAT DOUBLE PRECISION
INT BIGINT
LONG

BIGINT

TIMESTAMP quando LONG rappresenta un timestamp del numero di microsecondi dal giorno 01/01/1970 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 anche creare un file denominato spanner-export.json nel 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 del dialetto viene omesso, il dialetto predefinito è GOOGLE_STANDARD_SQL.

Passaggio 3: esegui un job di importazione 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 Avro to Spanner.

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

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

Scegliere una regione per il job di importazione

Potresti voler 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 della rete senza costi scegliendo la stessa regione per il job di importazione, a condizione che la regione sia disponibile.

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

  • Se una regione in co-location non è disponibile per il job di importazione o se la località del bucket Cloud Storage è una regione multipla, vengono applicati addebiti per il trasferimento di dati in uscita. Consulta i prezzi del trasferimento di dati di Cloud Storage per scegliere una regione che comporti gli addebiti per il trasferimento di dati più bassi.

Visualizzare o risolvere i problemi relativi ai job nell'interfaccia utente di Dataflow

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

Visualizzare i dettagli del job Dataflow

Per visualizzare i dettagli di tutti i job di importazione o esportazione eseguiti nell'ultima settimana, inclusi quelli in esecuzione:

  1. Vai alla pagina Panoramica database del database.
  2. Fai clic sulla voce di menu del riquadro a sinistra Importa/Esporta. 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 di stato del job in corso

    La Google Cloud console mostra i dettagli del job Dataflow.

Per visualizzare un job eseguito più di una settimana fa:

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

    Vai a Job

  2. Trova il job nell'elenco, quindi fai clic sul relativo nome.

    La Google Cloud console mostra i dettagli del job Dataflow.

Visualizzare i log di Dataflow per il job

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

Se un job non riesce, cerca gli errori nei log. Se sono presenti errori, il conteggio degli 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.

    La Google Cloud console mostra i log del job. Potresti dover scorrere per visualizzare 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 i contenuti.

Per ulteriori informazioni sulla risoluzione dei problemi relativi ai job Dataflow, consulta Risolvere i problemi relativi alla pipeline.

Risolvere i problemi relativi ai job di importazione non riusciti

Se visualizzi i seguenti errori nei log dei 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 Monitoraggio del database Spanner nella Google Cloud console. Se mostra valori elevati (più secondi), allora significa che l'istanza è sovraccaricata, causando timeout e errori di scrittura.

Una delle cause dell'elevata latenza è che il job Dataflow viene eseguito utilizzando troppi worker, il che comporta un carico eccessivo sull'istanza Spanner.

Per specificare un limite al numero di worker Dataflow, anziché utilizzare la scheda Importa/Esporta nella pagina dei dettagli dell'istanza del database Spanner nella Google Cloud console, devi avviare l'importazione utilizzando il modello Avro di Cloud Storage in Spanner di Dataflow e specificare il numero massimo di worker come descritto di seguito:

Console

Se utilizzi la console Dataflow, il parametro Worker massimi si trova nella sezione Parametri facoltativi della pagina Crea job da modello.

Vai a Dataflow

gcloud

Esegui il gcloud dataflow jobs run comando e 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 \
    --network=network-123

Risolvere i problemi relativi agli errori di rete

Quando esporti i database Spanner, potrebbe verificarsi il seguente errore:

Workflow failed. Causes: Error: Message: Invalid value for field
'resource.properties.networkInterfaces[0].subnetwork': ''. Network interface
must specify a subnet if the network resource is in custom subnet mode.
HTTP Code: 400

Questo errore si verifica perché Spanner presuppone che tu voglia utilizzare una rete VPC in modalità automatica denominata default nello stesso progetto del job Dataflow. Se non hai una rete VPC predefinita nel progetto o se la tua rete VPC è in modalità personalizzata, devi creare un job Dataflow e specificare una rete o una subnet alternativa.

Ottimizzare 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:

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

  • Garantire risorse Dataflow sufficienti: se le quote di Compute Engine pertinenti limitano le risorse del job Dataflow, la pagina Dataflow del job nella Google Cloud console mostra un'icona di avviso Icona di avviso e messaggi di log:

    Screenshot dell'avviso relativo al limite di quota

    In questa situazione, 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 maggiori addebiti di Compute Engine.

  • Controllare l'utilizzo della CPU di Spanner: se l'utilizzo della CPU per l'istanza è superiore al 65%, puoi aumentare la capacità di calcolo in quell'istanza. La capacità aggiunge altre risorse Spanner e il job dovrebbe accelerare, ma incorrerai in maggiori addebiti di Spanner.

Fattori che influiscono sulle prestazioni dei job di importazione

Diversi fattori influenzano il tempo necessario per completare un job di importazione.

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

  • Schema del database Spanner, tra cui:

    • Il numero di tabelle
    • Le dimensioni delle righe
    • Il numero di indici secondari
    • Il numero di chiavi esterne
    • Il numero di modifiche in tempo reale

  • Località 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 le regioni rallenta il job.

  • Numero di worker Dataflow: i worker Dataflow ottimali sono necessari per prestazioni ottimali. Utilizzando la scalabilità automatica, Dataflow sceglie il numero di worker per il job in base alla quantità di lavoro da svolgere. Il numero di worker, tuttavia, sarà limitato dalle quote per CPU, indirizzi IP in uso e Standard Persistent Disk. L'interfaccia utente di Dataflow mostra un'icona di avviso se rileva limiti di quota. In questa situazione, 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 di CPU significativo a un'istanza Spanner. Se l'istanza ha già un carico esistente sostanziale, 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.

Ottimizzare i worker per prestazioni di importazione ottimali

Quando avvii un job di importazione Spanner, i worker Dataflow devono essere impostati su un valore ottimale per prestazioni ottimali. Un numero eccessivo di worker sovraccarica Spanner, mentre un numero insufficiente di worker comporta prestazioni di importazione deludenti.

Il numero massimo di worker dipende in gran parte 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 l'efficienza di Spanner e il 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, utilizzando worker n1-standard-2, imposteresti il numero massimo di worker su 25, ottenendo 50 vCPU.