Exporter des données vers Pub/Sub (ETL inversé)

L'exportation de données vers Pub/Sub nécessite l'utilisation de requêtes continues BigQuery.

Ce document explique comment configurer un RETL inversé (extraction, transformation et chargement) depuis BigQuery vers Pub/Sub. Pour ce faire, utilisez l'instruction EXPORT DATA dans une requête continue pour exporter les données depuis BigQuery vers Sujet Pub/Sub.

Vous pouvez utiliser un workflow RETL vers Pub/Sub pour combiner les fonctionnalités d'analyse de BigQuery avec le service de messagerie instantanée asynchrone et évolutif à l'échelle mondiale de Pub/Sub. Ce workflow vous permet de diffuser des données vers des applications et des services en aval à l'aide d'une méthode basée sur des événements.

Prérequis

Vous devez créer un compte de service. Un compte de service est nécessaire pour exécuter une requête continue qui exporte les résultats vers un sujet Pub/Sub.

Vous devez créer un sujet Pub/Sub pour recevoir les résultats des requêtes continues sous forme de messages, ainsi qu'un abonnement Pub/Sub que l'application cible peut utiliser pour recevoir ces messages.

Rôles requis

Cette section fournit des informations sur les rôles et les autorisations nécessaires pour le compte utilisateur qui crée la requête continue, ainsi que pour le compte de service qui exécute la requête continue.

Autorisations du compte utilisateur

Pour créer un job dans BigQuery, le compte utilisateur doit disposer de l'autorisation IAM bigquery.jobs.create. Chacun des rôles IAM suivants accorde l'autorisation bigquery.jobs.create :

Pour envoyer un job qui s'exécute à l'aide d'un compte de service, le compte utilisateur doit disposer du rôle Utilisateur du compte de service (roles/iam.serviceAccountUser). Si vous utilisez le même compte utilisateur pour créer le compte de service, ce compte doit disposer du rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin). Pour obtenir des informations sur la manière de limiter l'accès d'un utilisateur à un seul compte de service plutôt qu'à tous les comptes de service d'un projet, consultez la section Attribuer un rôle unique.

Si le compte utilisateur doit activer les API nécessaires pour votre cas d'utilisation des requêtes continues, il doit disposer du rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin).

Autorisations de compte de service

Pour exporter des données à partir d'une table BigQuery, le compte de service doit disposer de l'autorisation IAM bigquery.tables.export. Chacun des rôles IAM suivants accorde l'autorisation bigquery.tables.export :

Pour que le compte de service puisse accéder à Pub/Sub, vous devez lui attribuer les deux rôles IAM suivants :

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés.

Avant de commencer

Enable the BigQuery and Pub/Sub APIs.

Enable the APIs

Exporter vers Pub/Sub

Utilisez l'instruction EXPORT DATA pour exporter des données vers un sujet Pub/Sub :

Console

  1. Dans la console Trusted Cloud , accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, cliquez sur Plus > Paramètres de requête.

  3. Dans la section Requête continue, cochez la case Utiliser le mode Requête continue.

  4. Dans la zone de texte Compte de service, sélectionnez le compte de service que vous avez créé.

  5. Cliquez sur Enregistrer.

  6. Dans l'éditeur de requête, saisissez l'instruction suivante :

    EXPORT DATA
    OPTIONS (
    format = 'CLOUD_PUBSUB',
    uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID'
    ) AS
    (
    QUERY
    );

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • TOPIC_ID : ID du sujet Pub/Sub. Vous pouvez obtenir l'ID du sujet à partir de la page Sujets de la console Trusted Cloud .
    • QUERY : instruction SQL permettant de sélectionner les données à exporter. L'instruction SQL ne doit contenir que des opérations compatibles. Vous devez utiliser la fonction APPENDS dans la clause FROM d'une requête continue pour spécifier le moment à partir duquel commencer à traiter les données.
  7. Cliquez sur Exécuter.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. Sur la ligne de commande, exécutez la requête continue à l'aide de la commande bq query avec les options suivantes :

    • Définissez l'indicateur --continuous sur true pour rendre la requête continue.
    • Utilisez l'option --connection_property pour spécifier un compte de service à utiliser.
    bq query --project_id=PROJECT_ID --use_legacy_sql=false \
    --continuous=true --connection_property=service_account=SERVICE_ACCOUNT_EMAIL \
    'EXPORT DATA OPTIONS (format = "CLOUD_PUBSUB", uri = "https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID") AS (QUERY);'

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service. Vous pouvez obtenir l'adresse e-mail du compte de service sur la page Comptes de service de la console Trusted Cloud .
    • QUERY : instruction SQL permettant de sélectionner les données à exporter. L'instruction SQL ne doit contenir que des opérations compatibles. Vous devez utiliser la fonction APPENDS dans la clause FROM d'une requête continue pour spécifier le moment à partir duquel commencer à traiter les données.
  3. API

    1. Exécutez la requête continue en appelant la méthode jobs.insert. Définissez les champs suivants dans la ressource JobConfigurationQuery de la ressource Job que vous transmettez :

      • Définissez le champ continuous sur true pour rendre la requête continue.
      • Utilisez le champ connection_property pour spécifier un compte de service à utiliser.
      curl --request POST \
        'https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs'
        --header 'Authorization: Bearer $(gcloud auth print-access-token) \
        --header 'Accept: application/json' \
        --header 'Content-Type: application/json' \
        --data '("configuration":("query":"EXPORT DATA OPTIONS (format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID') AS (QUERY);","useLegacySql":false,"continuous":true,"connectionProperties":["key": "service_account","value":"SERVICE_ACCOUNT_EMAIL"]))' \
        --compressed

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet.
      • QUERY : instruction SQL permettant de sélectionner les données à exporter. L'instruction SQL ne doit contenir que des opérations compatibles. Vous devez utiliser la fonction APPENDS dans la clause FROM d'une requête continue pour spécifier le moment à partir duquel commencer à traiter les données.
      • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service. Vous pouvez obtenir l'adresse e-mail du compte de service sur la page Comptes de service de la console Trusted Cloud .

