Charger des données par lot à l'aide de l'API Storage Write
Ce document explique comment utiliser l'API BigQuery Storage Write pour charger des données par lot dans BigQuery.
Dans les scénarios de chargement par lot, une application écrit des données et les valide en tant que transaction unique. Lorsque vous utilisez l'API Storage Write pour charger des données par lot, créez un ou plusieurs flux dotés du type en attente. Le type en attente est compatible avec les transactions au niveau du flux. Les enregistrements sont mis en mémoire tampon dans un état en attente jusqu'à ce que vous effectuiez un commit du flux.
Pour les charges de travail par lot, envisagez également d'utiliser l'API Storage Write via le connecteur Apache Spark SQL pour BigQuery à l'aide de Dataproc, plutôt que d'écrire le code de l'API Storage Write personnalisé.
L'API Storage Write est parfaitement adaptée à une architecture de pipeline de données. Un processus principal crée un certain nombre de flux. Pour chaque flux, un thread de calcul ou un processus distinct est attribué pour écrire une partie des données du lot. Chaque nœud de calcul crée une connexion à son flux, écrit des données et finalise son flux une fois l'opération terminée. Une fois que tous les nœuds de calcul ont signalé la réussite de l'opération vers le processus principal, le processus principal valide les données. Si un nœud de calcul échoue, sa partie de données attribuée n'apparaîtra pas dans les résultats finaux et le nœud de calcul sera réessayé en toute sécurité. Dans un pipeline plus sophistiqué, les nœuds de calcul vérifient leur progression en signalant le dernier décalage écrit dans le processus principal. Cette approche permet d'obtenir un pipeline robuste et résilient aux pannes.
Charger des données par lot à l'aide du type en attente
Pour utiliser le type en attente, l'application effectue les opérations suivantes :
- Appelez
CreateWriteStream
pour créer un ou plusieurs flux de type en attente. - Pour chaque flux, appelez
AppendRows
dans une boucle pour écrire des lots d'enregistrements. - Pour chaque flux, appelez
FinalizeWriteStream
. Après avoir appelé cette méthode, vous ne pouvez plus écrire de lignes dans le flux. Si vous appelezAppendRows
après avoir appeléFinalizeWriteStream
,StorageError
est renvoyé avecStorageErrorCode.STREAM_FINALIZED
dans l'erreurgoogle.rpc.Status
. Pour en savoir plus sur le modèle d'erreurgoogle.rpc.Status
, consultez la section Erreurs. - Appelez
BatchCommitWriteStreams
pour valider les flux. Une fois que vous avez appelé cette méthode, les données deviennent disponibles pour la lecture. Si une erreur se produit lors du commit de l'un des flux, elle est renvoyée dans le champstream_errors
deBatchCommitWriteStreamsResponse
.
Le commit est une opération atomique et vous pouvez effectuer un commit de plusieurs flux à la fois. Un flux ne peut être validé qu'une seule fois. Par conséquent, si l'opération de commit échoue, vous pouvez réessayer. Les données sont en attente et ne sont pas visibles par les lectures tant que vous n'avez pas validé un flux.
Une fois le flux finalisé et avant son commit, les données peuvent rester dans le tampon pendant quatre heures au maximum. Les flux en attente doivent être validés dans les 24 heures. Une limite de quota s'applique à la taille totale du tampon de flux en attente.
Le code suivant montre comment écrire des données avec le type en attente :
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour BigQuery, consultez la page sur les bibliothèques clientes BigQuery. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour BigQuery, consultez la page sur les bibliothèques clientes BigQuery. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour BigQuery, consultez la page sur les bibliothèques clientes BigQuery. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour BigQuery, consultez la page sur les bibliothèques clientes BigQuery. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
Cet exemple présente un enregistrement simple avec deux champs. Pour obtenir un exemple plus long qui montre comment envoyer différents types de données, y compris des types STRUCT
, consultez l'exemple append_rows_proto2 sur GitHub.
Pour savoir comment installer et utiliser la bibliothèque cliente pour BigQuery, consultez la page sur les bibliothèques clientes BigQuery. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Cet exemple de code dépend d'un module de protocole compilé, customer_record_pb2.py
. Pour créer le module compilé, exécutez protoc --python_out=. customer_record.proto
, où protoc
est le compilateur de tampon de protocole. Le fichier customer_record.proto
définit le format des messages utilisés dans l'exemple Python.