Scritture

Questa pagina elenca i tipi di richieste di scrittura che puoi inviare a Bigtable e descrive quando utilizzarle e quando no. Per informazioni sull'aggregazione dei dati in una cella al momento della scrittura, consulta Aggregare i valori al momento della scrittura.

L'API Bigtable Data e le librerie client consentono di scrivere dati nelle tabelle in modo programmatico. Bigtable restituisce un una risposta o un riconoscimento per ogni scrittura.

Ogni libreria client offre la possibilità di inviare i seguenti tipi di scrittura richieste:

  • Scritture semplici
  • Incrementi e aggiunte
  • Scritture condizionali
  • Scritture batch

Le librerie client di Bigtable dispongono di una funzionalità di ripetizione intelligente integrata per le scritture semplici e in batch, il che significa che gestiscono senza problemi l'interruzione temporanea del servizio. Ad esempio, se la tua applicazione tenta di scrivere dati e riscontra un'interruzione temporanea o un problema di rete, nuovi tentativi finché non viene eseguito il commit della scrittura o fino al raggiungimento della scadenza della richiesta. Questa resilienza funziona sia con istanze a cluster singolo che con istanze replicate, con routing a cluster singolo o a cluster multipli.

Per le operazioni di scrittura in batch e in streaming, puoi utilizzare il connettore Beam Bigtable. Per ulteriori informazioni, consulta la sezione Scritture collettive.

Per informazioni sui limiti che si applicano alle richieste di scrittura, consulta Quote e limiti.

Per esempi di richieste di scrittura della libreria client Cloud Bigtable descritte in questa pagina, consulta Esempi di scrittura.

Tipi di scrittura e quando utilizzarli

Tutte le richieste di scrittura includono i seguenti componenti di base:

  • Il nome della tabella in cui scrivere.
  • Un ID profilo dell'app, che indica a Bigtable come instradare il traffico.
  • Una o più mutazioni. Una mutazione è costituita dai seguenti elementi:
    • Nome famiglia di colonne
    • Qualificatore colonna
    • Timestamp
    • Valore che stai scrivendo nella tabella

Il timestamp di una mutazione ha un valore predefinito corrispondente alla data e all'ora correnti, misurata come il tempo trascorso dall'epoca di Unix, 00:00:00 UTC 1° gennaio 1970.

Un timestamp inviato a Bigtable deve essere espresso con un valore in microsecondi e una precisione massima di un millisecondo. Un timestamp con precisione in microsecondi, come 3023483279876543 è stata rifiutata. In questo esempio, il valore accettabile per il timestamp è 3023483279876000.

Tutte le mutazioni in le singole richieste di scrittura hanno lo stesso timestamp, a meno che non le sostituisci. Puoi imposta il timestamp di tutte le mutazioni in una richiesta di scrittura in modo che sia lo stesso o diversi tra loro.

Scritture semplici

Puoi scrivere una singola riga in Bigtable con una richiesta MutateRow che include il nome della tabella, l'ID del profilo dell'app da utilizzare, una chiave di riga e fino a 100.000 mutazioni per quella riga. In caso di scrittura su riga singola, atomico. Utilizza questo tipo di scrittura quando apporti più mutazioni a una singola riga.

Per esempi di codice che mostrano come inviare semplici richieste di scrittura, consulta Eseguire una scrittura semplice.

Quando non utilizzare le scritture semplici

Le scritture semplici non sono il modo migliore per scrivere dati per i seguenti casi d'uso:

  • Stai scrivendo un batch di dati che avrà chiavi di riga contigue. In questo caso, devi utilizzare le scritture batch anziché le scritture semplici consecutive, perché un batch contiguo può essere applicato in una singola chiamata di backend.

  • Ti serve una velocità effettiva elevata (righe al secondo o byte al secondo) e non hai bisogno di una bassa latenza. In questo caso, le scritture in batch saranno più veloci.

Incrementi e aggiunte

Quando vuoi aumentare o incrementare un valore, l'opzione migliore è utilizzare gli aggregati, che ti consentono di aggiornare un valore al momento della scrittura. I dati aggregati non supportano operazioni di aggiunta. Per ulteriori informazioni, vedi Aggrega i valori al momento della scrittura.

