Exporter des données vers Spanner (ETL inversé)

Ce document explique comment configurer un workflow d'extraction, de transformation et de chargement inversé (ETL inversé) de BigQuery vers Spanner. Pour ce faire, utilisez l'instruction EXPORT DATA pour exporter les données d'une table BigQuery vers une table Spanner.

Ce workflow ETL inversé combine des fonctionnalités analytiques dans BigQuery avec une faible latence et un débit élevé dans Spanner. Ce workflow vous permet de diffuser des données aux utilisateurs de l'application sans épuiser les quotas et limites de BigQuery.

Avant de commencer

Rôles requis

Pour obtenir les autorisations nécessaires à l'exportation des données BigQuery vers Spanner, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Limites

  • Cette fonctionnalité n'est pas disponible dans Assured Workloads.

  • Les types de données BigQuery suivants n'ont pas d'équivalent dans Spanner et ne sont pas compatibles :

Dialecte de la base de données Spanner Types BigQuery non compatibles
Tous les dialectes
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC : le type NUMERIC compatible n'est pas assez large. Envisagez d'ajouter des diffusions explicites au type NUMERIC dans la requête.
  • La taille maximale d'une ligne exportée ne peut pas dépasser 1 Mio.

  • Spanner applique l'intégrité référentielle lors de l'exportation. Si la table cible est un enfant d'une autre table (INTERLEAVE IN PARENT) ou si la table cible comporte des contraintes de clé étrangère, les clés étrangères et la clé parent seront validées lors de l'exportation. Si une ligne exportée est écrite dans une table avec INTERLEAVE IN PARENT et que la ligne parent n'existe pas, l'exportation échoue et affiche le message d'erreur "Ligne parent manquante. Impossible d'écrire la ligne". Si la ligne exportée est écrite dans une table avec des contraintes de clé étrangère et qu'elle fait référence à une clé qui n'existe pas, l'exportation échoue et l'erreur "La contrainte de clé étrangère est en conflit" s'affiche. Lorsque vous exportez vers plusieurs tables, nous vous recommandons de séquencer l'exportation pour vous assurer que l'intégrité référentielle est maintenue. Cela implique généralement d'exporter les tables parentes et les tables référencées par des clés étrangères avant les tables qui les référencent.

    Si la table cible de l'exportation présente des contraintes de clé étrangère ou est l'enfant d'une autre table (INTERLEAVE IN PARENT), la table parent doit être renseignée avant l'exportation d'une table enfant et doit contenir toutes les clés correspondantes. Toute tentative d'exportation d'une table enfant alors qu'une table parente ne dispose pas de l'ensemble complet des clés pertinentes échoue.

  • La durée maximale d'une tâche d'exportation vers Spanner est de six heures. Pour en savoir plus sur l'optimisation des tâches d'exportation volumineuses, consultez la section Optimisation de l'exportation. Vous pouvez également diviser l'entrée en blocs de données individuels, qui peuvent être exportés en tant que tâches d'exportation individuelles.

  • Les exportations vers Spanner ne sont disponibles que pour les éditions BigQuery Enterprise ou Enterprise Plus. L'édition Standard de BigQuery et le calcul à la demande ne sont pas compatibles.

  • Les exportations vers les schémas Spanner par défaut sont acceptées. Les tables provenant de schémas nommés ne sont pas acceptées.

  • Vous ne pouvez pas utiliser de requêtes continues pour exporter des données vers des tables Spanner avec des clés primaires générées automatiquement.

  • Vous ne pouvez pas utiliser de requêtes continues pour exporter des données vers des tables Spanner dans une base de données utilisant le dialecte PostgreSQL.

  • Lorsque vous utilisez des requêtes continues pour exporter des données vers une table Spanner, assurez-vous de choisir une clé primaire qui ne correspond pas à un entier croissant de manière monotone dans votre table BigQuery. Cela pourrait entraîner des problèmes de performances dans votre exportation. Pour en savoir plus sur les clés primaires dans Spanner et sur les moyens d'atténuer ces problèmes de performances, consultez Choisir une clé primaire.

Configurer des exportations avec l'option spanner_options

Vous pouvez utiliser l'option spanner_options pour spécifier une base de données et une table Spanner de destination. La configuration est exprimée sous la forme d'une chaîne JSON, comme le montre l'exemple suivant :

EXPORT DATA OPTIONS(
   uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
   spanner_options = """{
      "table": "TABLE_NAME",
      "change_timestamp_column": "CHANGE_TIMESTAMP",
      "priority": "PRIORITY",
      "tag": "TAG",
   }"""
)

