Esportare i database da Spanner in Avro

Questa pagina descrive come esportare i database Spanner con la console Google Cloud.

Per esportare un database Spanner utilizzando l'API REST o Google Cloud CLI, completa i passaggi descritti nella sezione Prima di iniziare di questa pagina, quindi consulta le istruzioni dettagliate in Spanner to Cloud Storage Avro nella documentazione di Dataflow. Il processo di esportazione utilizza Dataflow e scrive i dati in una cartella di un bucket Cloud Storage. La cartella risultante contiene un insieme di file Avro e file manifest JSON.

Prima di iniziare

Per esportare un database Spanner, innanzitutto devi attivare le API Spanner, Cloud Storage, Compute Engine e Dataflow:

Enable the APIs

Inoltre, devi disporre di una quota sufficiente e delle autorizzazioni IAM richieste.

Requisiti delle quote

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

  • Spanner: non è richiesta alcuna capacità di calcolo aggiuntiva per esportare un database, ma potrebbe essere necessario aggiungere altra capacità di calcolo in modo che il job venga completato in un periodo di tempo ragionevole. Per ulteriori dettagli, consulta la sezione Job di ottimizzazione.
  • Cloud Storage: per eseguire 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 è necessario impostare una dimensione per il bucket.
  • Dataflow: i job di esportazione sono soggetti alle stesse quote di Compute Engine per CPU, utilizzo del disco e indirizzo IP degli altri job Dataflow.
  • Compute Engine: prima di eseguire il job di esportazione, devi configurare le quote iniziali per Compute Engine, 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 rigido permanente standard: 50 TB

    In genere, non è necessario apportare altre modifiche. Dataflow fornisce la scalabilità automatica, in modo da pagare solo per le risorse effettive utilizzate durante l'esportazione. Se il job può utilizzare più risorse, l'interfaccia utente di Dataflow mostra un'icona di avviso. Il job dovrebbe essere completato 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 per l'account di servizio worker Dataflow:

Per utilizzare le risorse di calcolo indipendenti di Spanner Data Boost durante un'esportazione, è necessaria anche l'autorizzazione IAMspanner.databases.useDataBoost. Per ulteriori informazioni, consulta la panoramica di Data Boost.

Esportare un database

Dopo aver soddisfatto i requisiti di quota e IAM descritti precedentemente, puoi esportare un database Spanner esistente.

Per esportare il database Spanner in un bucket Cloud Storage:

  1. Vai alla pagina Istanze di Spanner.

    Vai a Istanze

  2. Fai clic sul nome dell'istanza che contiene il database.

  3. Fai clic sulla voce di menu Importazione/esportazione nel riquadro a sinistra e poi sul pulsante Esporta.

  4. In Scegli dove archiviare l'esportazione, fai clic su Sfoglia.

  5. Se non hai già un bucket Cloud Storage per l'esportazione:

    1. Fai clic su Nuovo bucket Screenshot del nuovo elemento dell'interfaccia utente del bucket.
    2. Inserisci un nome per il bucket. I nomi dei bucket devono essere univoci in Cloud Storage.
    3. Seleziona una classe di archiviazione e una posizione predefinite, quindi fai clic su Crea.
    4. Fai clic sul bucket per selezionarlo.

    Se hai già un bucket, selezionalo dall'elenco iniziale o fai clic su Cerca Screenshot dell'elemento dell'interfaccia utente di ricerca per filtrare l'elenco, quindi fai clic sul bucket per selezionarlo.

  6. Fai clic su Seleziona.

  7. Seleziona il database da esportare nel menu a discesa Scegli un database da esportare.

  8. (Facoltativo) Per esportare il database da un momento precedente, seleziona la casella e inserisci un timestamp.

  9. Seleziona una regione nel menu a discesa Scegli una regione per il job di esportazione.

  10. (Facoltativo) Per criptare lo stato della pipeline di Dataflow con una chiave di crittografia gestita dal cliente:

    1. Fai clic su Mostra opzioni di crittografia.
    2. Seleziona Usa una chiave di crittografia gestita dal cliente (CMEK).
    3. Seleziona la chiave dall'elenco a discesa.

    Questa opzione non influisce sulla crittografia a livello di bucket Cloud Storage di destinazione. Per attivare CMEK per il bucket Cloud Storage, consulta Utilizzare CMEK con Cloud Storage.

  11. (Facoltativo) Per esportare utilizzando Spanner Data Boost, seleziona la casella di controllo Usa Spanner Data Boost. Per ulteriori informazioni, consulta la panoramica di Data Boost.

  12. Seleziona la casella di controllo in Conferma addebiti per confermare che sono presenti addebiti aggiuntivi rispetto a quelli sostenuti dall'istanza Spanner esistente.

  13. Fai clic su Esporta.

    Nella console Google Cloud viene visualizzata la pagina Importazione/esportazione di database, che ora mostra un elemento pubblicitario per il job di esportazione nell'elenco dei job di importazione/esportazione, incluso il tempo trascorso dal job:

    Screenshot del job in corso