Se vuoi aggiungere dati a un valore esistente o devi incrementare un valore numerico esistente e non puoi utilizzare gli aggregati, puoi inviare una richiesta ReadModifyWriteRow. Questa richiesta include il nome della tabella, l'ID il profilo dell'app da utilizzare, una chiave di riga e un insieme di regole da utilizzare scrivere i dati. Ogni regola include nome della famiglia di colonne, qualificatore di colonna e un valore di aggiunta o un importo di incremento.

Le regole vengono applicate in ordine. Ad esempio, se la tua richiesta include una richiesta a incrementare di due il valore di una colonna e una regola successiva nella stessa richiesta la stessa colonna viene incrementata di 1, la colonna viene incrementata di 3 in questa colonna scrittura atomica. La regola successiva non sovrascrive quella precedente.

Un valore può essere incrementato solo se è codificato come valore intero con segno a 64 bit in big endian. Bigtable tratta un incremento a un valore vuoto o non esiste come se il valore fosse zero. Le richieste ReadModifyWriteRow sono atomiche. Non viene eseguito alcun nuovo tentativo se non riescono per qualsiasi motivo.

Per gli esempi di codice che dimostrano come aggiungere un valore in una cella, consulta Aumento di un valore esistente.

Quando non usare ReadModifyWriteRow

Non inviare richieste ReadModifyWriteRow nelle seguenti situazioni:

  • Il tuo caso d'uso può essere gestito tramite gli aggregati.

  • Stai utilizzando un profilo dell'app con routing a cluster multipli.

  • Utilizzi più profili di app a cluster singolo e invii scritture che potrebbero entrare in conflitto con i dati scritti nella stessa riga e colonna in altri cluster dell'istanza. Con il routing a un cluster singolo, una richiesta di scrittura viene inviata a un singolo cluster e poi replicata.

  • Ti affidi alla funzionalità dei tentativi intelligenti fornita dalle librerie client. Non è possibile ripetere gli incrementi e gli aggiunte.

  • Stai scrivendo grandi quantità di dati e hai bisogno di completare le operazioni di scrittura rapidamente. Una richiesta che legge e poi modifica una riga è più lenta di una semplice richiesta di scrittura. Di conseguenza, questo tipo di scrittura spesso non è l'approccio migliore su larga scala.

    Ad esempio, se vuoi contare qualcosa che si misura in milioni, come le visualizzazioni di pagina, devi utilizzare gli aggregati per aggiornare i conteggi al momento della scrittura. Tu puoi anche registrare ogni visualizzazione come una semplice scrittura, anziché incrementare un valore e poi utilizzare un job Dataflow per aggregare e i dati di Google Cloud.

Scritture condizionali

Se vuoi verificare la presenza di una condizione in una riga e poi, a seconda del risultato, scrivere dati in quella riga, invia una richiesta CheckAndMutateRow. Questo tipo di richiesta include una chiave di riga e un filtro per riga. Un filtro riga è un insieme di regole che utilizzi per controllare il valore dei dati esistenti. Le mutazioni vengono quindi committate in colonne specifiche della riga solo quando vengono soddisfatte determinate condizioni, controllate dal filtro. Questo processo di verifica e scrittura viene completato come singola azione atomica.

Una richiesta di filtro deve includere uno o entrambi i seguenti tipi di mutazioni:

  • Mutazioni vere o le mutazioni da applicare se il filtro restituisce un valore.
  • False mutazioni, che vengono applicate se il filtro non restituisce nulla.

Puoi specificare fino a 100.000 di ciascun tipo di mutazione (vero e falso) in una e devi inviarne almeno uno. Bigtable invia quando tutte le mutazioni sono complete.

Per esempi di codice che mostrano come inviare scritture condizionali, consulta Scrittura di un valore in modo condizionale.

Quando non utilizzare le scritture condizionali

Non puoi utilizzare le scritture condizionali per il seguente caso d'uso:

  • Stai utilizzando un profilo dell'app con il routing a cluster multipli.

  • Utilizzi più profili di app a cluster singolo e invii scritture che potrebbero entrare in conflitto con i dati scritti nella stessa riga e colonna in altri cluster dell'istanza. Con il routing a un cluster singolo, una richiesta di scrittura viene inviata a un singolo cluster e poi replicata.

  • Stai scrivendo grandi quantità di dati e hai bisogno di completare le operazioni di scrittura rapidamente. Analogamente a ReadModifyWriteRow, le richieste di scrittura condizionale devono leggere le righe prima di modificarle, pertanto le richieste ReadModifyWriteRow sono più lente delle richieste di scrittura semplici. Di conseguenza, questo tipo di scrittura spesso non è il migliore su larga scala.

