Conexiones de BigQuery - AWS Glue

Conexiones de BigQuery

Puede usar AWS Glue para Spark para leer y escribir en tablas de Google BigQuery en AWS Glue 4.0 y versiones posteriores. Puede leer desde BigQuery con una consulta de SQL de Google. Se conecta BigQuery con las credenciales almacenadas en AWS Secrets Manager a través de una conexión de AWS Glue.

Para obtener más información sobre Google BigQuery, consulte el sitio web de Google Cloud BigQuery.

Configuración de conexiones con BigQuery

Para conectarse a Google BigQuery desde AWS Glue, tendrá que crear y almacenar las credenciales de Google Cloud Platform en un secreto de AWS Secrets Manager y, a continuación, asociar ese secreto a una conexión de Google BigQuery para AWS Glue.

Para configurar una conexión a BigQuery, siga estos pasos:
  1. En Google Cloud Platform, genere e identifique los recursos pertinentes:

  2. En Google Cloud Platform, genere y exporte las credenciales de la cuenta de servicio:

    Puede usar el asistente de credenciales de BigQuery para simplificar este paso: Crear credenciales.

    Para crear una cuenta de servicio en GCP, siga el tutorial disponible en Crear cuentas de servicio.

    • Al elegir un proyecto, seleccione el proyecto que contiene su tabla de BigQuery.

    • Cuando elija los roles de IAM de GCP para la cuenta de servicio, agregue o genere una función que conceda los permisos apropiados para ejecutar los trabajos en BigQuery, como la lectura, escritura o creación de tablas de BigQuery.

    Para crear credenciales para la cuenta de servicio, siga el tutorial disponible en Crear una clave de cuenta de servicio.

    • Al seleccionar el tipo de clave, seleccione JSON.

    Ahora debería haber descargado un archivo JSON que contiene las credenciales de la cuenta de servicio. Debería parecerse a lo que sigue:

    { "type": "service_account", "project_id": "*****", "private_key_id": "*****", "private_key": "*****", "client_email": "*****", "client_id": "*****", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "*****", "universe_domain": "googleapis.com" }
  3. Codifique en base64 el archivo de credenciales descargado. En una sesión AWS CloudShell o similar, puede hacerlo desde la línea de comandos al ejecutar cat credentialsFile.json | base64 -w 0. Conserve el resultado de este comando, credentialString.

  4. En AWS Secrets Manager, genere un secreto mediante las credenciales de la plataforma de Google Cloud. Para crear un secreto en Secrets Manager, siga el tutorial disponible en Crear un secreto AWS Secrets Manager en la documentación AWS Secrets Manager. Después de crear el secreto, conserve el nombre secreto, secretName, para el siguiente paso.

    • Al seleccionar pares clave/valor, genere un par para la clave credentials con el valor credentialString.

  5. En el catálogo de datos de Glue AWS, cree una conexión mediante los pasos que se indican en Adición de una conexión de AWS Glue. Tras crear la conexión, conserve el nombre de la conexión, connectionName, para el siguiente paso.

    • Cuando elija un Tipo de conexión, seleccione Google BigQuery.

    • Al seleccionar un secreto AWS, proporcione un secretName.

  6. Otorgue al rol de IAM asociado al trabajo de AWS Glue el permiso para leer secretName.

  7. En la configuración del trabajo de Glue AWS, proporcione connectionName como una conexión de red adicional.

Lectura de tablas de BigQuery

Requisitos previos:

  • Una tabla de BigQuery desde la cual le gustaría leer. Necesitará los nombres de la tabla y el conjunto de datos de BigQuery, en el formulario [dataset].[table]. Llamemos a esto tableName.

  • El proyecto de facturación para la tabla de BigQuery. Necesitará el nombre del proyecto, parentProject. Si no hay ningún proyecto principal de facturación, utilice el proyecto que contiene la tabla.

  • Información de autenticación de BigQuery. Complete los pasos para administrar sus credenciales de conexión con AWS Glue para configurar su información de autenticación. Necesitará el nombre de la conexión de AWS Glue, connectionName.

Por ejemplo:

