Exporta datos a Pub/Sub (ETL inverso)

En este documento, se describe cómo configurar una extracción, transformación y carga (RETL) inversa de BigQuery a Pub/Sub. Puedes hacerlo con la sentencia EXPORT DATA en una consulta continua para exportar datos de BigQuery a un ema de Pub/Sub.

Puedes usar un flujo de trabajo de RETL en Pub/Sub para combinar las capacidades de estadísticas de BigQuery con el servicio de mensajería global asíncrono y escalable de Pub/Sub. Este flujo de trabajo te permite entregar datos a aplicaciones y servicios descendentes de manera controlada por eventos.

Requisitos previos

Debes crear una cuenta de servicio. Se requiere una cuenta de servicio para ejecutar una consulta continua que exporte resultados a un tema de Pub/Sub.

Debes crear un tema de Pub/Sub para recibir los resultados de consultas continuas como mensajes y una suscripción de Pub/Sub que la aplicación de destino puede usar para recibir esos mensajes.

Roles obligatorios

En esta sección, se proporciona información sobre los roles y permisos que requiere la cuenta de usuario que crea la consulta continua y la cuenta de servicio que ejecuta la consulta continua.

Permisos de la cuenta de usuario

Para crear un trabajo en BigQuery, la cuenta de usuario debe tener el permiso bigquery.jobs.create de IAM. Cada uno de los siguientes roles de IAM otorga el permiso bigquery.jobs.create:

Para enviar un trabajo que se ejecute con una cuenta de servicio, la cuenta de usuario debe tener el rol de usuario de la cuenta de servicio (roles/iam.serviceAccountUser). Si usas la misma cuenta de usuario para crear la cuenta de servicio, la cuenta de usuario debe tener el rol de administrador de cuentas de servicio (roles/iam.serviceAccountAdmin). Para obtener información sobre cómo limitar el acceso de un usuario a una sola cuenta de servicio, en lugar de a todas las cuentas de servicio de un proyecto, consulta Otorga un solo rol.

Si la cuenta de usuario debe habilitar las APIs necesarias para tu caso de uso de la consulta continua, la cuenta de usuario debe tener el rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin).

Permisos de las cuentas de servicio

Para exportar datos de una tabla de BigQuery, la cuenta de servicio debe tener el permiso bigquery.tables.export de IAM. Cada uno de los siguientes roles de IAM otorga el permiso bigquery.tables.export:

Para que la cuenta de servicio acceda a Pub/Sub, debes otorgar a la cuenta de servicio los siguientes roles de IAM:

También puedes obtener los permisos necesarios a través de roles personalizados.

Antes de comenzar

Habilita las API de BigQuery and Pub/Sub.

Habilita las API

Exporta a Pub/Sub

Usa la sentencia EXPORT DATA para exportar datos a un tema de Pub/Sub:

Console

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, haz clic en Más > Configuración de consulta.

  3. En la sección Consulta continua, selecciona la casilla de verificación Usar modo de consulta continua.

  4. En el cuadro Cuenta de servicio, selecciona la cuenta de servicio que creaste.

  5. Haz clic en Guardar.

  6. En el editor de consultas, ingresa la siguiente sentencia:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • TOPIC_ID: Es el ID del tema de Pub/Sub. Puedes obtener el ID del tema desde la página Temas de la consola de Google Cloud.
    • QUERY: Es la instrucción de SQL que se seleccionará los datos que se exportarán. La instrucción de SQL solo debe contener operaciones compatibles.
  7. Haz clic en Ejecutar.

bq

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. En la línea de comandos, ejecuta la consulta continua con el comando bq query con las siguientes marcas:

    • Establece la marca --continuous en true para que la consulta sea continua.
    • Usa la marca --connection_property para especificar una cuenta de servicio para usar.
    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);'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • SERVICE_ACCOUNT_EMAIL: Es el correo electrónico de la cuenta de servicio. Puedes obtener el correo electrónico de la cuenta de servicio en la página Cuentas de servicio de la consola de Google Cloud.
    • QUERY: Es la instrucción de SQL que se seleccionará los datos que se exportarán. La instrucción de SQL solo debe contener operaciones compatibles.

API

  1. Ejecuta la consulta continua con una llamada al método jobs.insert. Configura los siguientes campos en el recurso JobConfigurationQuery del recurso Job que pasas:

    • Establece el campo continuous en true para que la consulta sea continua.
    • Usa el campo connection_property para especificar la cuenta de servicio que se usará.
    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
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • QUERY: Es la instrucción de SQL que se seleccionará los datos que se exportarán. La instrucción de SQL solo debe contener operaciones compatibles.
    • SERVICE_ACCOUNT_EMAIL: Es el correo electrónico de la cuenta de servicio. Puedes obtener el correo electrónico de la cuenta de servicio en la página Cuentas de servicio de la consola de Google Cloud.

Exporta varias columnas a Pub/Sub

Si quieres incluir varias columnas en el resultado, puedes crear una columna struct para que contenga los valores de la columna y, luego, convertir el valor de struct en una string JSON a través de la función TO_JSON_STRING. En el siguiente ejemplo, se exportan datos de cuatro columnas, con formato como una string 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 `myproject.real_time_taxi_streaming.taxi_rides`
  WHERE ride_status = 'enroute'
);

Optimización de exportaciones

Si el rendimiento de tu trabajo de consulta continua parece estar limitado por recursos de procesamiento disponibles, intenta aumentar el tamaño de tu Asignación de reserva de ranuras de CONTINUOUS de BigQuery.

Limitaciones

  • Los datos exportados deben constar de una sola columna STRING o columna BYTES. El nombre de la columna puede ser el que elijas.
  • Debes usar una consulta continua para exportar a Pub/Sub.
  • No puedes pasar un esquema a un tema de Pub/Sub en la consulta continua.
  • No puedes exportar datos a un tema de Pub/Sub que use un esquema.
  • No puedes exportar datos que contengan valores NULL. Puedes excluir los valores NULL de los resultados de la consulta si incluyes un filtro WHERE message IS NOT NULL en la consulta continua.
  • Los datos exportados no deben exceder las cuotas de Pub/Sub.

Precios

Cuando exportas datos en una consulta continua, se te factura a través los precios de procesamiento de capacidad de BigQuery. Para ejecutar consultas continuas, debes tener una reserva que use la Edición Enterprise o Enterprise Plus, y una asignación de reserva que usa el tipo de trabajo CONTINUOUS.

Una vez que se exportan los datos, se te cobra por usar Pub/Sub. Para obtener más información, consulta Precios de Pub/Sub.