Remplacez les éléments suivants :

  • PROJECT_ID : nom de votre projet Trusted Cloud .
  • INSTANCE_ID : nom de votre instance de base de données.
  • DATABASE_ID : nom de votre base de données.
  • TABLE_NAME : nom d'une table de destination existante.
  • CHANGE_TIMESTAMP : nom d'une colonne de type TIMESTAMP dans une table Spanner permettant de suivre l'horodatage de la dernière mise à jour de la ligne correspondante dans une table BigQuery exportée. Il s'agit d'un champ facultatif pour les exportations continues et par lot vers Spanner, mais il est recommandé pour les cas d'utilisation où l'ordre des lignes exportées avec la même clé primaire est important.
  • PRIORITY (facultatif) : priorité des requêtes d'écriture. Valeurs autorisées : LOW, MEDIUM, HIGH. Valeur par défaut : MEDIUM.
  • TAG (facultatif) : tag de requête permettant d'identifier le trafic de l'exportateur dans la surveillance Spanner. Valeur par défaut : bq_export.

Exigences de requêtes d'exportation

Pour exporter des résultats de requête vers Spanner, les résultats doivent répondre aux exigences suivantes :

  • Toutes les colonnes de l'ensemble de résultats doivent exister dans la table de destination, et leurs types doivent correspondre ou être convertibles.
  • L'ensemble de résultats doit contenir toutes les colonnes NOT NULL pour la table de destination.
  • Les valeurs de colonne ne doivent pas dépasser les limites de taille des données dans les tables de Spanner.
  • Tous les types de colonne non compatibles doivent être convertis en l'un des types compatibles avant l'exportation vers Spanner.

Conversions de types

Pour faciliter l'utilisation, l'exportateur Spanner applique automatiquement les conversions de type suivantes :

Type BigQuery Type Spanner
BIGNUMERIC NUMERIC (dialecte PostgreSQL uniquement)
FLOAT64 FLOAT32
BYTES PROTO
INT64 ENUM

Exporter les données

Vous pouvez utiliser l'instruction EXPORT DATA pour exporter les données d'une table BigQuery vers une table Spanner.

L'exemple suivant exporte les champs sélectionnés à partir d'une table nommée mydataset.table1 :

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "TABLE_NAME" }"""
)
AS SELECT * FROM mydataset.table1;

Remplacez les éléments suivants :

  • PROJECT_ID : nom de votre Trusted Cloud projet
  • INSTANCE_ID : nom de votre instance de base de données
  • DATABASE_ID : nom de votre base de données
  • TABLE_NAME : nom d'une table de destination existante.

Exporter plusieurs résultats avec la même valeur rowkey

Lorsque vous exportez un résultat contenant plusieurs lignes avec la même valeur rowkey, les valeurs écrites dans Spanner se retrouvent dans la même ligne Spanner. Une seule ligne BigQuery correspondante (dont on ne peut pas garantir l'identité) sera présente dans l'ensemble de lignes Spanner produit par l'exportation.

Exporter en continu

Pour traiter une requête d'exportation en continu, vous pouvez la configurer en tant que requête continue.

Optimisation des exportations

Pour optimiser l'exportation d'enregistrements de BigQuery vers Spanner, essayez ces solutions :

  • Augmentez le nombre de nœuds dans l'instance de destination Spanner. Notez que, au début de l'exportation, l'augmentation du nombre de nœuds de l'instance peut ne pas entraîner immédiatement une augmentation du débit d'exportation. Un léger délai peut survenir lorsque Spanner effectue une division basée sur la charge. Avec la répartition basée sur la charge, le débit d'exportation augmente et se stabilise peu de temps après. Pour en savoir plus sur l'optimisation du débit d'écriture, consultez la section Présentation des performances.

  • Spécifiez la priorité HIGH dans spanner_options. Toutefois, cela peut entraîner une dégradation importante des performances pour les autres charges de travail servies par la même instance.

  • Évitez de trier les résultats de la requête. Si l'ensemble de résultats contient toutes les colonnes de clé primaire, l'exportateur trie automatiquement les clés primaires de la table de destination pour simplifier les écritures et minimiser les conflits.

    Si la clé primaire de la table de destination inclut des colonnes générées, vous devez ajouter les expressions des colonnes générées à la requête pour vous assurer que les données exportées sont triées correctement.

Tarifs

Lorsque vous exportez des données vers Spanner à l'aide de l'instruction EXPORT DATA, la tarification des calculs de capacité BigQuery s'applique. Pour exécuter des requêtes continues, vous devez disposer d'une attribution de réservation qui utilise le type de job CONTINUOUS.

Les exportations BigQuery vers Spanner qui franchissent les limites régionales sont facturées selon les tarifs d'extraction de données. Pour en savoir plus, consultez la page relative aux tarifs de BigQuery. Pour éviter les frais de transfert de données, assurez-vous que votre exportation BigQuery s'exécute dans la même région que le leader par défaut Spanner. Les exportations de requêtes continues ne sont pas compatibles avec les exportations qui franchissent les limites régionales.

Une fois les données exportées, leur stockage dans Spanner vous est facturé. Pour en savoir plus, consultez la page Tarifs de Spanner.