Al termine o all'interruzione del job, lo stato viene aggiornato nell'elenco Importazione/esportazione. Se il job è riuscito, viene visualizzato lo stato Riuscito:

Messaggio di esito positivo del job di esportazione

Se il job non è andato a buon fine, viene visualizzato lo stato Non riuscito:

Messaggio di errore del job di esportazione

Per visualizzare i dettagli dell'operazione Dataflow per il tuo job, fai clic sul nome del job nella colonna Nome job Dataflow.

Se il job non va a buon fine, controlla i log di Dataflow del job per i dettagli dell'errore.

Per evitare addebiti di Cloud Storage per i file creati dal tuo job di esportazione non riuscito, elimina la cartella e i relativi file. Per informazioni su come trovare la cartella, vedi Visualizzare l'esportazione.

Nota sull'esportazione delle colonne generate e degli stream di modifiche

I valori di una colonna generata archiviata non vengono esportati. La definizione della colonna viene esportata nello schema Avro come campo di record di tipo null, con la definizione della colonna come proprietà personalizzate del campo. Fino al completamento dell'operazione di completamento precedente di una colonna generata appena aggiunta, la colonna generata viene ignorata come se non esistesse nello schema.

Gli stream di variazioni esportati come file Avro contengono solo lo schema degli stream di variazioni e non i record di variazione dei dati.

Una nota sull'esportazione delle sequenze

Le sequenze (GoogleSQL, PostgreSQL) sono oggetti dello schema che utilizzi per generare valori interi univoci. Spanner esporta ogni oggetto dello schema nello schema Avro come campo del record, con il tipo di sequenza, l'intervallo saltato e il contatore come proprietà del campo. Tieni presente che per impedire il ripristino dei valori di una sequenza e la generazione di valori duplicati dopo l'importazione, durante l'esportazione dello schema, la funzione GET_INTERNAL_SEQUENCE_STATE() (GoogleSQL, PostgreSQL) cattura il contatore della sequenza. Spanner aggiunge un buffer di 1000 al contatore e scrive il nuovo valore del contatore nel campo del record. Questo approccio evita gli errori relativi ai valori duplicati che potrebbero verificarsi dopo l'importazione. Se durante l'esportazione dei dati vengono eseguite più scritture nel database di origine, devi aggiustare il contatore di sequenza effettivo utilizzando l'istruzione ALTER SEQUENCE (GoogleSQL, PostgreSQL).

Al momento dell'importazione, la sequenza inizia da questo nuovo contatore anziché da quello trovato nello schema. In alternativa, puoi utilizzare l'istruzione ALTER SEQUENCE (GoogleSQL, PostgreSQL) per aggiornare la sequenza con un nuovo contatore.

Visualizzare l'esportazione in Cloud Storage

Per visualizzare la cartella contenente il database esportato nella console Google Cloud, vai al browser Cloud Storage e scegli il bucket selezionato in precedenza:

Vai a Browser di archiviazione

Il bucket ora contiene una cartella con il database esportato al suo interno. Il nome della cartella inizia con l'ID dell'istanza, il nome del database e il timestamp del job di esportazione. La cartella contiene:

  • Un file spanner-export.json
  • Un file TableName-manifest.json per ogni tabella del database che hai esportato.
  • Uno o più file TableName.avro-#####-of-#####. Il primo numero nell'estensione.avro-#####-of-##### rappresenta l'indice del file Avro, a partire da zero, mentre il secondo rappresenta il numero di file Avro generati per ogni tabella.

    Ad esempio, Songs.avro-00001-of-00002 è il secondo di due file che contengono i dati per la tabella Songs.

  • Un file ChangeStreamName-manifest.json per ogni flusso di modifiche nel database che hai esportato.

  • Un file ChangeStreamName.avro-00000-of-00001 per ogni stream di modifiche. Questo file contiene dati vuoti con solo lo schema Avro del flusso di modifiche.

Scegli una regione per il job di importazione

Ti consigliamo di scegliere una regione diversa 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, a condizione che sia disponibile.

  • Se la località 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 tuo job di importazione, supponendo che una delle regioni sia disponibile.

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

Esportare un sottoinsieme di tabelle

Se vuoi esportare solo i dati di determinate tabelle e non l'intero database, puoi specificare queste tabelle durante l'esportazione. In questo caso, Spanner esporta l'intero schema del database, inclusi i dati delle tabelle specificate, e lascia tutte le altre tabelle presenti, ma vuote, nel file esportato.

Puoi specificare un sottoinsieme di tabelle da esportare utilizzando la pagina Dataflow nella console Google Cloud o l'interfaccia a riga di comando gcloud. (la pagina Spanner non fornisce questa azione).