bigquery_read = glueContext.create_dynamic_frame.from_options( connection_type="bigquery", connection_options={ "connectionName": "connectionName", "parentProject": "parentProject", "sourceType": "table", "table": "tableName", }

También puede proporcionar una consulta para filtrar los resultados devueltos a su DynamicFrame. Tendrá que configurar query, sourceType, viewsEnabled y materializationDataset.

Por ejemplo:

Requisitos previos adicionales:

Deberá crear o identificar un conjunto de datos de BigQuery, materializationDataset, en el que BigQuery pueda escribir vistas materializadas para las consultas.

Deberá otorgar los permisos de IAM GCP adecuados a la cuenta de servicio para crear tablas en materializationDataset.

glueContext.create_dynamic_frame.from_options( connection_type="bigquery", connection_options={ "connectionName": "connectionName", "materializationDataset": materializationDataset, "parentProject": "parentProject", "viewsEnabled": "true", "sourceType": "query", "query": "select * from bqtest.test" } )

Escribir en tablas de BigQuery

En este ejemplo escribe directamente en el servicio de BigQuery. BigQuery también admite el método de escritura “indirecta”. Para obtener más información sobre la configuración de escritura indirecta, consulte Uso de escritura indirecta con Google BigQuery.

Requisitos previos:

  • Una tabla de BigQuery en la cual le gustaría escribir. Necesitará los nombres de la tabla y el conjunto de datos de BigQuery, en el formulario [dataset].[table]. También puede proporcionar un nombre de tabla nuevo que se creará automáticamente. Llamemos a esto tableName.

  • El proyecto de facturación para la tabla de BigQuery. Necesitará el nombre del proyecto, parentProject. Si no hay ningún proyecto principal de facturación, utilice el proyecto que contiene la tabla.

  • Información de autenticación de BigQuery. Complete los pasos para administrar sus credenciales de conexión con AWS Glue para configurar su información de autenticación. Necesitará el nombre de la conexión de AWS Glue, connectionName.

Por ejemplo:

bigquery_write = glueContext.write_dynamic_frame.from_options( frame=frameToWrite, connection_type="bigquery", connection_options={ "connectionName": "connectionName", "parentProject": "parentProject", "writeMethod": "direct", "table": "tableName", } )

Referencia de opciones de conexión de BigQuery

  • project: (Predeterminado): cuenta de servicio de Google Cloud predeterminada. Se utiliza para lectura/escritura. El nombre de un proyecto de Google Cloud asociado a la tabla.

  • table — (Obligatorio) Se utiliza para lectura/escritura. El nombre de la tabla de BigQuery en el formato [[project:]dataset.].

  • dataset (Obligatorio): cuando no se ha definido mediante la opción table. Se utiliza para lectura/escritura. El nombre del conjunto de datos que contiene la tabla de BigQuery.

  • parentProject: (Predeterminado): cuenta de servicio de Google Cloud predeterminada. Se utiliza para lectura/escritura. El nombre de un proyecto de Google Cloud asociado a project que se utiliza para la facturación.

  • sourceType: se utiliza para leer. Obligatorio al leer. Valores válidos: table, query informa a AWS Glue si leerá por tabla o por consulta.

  • materializationDataset: se utiliza para leer. Valores válidos: cadenas. El nombre de un conjunto de datos de BigQuery que se utiliza para almacenar las materializaciones de las vistas.

  • viewsEnabled: se utiliza para leer. Valor predeterminado: falso. Valores válidos: true y false. Configura si BigQuery utilizará las vistas.

  • query: se utiliza para leer. Se utiliza cuando viewsEnabled es verdadero. Una consulta DQL de GoogleSQL.

  • temporaryGcsBucket: se utiliza para escribir. Obligatorio cuando writeMethod se establece en el valor predeterminado (indirect). Nombre de un bucket de Google Cloud Storage que se utiliza para almacenar una forma intermedia de los datos mientras escribe en BigQuery.

  • writeMethod — Predeterminado: indirect. Valores válidos: direct, indirect. Se utiliza para escribir. Especifica el método utilizado para escribir los datos.

    • Si se establece en direct, el conector escribirá con la API de escritura de BigQuery Storage.

    • Si se establece en indirect, el conector escribirá en Google Cloud Storage y, a continuación, lo transferirá a BigQuery mediante una operación de carga. Su cuenta de servicio de Google Cloud necesitará los permisos de GCS adecuados.

Uso de escritura indirecta con Google BigQuery

En este ejemplo, se usa la escritura indirecta, que escribe los datos en Google Cloud Storage y los copia en Google BigQuery.

Requisitos previos:

Necesitará un bucket temporal de Google Cloud Storage, llamado temporaryBucket.

El rol de IAM de GCP de la cuenta de servicio de GCP de AWS Glue necesitará los permisos de GCS adecuados para acceder a temporaryBucket.

Configuración adicional:

Para configurar la escritura indirecta con BigQuery, siga estos pasos:
  1. Evalúe Configuración de conexiones con BigQuery y localice o vuelva a descargar el archivo JSON de credenciales de GCP. Identifique secretName, el secreto de AWS Secrets Manager de la conexión Google BigQuery para AWS Glue que se utiliza en el trabajo.

  2. Cargue el archivo JSON de sus credenciales a una ubicación de Amazon S3 con la seguridad adecuada. Conserve la ruta del archivo, s3secretpath, para pasos futuros.

  3. Edite el secretName y agregue la clave spark.hadoop.google.cloud.auth.service.account.json.keyfile. Establezca el valor en s3secretpath.

  4. Otorgue permisos de IAM para AWS Glue en Amazon S3 para acceder a s3secretpath.

Ahora puede proporcionar la ubicación temporal de su bucket de GCS a su método de escritura. No es necesario proporcionar writeMethod, ya que indirect históricamente es el valor predeterminado.

bigquery_write = glueContext.write_dynamic_frame.from_options( frame=frameToWrite, connection_type="bigquery", connection_options={ "connectionName": "connectionName", "parentProject": "parentProject", "temporaryGcsBucket": "temporaryBucket", "table": "tableName", } )