Scritture batch

Puoi scrivere più di una riga con una singola chiamata utilizzando un MutateRows richiesta. Le richieste MutateRows contengono un insieme di massimo 100.000 voci che sono ciascuna applicata a livello atomico. Ogni voce è composta da una chiave di riga e almeno una mutazione da applicare alla riga. Una richiesta di scrittura collettiva può contenere fino a 100.000 mutazioni distribuite tra tutte le voci. Ad esempio, una scrittura batch includi una qualsiasi delle seguenti permutazioni:

  • 100.000 voci con 1 mutazione in ciascuna voce.
  • 1 voce con 100.000 mutazioni.
  • 1000 voci con 100 mutazioni ciascuna.

Ogni voce di una richiesta MutateRows è atomica, ma la richiesta nel suo insieme non lo è. Se necessario, Bigtable esegue un nuovo tentativo con qualsiasi voce nel batch che non vanno a buon fine finché tutte le scritture non sono andate a buon fine o fino a quando la scadenza della richiesta raggiunto. Quindi restituisce una risposta che identifica ogni scrittura nel batch se la scrittura è riuscita.

Per esempi di codice che mostrano come inviare scritture collettive, consulta Eseguire scritture collettive.

Quando non utilizzare le scritture in batch

  • Stai scrivendo dati collettivi in righe non vicine. Bigtable memorizza i dati lessicograficamente per chiave di riga, l'equivalente binario in ordine alfabetico. Per questo motivo, quando le chiavi di riga in una richiesta non sono simili tra loro, Bigtable le gestisce in sequenza anziché in parallelo. La velocità effettiva sarà elevata, ma anche la latenza. Per evitare questa latenza elevata, usa MutateRows quando le chiavi di riga sono simili e Bigtable scriverà righe che uno vicino all'altro. Utilizza MutateRow o semplici scritture per le righe non vicine tra loro.

  • Stai richiedendo più mutazioni per la stessa riga. In questo caso, le prestazioni saranno migliori se esegui tutte le mutazioni in una singola richiesta di scrittura. Il motivo è che, in una semplice scrittura, il commit di tutte le modifiche viene eseguito una singola azione atomica, ma una scrittura batch è costretta a serializzare le mutazioni stessa riga, causando latenza.

Controllo del flusso di scrittura batch

Se invii le scritture batch utilizzando uno dei seguenti metodi, puoi abilitare controllo del flusso di scrittura in batch nel codice.

Quando il controllo del flusso di scrittura batch è abilitato per un job Dataflow, Bigtable esegue automaticamente quanto segue:

  • Limita la frequenza del traffico per evitare di sovraccaricare il cluster Bigtable
  • Assicurati che il cluster sia sotto carico sufficiente per attivare Bigtable della scalabilità automatica (se abilitata), in modo che più nodi vengano aggiunti automaticamente cluster quando necessario

Queste azioni combinate impediscono il sovraccarico del cluster e il fallimento del job e non è necessario eseguire lo scale del cluster in previsione dell'esecuzione della scrittura batch. Quando il controllo flusso è attivato, la scalabilità del cluster avviene durante il job Dataflow anziché prima, pertanto il completamento del job potrebbe richiedere più tempo rispetto alla scalabilità manuale del cluster.

Devi utilizzare un profilo dell'app configurato per il routing a cluster singolo. Abilitazione in corso... La scalabilità automatica di Bigtable per il cluster di destinazione non è un requisito, ma la scalabilità automatica consente di sfruttare appieno il flusso di scrittura batch controllo. Puoi usare la scalabilità automatica di Dataflow proprio come faresti con in qualsiasi altro lavoro.

Per scoprire di più sulla scalabilità automatica di Bigtable, consulta Scalabilità automatica. Per comprendere le norme di routing dei profili di app, consulta la Panoramica dei profili di app.

Per un esempio di codice che mostra come attivare il controllo del flusso di scrittura batch utilizzando il connettore Beam HBase Bigtable, consulta Scrittura in Bigtable.

Scrivere dati in una vista autorizzata

Per scrivere i dati in una vista autorizzata, devi utilizzare una delle seguenti opzioni:

  • Interfaccia a riga di comando gcloud
  • Client Bigtable per Java