Exporter plusieurs colonnes vers Pub/Sub

Si vous souhaitez inclure plusieurs colonnes dans votre résultat, vous pouvez créer une colonne de type Struct contenant les valeurs de colonne, puis convertir la valeur Struct en chaîne JSON à l'aide de la fonction TO_JSON_STRING. L'exemple suivant exporte des données à partir de quatre colonnes, mises en forme en tant que chaîne JSON :

EXPORT DATA
  OPTIONS (
    format = 'CLOUD_PUBSUB',
    uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides')
AS (
  SELECT
    TO_JSON_STRING(
      STRUCT(
        ride_id,
        timestamp,
        latitude,
        longitude)) AS message
  FROM
    APPENDS(TABLE `myproject.real_time_taxi_streaming.taxi_rides`,
      -- Configure the APPENDS TVF start_timestamp to specify when you want to
      -- start processing data using your continuous query.
      -- This example starts processing at 10 minutes before the current time.
      CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE)
  WHERE ride_status = 'enroute'
);

Optimisation des exportations

Si les performances de votre job de requête continue semblent être limitées par les ressources de calcul disponibles, essayez d'augmenter la taille de votre attribution de réservation d'emplacements CONTINUOUS BigQuery.

Limites

  • Les données exportées doivent se composer d'une seule colonne STRING ou BYTES. Vous pouvez choisir le nom de la colonne.
  • Vous devez utiliser une requête continue pour exporter des données vers Pub/Sub.
  • Vous ne pouvez pas transmettre de schéma à un sujet Pub/Sub dans la requête continue.
  • Vous ne pouvez pas exporter de données vers un sujet Pub/Sub qui utilise un schéma.
  • Lorsque vous exportez des enregistrements au format JSON vers Pub/Sub, vous pouvez exporter des enregistrements dont certaines valeurs sont NULL, mais vous ne pouvez pas exporter des enregistrements qui ne contiennent que des valeurs NULL. Vous pouvez exclure les enregistrements NULL des résultats de la requête en incluant un filtre WHERE message IS NOT NULL dans la requête continue.
  • Lorsque vous exportez des données vers un sujet Pub/Sub configuré avec un point de terminaison régional, le point de terminaison doit être configuré dans la même limite régionale Trusted Cloud que l'ensemble de données BigQuery contenant la table que vous interrogez.
  • Les données exportées ne doivent pas dépasser les quotas Pub/Sub.

Tarifs

Lorsque vous exportez des données dans une requête continue, la tarification des calculs de capacité BigQuery s'applique. Pour exécuter des requêtes continues, vous devez disposer d'une réservation qui utilise l'édition Enterprise ou Enterprise Plus et d'une attribution de réservation qui utilise le type de job CONTINUOUS.

Une fois les données exportées, l'utilisation de Pub/Sub vous est facturée. Pour plus d'informations, consultez les tarifs de Pub/Sub.