Questa pagina descrive come esportare i dati da Spanner in file CSV o importare i dati da file CSV in database con dialetto GoogleSQL o PostgreSQL di Spanner.
- Se vuoi importare un database Spanner che hai esportato in precedenza in file Avro in Cloud Storage, consulta Importare file Avro Spanner.
- Se vuoi importare file Avro da un database non Spanner, consulta la sezione Importare dati da database non Spanner.
Il processo utilizza Dataflow. Puoi esportare i dati da Spanner in un bucket Cloud Storage oppure importarli in Spanner da un bucket Cloud Storage contenente un file manifest JSON e un insieme di file CSV.
Prima di iniziare
Per importare o esportare un database Spanner, devi prima attivare le API Spanner, Cloud Storage, Compute Engine e Dataflow:
Devi anche disporre di una quota sufficiente e delle autorizzazioni IAM richieste.
Requisiti di quota
I requisiti di quota per i job di importazione o esportazione sono i seguenti:
- Spanner: devi disporre di una capacità di calcolo sufficiente per supportare la quantità di dati che stai importando. Per importare o esportare un database non è necessaria capacità di calcolo aggiuntiva, anche se potrebbe essere necessario aggiungerne altra per consentire al job di terminare in un periodo di tempo ragionevole. Per ulteriori dettagli, consulta la sezione Ottimizzare i job.
- Cloud Storage: per l'importazione, devi disporre di un bucket contenente i file esportati in precedenza. Per l'esportazione, devi creare un bucket per i file esportati se non ne hai già uno. Puoi farlo nella console Google Cloud , tramite la pagina Cloud Storage o durante la creazione dell'esportazione tramite la pagina Spanner. Non devi impostare una dimensione per il bucket.
- Dataflow: i job di importazione o esportazione 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 o esportazione, devi configurare le quote iniziali per Compute Engine, che viene utilizzato da Dataflow. 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
- Disco permanente standard: 50 TB
In genere, non devi apportare altre modifiche. Dataflow fornisce la scalabilità automatica in modo da pagare solo per le risorse effettive utilizzate durante l'importazione o l'esportazione. Se il tuo job può utilizzare più risorse, l'interfaccia utente Dataflow mostra un'icona di avviso. Il job deve 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 nel account di servizio worker Dataflow:
-
Visualizzatore Cloud Spanner (
roles/spanner.viewer
) -
Dataflow Worker (
roles/dataflow.worker
) -
Amministratore spazio di archiviazione (
roles/storage.admin
) -
Lettore database Spanner (
roles/spanner.databaseReader
) -
Amministratore database (
roles/spanner.databaseAdmin
)
Esportare i dati di Spanner in file CSV
Per esportare i dati da Spanner a file CSV in Cloud Storage, segui le istruzioni per utilizzare Google Cloud CLI per eseguire un job con il modello Spanner a Cloud Storage Text.
Puoi anche fare riferimento alle informazioni in questa pagina sull'ottimizzazione dei job lenti e sui fattori che influiscono sul rendimento dei job.
Importare i dati dai file CSV in Spanner
La procedura per importare i dati dai file CSV include i seguenti passaggi:
- Esporta i dati in file CSV e archiviali in Cloud Storage. Non includere una riga di intestazione.
- Crea un file manifest JSON e archivialo insieme ai file CSV.
- Crea tabelle di destinazione vuote nel database Spanner o assicurati che i tipi di dati per le colonne nei file CSV corrispondano a quelli delle colonne corrispondenti nelle tabelle esistenti.
- Esegui il job di importazione.
Passaggio 1: esporta i dati da un database non Spanner in file CSV
Il processo di importazione recupera i dati dai file CSV che si trovano in un bucket Cloud Storage. Puoi esportare i dati in formato CSV da qualsiasi origine.
Quando esporti i dati, tieni presente quanto segue:
- I file di testo da importare devono essere in formato CSV.
I dati devono corrispondere a uno dei seguenti tipi:
GoogleSQL
BOOL INT64 FLOAT64 NUMERIC STRING DATE TIMESTAMP BYTES JSON
PostgreSQL
boolean bigint double precision numeric character varying, text date timestamp with time zone bytea
Non devi includere o generare metadati quando esporti i file CSV.
Non devi seguire alcuna convenzione di denominazione particolare per i tuoi file.
Se non esporti i file direttamente in Cloud Storage, devi caricare i file CSV in un bucket Cloud Storage.
Passaggio 2: crea un file manifest JSON
Devi anche creare un file manifest con una descrizione JSON dei file da importare
e inserirlo nello stesso bucket Cloud Storage in cui hai archiviato i file CSV. Questo file manifest contiene un array tables
che elenca il nome e le posizioni dei file di dati per ogni tabella. Il file specifica anche il dialetto del database di ricezione.
Se il dialetto viene omesso, il valore predefinito è GoogleSQL.
Il formato del file manifest corrisponde al seguente tipo di messaggio, mostrato qui nel formato buffer di protocollo:
message ImportManifest {
// The per-table import manifest.
message TableManifest {
// Required. The name of the destination table.
string table_name = 1;
// Required. The CSV files to import. This value can be either a filepath or a glob pattern.
repeated string file_patterns = 2;
// The schema for a table column.
message Column {
// Required for each Column that you specify. The name of the column in the
// destination table.
string column_name = 1;
// Required for each Column that you specify. The type of the column.
string type_name = 2;
}
// Optional. The schema for the table columns.
repeated Column columns = 3;
}
// Required. The TableManifest of the tables to be imported.
repeated TableManifest tables = 1;
enum ProtoDialect {
GOOGLE_STANDARD_SQL = 0;
POSTGRESQL = 1;
}
// Optional. The dialect of the receiving database. Defaults to GOOGLE_STANDARD_SQL.
ProtoDialect dialect = 2;
}
L'esempio seguente mostra un file manifest per l'importazione di tabelle denominate Albums
e
Singers
in un database con dialetto GoogleSQL. La tabella Albums
utilizza lo schema delle colonne recuperato dal job
dal database, mentre la tabella Singers
utilizza lo schema specificato
dal file manifest:
{
"tables": [
{
"table_name": "Albums",
"file_patterns": [
"gs://bucket1/Albums_1.csv",
"gs://bucket1/Albums_2.csv"
]
},
{
"table_name": "Singers",
"file_patterns": [
"gs://bucket1/Singers*.csv"
],
"columns": [
{"column_name": "SingerId", "type_name": "INT64"},
{"column_name": "FirstName", "type_name": "STRING"},
{"column_name": "LastName", "type_name": "STRING"}
]
}
]
}
Passaggio 3: crea la tabella per il database Spanner
Prima di eseguire l'importazione, devi creare le tabelle di destinazione nel database Spanner. Se la tabella Spanner di destinazione ha già uno schema, le colonne specificate nel file manifest devono avere gli stessi tipi di dati delle colonne corrispondenti nello schema della tabella di destinazione.
Ti consigliamo di creare indici secondari, chiavi esterne e flussi di modifiche dopo aver importato i dati in Spanner, non quando crei inizialmente la tabella. Se la tabella contiene già queste strutture, ti consigliamo di eliminarle e ricrearle dopo aver importato i dati.
Passaggio 4: esegui un job di importazione Dataflow utilizzando gcloud
Per avviare il job di importazione, segui le istruzioni per l'utilizzo di Google Cloud CLI per eseguire un job con il modello Cloud Storage Text to Spanner.
Dopo aver avviato un job di importazione, puoi visualizzare i dettagli del job nella console Google Cloud .
Al termine del job di importazione, aggiungi gli indici secondari, le chiavi esterne e gli stream di modifiche necessari.
Scegli una regione per il job di importazione
Potresti voler scegliere un'altra regione in base alla posizione del tuo 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 posizione del bucket Cloud Storage è una regione, puoi usufruire dell'utilizzo gratuito della rete scegliendo la stessa regione per il job di importazione, se disponibile.
Se la posizione del bucket Cloud Storage è una doppia regione, 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 colocalizzata non è disponibile per il tuo job di importazione o se la località del bucket Cloud Storage è una multiregione, si applicano 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 o esportazione, puoi visualizzarne i dettagli, inclusi i log, nella sezione Dataflow della console Google Cloud .
Visualizza 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:
- Vai alla pagina Panoramica del database per il database.
- Fai clic sulla voce di menu Importa/Esporta nel riquadro a sinistra. La pagina Importa/Esporta del database mostra un elenco dei job recenti.
Nella pagina Importa/Esporta del database, fai clic sul nome del job nella colonna Nome job Dataflow:
La console Google Cloud mostra i dettagli del job Dataflow.
Per visualizzare un job eseguito più di una settimana fa:
Vai alla pagina dei job Dataflow nella console Google Cloud .
Trova il tuo lavoro nell'elenco e fai clic sul suo nome.
La console Google Cloud mostra i dettagli del job Dataflow.
Visualizzare i log 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 va a buon fine, cerca gli errori nei log. Se si verificano errori, il conteggio degli errori viene visualizzato accanto a Log:
Per visualizzare gli errori del job:
Fai clic sul conteggio degli errori accanto a Log.
La console Google Cloud mostra i log del job. Potresti dover scorrere per visualizzare gli errori.
Individua le voci con l'icona di errore
.
Fai clic su una singola voce di log per espandere i relativi contenuti.
Per saperne di più sulla risoluzione dei problemi relativi ai job Dataflow, consulta Risolvere i problemi della pipeline.
Risolvere i problemi relativi ai job di importazione o esportazione 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 lettura/scrittura del 99% nella scheda Monitoraggio del tuo database Spanner nella consoleGoogle Cloud . Se mostra valori elevati (più secondi), significa che l'istanza è sovraccarica, causando timeout e errori di lettura/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:Console
Se utilizzi la console Dataflow, il parametro Max workers si trova nella sezione Parametri facoltativi della pagina Crea job da modello.
gcloud
Esegui il comando gcloud dataflow jobs run
e specifica l'argomento max-workers
. Ad esempio:
gcloud dataflow jobs run my-import-job \
--gcs-location='gs://dataflow-templates/latest/GCS_Text_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 l'errore 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 o esportazione 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 la posizione del job e dei dati: esegui il job Dataflow nella stessa regione in cui si trovano l'istanza Spanner e il bucket Cloud Storage.
Assicurati che le risorse Dataflow siano sufficienti: se le quote di Compute Engine pertinenti limitano le risorse del job Dataflow, la pagina Dataflow nella console Google Cloud mostra un'icona di avviso
e messaggi di log:
In questa situazione, aumentare le quote per CPU, indirizzi IP in uso e disco permanente standard potrebbe ridurre il tempo di esecuzione del job, ma potresti incorrere in costi maggiori 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 altre risorse Spanner e il job dovrebbe accelerare, ma si verificano più addebiti Spanner.
Fattori che influiscono sul rendimento del job di importazione o esportazione
Diversi fattori influenzano il tempo necessario per completare un job di importazione o esportazione.
Dimensioni del database Spanner: l'elaborazione di più dati richiede più tempo e risorse.
Schema del database Spanner, tra cui:
- Il numero di tavoli
- La dimensione delle righe
- 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 le regioni rallenta il job.
Numero di worker Dataflow: per ottenere buone prestazioni sono necessari worker Dataflow 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 sarà comunque limitato dalle quote per CPU, indirizzi IP in uso e disco permanente standard. L'interfaccia utente Dataflow mostra un'icona di avviso se rileva limiti di quota. In questa situazione, l'avanzamento è più lento, ma il lavoro 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 significativo della CPU a un'istanza Spanner. Un job di esportazione in genere aggiunge un carico leggero 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 garantire un buon rendimento. Un numero eccessivo di worker sovraccarica Spanner, mentre un numero troppo basso di worker comporta prestazioni di importazione deludenti.
Il numero massimo di worker dipende molto dalle dimensioni dei dati, ma idealmente l'utilizzo totale della CPU 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, utilizzando worker n1-standard-2, imposteresti il numero massimo di worker su 25, ottenendo 50 vCPU.