Le altre librerie client Bigtable non supportano ancora l'accesso alle visualizzazioni autorizzate.

Quando scrivi dati in una vista autorizzata, fornisci l'ID della vista autorizzata oltre all'ID tabella.

Tutte le scritture in una vista autorizzata vengono applicate direttamente alla tabella di base.

Limitazioni della definizione delle viste autorizzate

In una vista autorizzata, le righe o le colonne in cui puoi scrivere dati sono limitate dalla definizione delle viste autorizzate. In altre parole, puoi scrivere solo in righe e colonne che soddisfano gli stessi criteri specificati per la vista autorizzata.

Ad esempio, se la vista autorizzata è definita dal prefisso della chiave di riga examplepetstore1, non puoi scrivere dati utilizzando una chiave di riga di examplepetstore2; l'inizio del valore della chiave di riga deve includere l'intera stringa examplepetstore1.

Analogamente, se la vista autorizzata è definita dal qualificatore di colonna Prefisso order-phone, puoi scrivere i dati utilizzando il qualificatore di colonna order-phone123, ma non puoi utilizzare il qualificatore di colonna order-tablet.

Inoltre, la richiesta di scrittura non può fare riferimento a dati esterni alla vista autorizzata, ad esempio quando controlli la presenza di un valore in una richiesta di scrittura condizionale.

Per qualsiasi richiesta che scriva o faccia riferimento a dati al di fuori della visualizzazione autorizzata, viene restituito un messaggio di errore PERMISSION_DENIED.

Replica

Quando un cluster di un'istanza replicata riceve una scrittura, questa viene replicata immediatamente negli altri cluster dell'istanza.

Atomicità

Viene eseguito il commit di ogni richiesta MutateRows inviata a un'istanza replicata come singola azione atomica sul cluster a cui viene instradata la richiesta. Quando la scrittura viene replicata negli altri cluster dell'istanza, anch'essi ricevono la scrittura come un'operazione atomica. I cluster non ricevono mutazioni parziali. Una mutazione riesce o fallisce in modo atomico per tutte le celle che modifica.

Coerenza

Il tempo necessario affinché i dati scritti siano disponibili per le letture dipende in base a diversi fattori, tra cui il numero di cluster nell'istanza e il tipo di routing utilizzato dal profilo dell'app.

Con un'istanza a cluster singolo, i dati possono essere letti immediatamente, ma se un'istanza ha più di un cluster, ovvero utilizza la replica, Bigtable è coerente in modo asintotico. Puoi ottenere coerenza in operazioni di lettura/scrittura mediante il routing delle richieste allo stesso cluster.

Puoi creare e utilizzare un token di coerenza e chiamare CheckConsistency in modalità StandardReadRemoteWrites dopo l'invio di richieste di scrittura. Il token verifica la coerenza della replica. In genere, crei un token di coerenza dopo l'invio di un batch di scritture o dopo un determinato intervallo, ad esempio un'ora. Poi puoi passare il token affinché venga utilizzato da un altro processo, ad esempio come modulo che effettua una richiesta di lettura, che utilizza il token per verificare tutti i dati sono stati replicati prima del tentativo di lettura.

Se utilizzi un token subito dopo averlo creato, potrebbero essere necessari alcuni minuti verifica la coerenza al primo utilizzo. Questo ritardo è dovuto al fatto che ogni il cluster controlla ogni altro cluster per assicurarsi che non siano in arrivo altri dati. Dopo l'utilizzo iniziale o se aspetti diversi minuti per utilizzare il token per la prima volta, il token riesce immediatamente ogni volta che viene utilizzato.

Risoluzione dei conflitti

Il valore di ogni cella in una tabella Bigtable è identificato in modo univoco dalla quattro tupla (chiave di riga, famiglia di colonne, qualificatore di colonna, timestamp). Per ulteriori dettagli su questi identificatori, consulta Modello di archiviazione Bigtable. Nel raro caso in cui due scritture con la stessa quadrupletta esatta vengano inviate a due cluster diversi, Bigtable risolve automaticamente il conflitto utilizzando un algoritmo interno l'ultima scrittura è quella valida in base al tempo lato server. "L'ultima scrittura vince" di Bigtable è deterministica e quando la replica trova il ritardo, tutti i cluster hanno lo stesso valore per la quattro tuple.

Passaggi successivi