Se esporti i dati di una tabella che è figlia di un'altra, devi esportare anche i dati della tabella principale. Se i gruppi di annunci principali non vengono esportati, il job di esportazione non va a buon fine.

Per esportare un sottoinsieme di tabelle, avvia l'esportazione utilizzando il modello Avro di Spanner in Cloud Storage di Dataflow e specifica le tabelle utilizzando la pagina Dataflow nella console Google Cloud o l'interfaccia a riga di comando gcloud, come descritto di seguito:

Console

Se utilizzi la pagina Dataflow nella console Google Cloud, il parametro Nomi delle tabelle Cloud Spanner si trova nella sezione Parametri facoltativi della pagina Crea job da modello. È possibile specificare più tabelle in un formato separato da virgole.

Vai a Dataflow

gcloud

Esegui il comando gcloud dataflow jobs run e specifica l'argomento tableNames. Ad esempio:

gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='instanceId=test-instance,databaseId=example-db,tableNames=table1,outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123

La specifica di più tabelle in gcloud richiede il d'escaping degli argomenti di tipo dizionario. L'esempio seguente utilizza "|" come carattere di escape:

 gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='^|^instanceId=test-instance|databaseId=example-db|tableNames=table1,table2|outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123

Il parametro shouldExportRelatedTables è un'opzione pratica per esportare automaticamente tutte le tabelle principali delle tabelle scelte. Ad esempio, in questa gerarchia dello schema con le tabelle Singers, Albums e Songs, devi specificare solo Songs. L'opzione shouldExportRelatedTables esporta anche Singers e Albums perché Songs è un discendente di entrambi.

gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='instanceId=test-instance,databaseId=example-db,tableNames=Songs,shouldExportRelatedTables=true,outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123

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

Dopo aver avviato un job di 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 eventuali job di importazione o esportazione eseguiti nell'ultima settimana, inclusi quelli in esecuzione:

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

    Messaggio di stato del job in corso

    La console Google Cloud mostra i dettagli del job Dataflow.

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

  1. Vai alla pagina Job Dataflow nella console Google Cloud.

    Vai a Job

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

    La console Google Cloud 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 va a buon fine, cerca gli errori nei log. Se sono presenti errori, il relativo conteggio 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 console Google Cloud 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 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 esportazione non riusciti

Se nei log del job vengono visualizzati i seguenti errori:

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 del 99% nella scheda Monitoraggio del database Spanner nella console Google Cloud. Se vengono visualizzati valori elevati (più secondi), significa che l'istanza è sovraccaricata, causando il timeout e l'errore delle letture.

Una causa della latenza elevata è 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 di Dataflow, anziché utilizzare la scheda Importa/Esporta nella pagina dei dettagli dell'istanza del tuo database Spanner nella console Google Cloud, devi avviare l'esportazione utilizzando il modello Avro di Spanner a Cloud Storage di Dataflow e specificare il numero massimo di worker come descritto di seguito:

Console

Se utilizzi la console Dataflow, il parametro Numero massimo di worker si trova nella sezione Parametri facoltativi della pagina Crea job da modello.

Vai a Dataflow

gcloud

Esegui il comando gcloud dataflow jobs run e specifica l'argomento max-workers. Ad esempio:

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

Risolvere gli 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 esportazione con esecuzione lenta

Se hai seguito i suggerimenti nelle impostazioni iniziali, in genere non devi apportare altre modifiche. Se il job funziona 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 di disporre di risorse Dataflow sufficienti: se le quote Compute Engine pertinenti limitano le risorse del job Dataflow, la pagina Dataflow del job nella console Google Cloud 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 le CPU, gli indirizzi IP in uso e i dischi permanenti standard potrebbe ridurre il tempo di esecuzione del job, ma potresti incorrere in più costi di Compute Engine.

  • Verifica 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 velocizzarsi, ma dovrai sostenere più costi Spanner.

Fattori che influiscono sul rendimento dei job di esportazione

Diversi fattori influiscono sul tempo necessario per completare un job di esportazione.

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

  • Schema del database Spanner, inclusi:

    • Il numero di tabelle
    • La dimensione delle righe
    • Il numero di indici secondari
    • Il numero di chiavi esterne
    • Il numero di stream di modifiche

  • Posizione dei dati: i dati vengono trasferiti tra Spanner e Cloud Storage utilizzando Dataflow. Idealmente, tutti e tre gli elementi 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. Tuttavia, il numero di worker sarà limitato dalle quote per CPU, indirizzi IP in uso e disco permanente standard. L'interfaccia utente di Dataflow mostra un'icona di avviso se vengono raggiunti i limiti di quota. In questa situazione, l'avanzamento è più lento, ma il job dovrebbe comunque essere completato.

  • Carico esistente su Spanner: in genere, un job di esportazione aggiunge un carico ridotto a un'istanza Spanner. Se l'istanza ha già un carico 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.