Exportar datos a Pub/Sub (ETL inverso)
Para exportar datos a Pub/Sub, es necesario usar consultas continuas de BigQuery.
En este documento se describe cómo configurar la extracción, transformación y carga inversas (RETL) de BigQuery a Pub/Sub.
Para ello, puedes usar la instrucción EXPORT DATA
en una consulta continua para exportar datos de BigQuery a un tema de Pub/Sub.
Puedes usar un flujo de trabajo de RETL en Pub/Sub para combinar las funciones de analíticas de BigQuery con el servicio de mensajería global asíncrono y escalable de Pub/Sub. Este flujo de trabajo te permite proporcionar datos a aplicaciones y servicios posteriores de forma basada en eventos.
Requisitos previos
Debes crear una cuenta de servicio. Para ejecutar una consulta continua que exporte resultados a un tema de Pub/Sub, se necesita una cuenta de servicio.
Debes crear un tema de Pub/Sub para recibir los resultados de la consulta continua como mensajes y una suscripción de Pub/Sub que la aplicación de destino pueda usar para recibir esos mensajes.
Roles obligatorios
En esta sección se proporciona información sobre los roles y permisos que necesitan la cuenta de usuario que crea la consulta continua y la cuenta de servicio que ejecuta la consulta continua.
Permisos de cuenta de usuario
Para crear un trabajo en BigQuery, la cuenta de usuario debe tener el permiso de gestión de identidades y accesos bigquery.jobs.create
. Cada uno de los siguientes roles de gestión de identidades y accesos concede el permiso bigquery.jobs.create
:
- Usuario de BigQuery (
roles/bigquery.user
) - Usuario de trabajo de BigQuery (
roles/bigquery.jobUser
) - Administrador de BigQuery (
roles/bigquery.admin
)
Para enviar un trabajo que se ejecute con una cuenta de servicio, la cuenta de usuario debe tener el rol
Usuario de cuenta de servicio (roles/iam.serviceAccountUser
). Si usas la misma cuenta de usuario para crear la cuenta de servicio, esta debe tener el rol 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 Asignar un solo rol.
Si la cuenta de usuario debe habilitar las APIs necesarias para tu caso práctico de consulta continua, debe tener el rol Administrador de uso de servicios (roles/serviceusage.serviceUsageAdmin
).
Permisos de cuenta de servicio
Para exportar datos de una tabla de BigQuery, la cuenta de servicio debe tener el permiso de gestión de identidades y accesos bigquery.tables.export
. Cada uno de los siguientes roles de gestión de identidades y accesos concede el permiso bigquery.tables.export
:
- Lector de datos de BigQuery (
roles/bigquery.dataViewer
) - Editor de datos de BigQuery (
roles/bigquery.dataEditor
) - Propietario de datos de BigQuery (
roles/bigquery.dataOwner
) - Administrador de BigQuery (
roles/bigquery.admin
)
Para que la cuenta de servicio pueda acceder a Pub/Sub, debes concederle los dos roles de gestión de identidades y accesos siguientes:
También puedes conseguir los permisos necesarios a través de roles personalizados.
Antes de empezar
Enable the BigQuery and Pub/Sub APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin
), which
contains the serviceusage.services.enable
permission. Learn how to grant
roles.
Exportar a Pub/Sub
Usa la instrucción EXPORT DATA
para exportar datos a un tema de Pub/Sub:
Consola
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, haz clic en Más > Configuración de consultas.
En la sección Consulta continua, marca la casilla Usar el modo de consulta continua.
En el cuadro Cuenta de servicio, selecciona la cuenta de servicio que has creado.
Haz clic en Guardar.
En el editor de consultas, introduce la siguiente instrucción:
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID' ) AS ( QUERY );
Haz los cambios siguientes:
PROJECT_ID
: tu ID de proyecto.TOPIC_ID
: el ID del tema de Pub/Sub. Puedes obtener el ID del tema en la página Temas de la consola de Google Cloud .QUERY
: la instrucción SQL para seleccionar los datos que se van a exportar. La instrucción SQL solo debe contener operaciones admitidas. Debe usar la funciónAPPENDS
en la cláusulaFROM
de una consulta continua para especificar el momento en el que se debe empezar a procesar los datos.
Haz clic en Ejecutar.
bq
-
In the Google Cloud console, activate Cloud Shell.
En la línea de comandos, ejecuta la consulta continua con el comando
bq query
y las siguientes marcas:- Define la marca
--continuous
comotrue
para que la consulta sea continua. - Usa la marca
--connection_property
para especificar la cuenta de servicio que quieras 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);'
Haz los cambios siguientes:
PROJECT_ID
: tu ID de proyecto.SERVICE_ACCOUNT_EMAIL
: el correo de la cuenta de servicio. Puedes obtener el correo de la cuenta de servicio en la página Cuentas de servicio de la consola de Google Cloud .QUERY
: la instrucción SQL para seleccionar los datos que se van a exportar. La instrucción SQL solo debe contener operaciones admitidas. Debe usar la funciónAPPENDS
en la cláusulaFROM
de una consulta continua para especificar el momento en el que se debe empezar a procesar los datos.
- Define la marca
Ejecuta la consulta continua llamando al método
jobs.insert
. Defina los siguientes campos en el recursoJobConfigurationQuery
del recursoJob
que envíe:- Asigna el valor
true
al campocontinuous
para que la consulta sea continua. - Usa el campo
connection_property
para especificar la cuenta de servicio que quieras 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
Haz los cambios siguientes:
PROJECT_ID
: tu ID de proyecto.QUERY
: la instrucción SQL para seleccionar los datos que se van a exportar. La instrucción SQL solo debe contener operaciones admitidas. Debe usar la funciónAPPENDS
en la cláusulaFROM
de una consulta continua para especificar el momento en el que se debe empezar a procesar los datos.SERVICE_ACCOUNT_EMAIL
: el correo de la cuenta de servicio. Puedes obtener el correo de la cuenta de servicio en la página Cuentas de servicio de la consola de Google Cloud .
- Asigna el valor
API
Exportar varias columnas a Pub/Sub
Si quieres incluir varias columnas en el resultado, puedes crear una columna struct que contenga los valores de las columnas y, a continuación, convertir el valor struct en una cadena JSON mediante la función TO_JSON_STRING
.
En el siguiente ejemplo se exportan datos de cuatro columnas, con formato de cadena 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' );
Optimización de exportación
Si parece que el rendimiento de tu trabajo de consulta continua está limitado por los recursos de computación disponibles, prueba a aumentar el tamaño de tu CONTINUOUS
asignación de reserva de ranuras de BigQuery.
Limitaciones
- Los datos exportados deben constar de una sola columna
STRING
oBYTES
. Puedes elegir el nombre que quieras para la columna. - Para exportar a Pub/Sub, debe usar una consulta continua.
- No puedes transferir 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.
- Cuando exportas a Pub/Sub, puedes exportar registros con formato JSON en los que algunos valores sean
NULL
, pero no puedes exportar registros que solo contengan valoresNULL
. Puedes excluir los registrosNULL
de los resultados de la consulta incluyendo un filtroWHERE message IS NOT NULL
en la consulta continua. - Cuando exporte datos a un tema de Pub/Sub configurado con un endpoint de ubicación, el endpoint debe configurarse dentro del mismo límite Google Cloud regional que el conjunto de datos de BigQuery que contiene la tabla que está consultando.
- Los datos exportados no deben superar las cuotas de Pub/Sub.
Precios
Cuando exportas datos en una consulta continua, se te factura según los precios de computación 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 use el tipo de trabajo CONTINUOUS
.
Una vez que se hayan exportado los datos, se te cobrará por usar Pub/Sub. Para obtener más información, consulta la lista de precios de Pub/Sub.