Conéctate a Apache Spark

Como administrador de BigQuery, puedes crear una conexión a fin de permitir que los analistas de datos ejecuten procedimientos almacenados para Apache Spark.

Antes de comenzar

Consideraciones de ubicación

Cuando elijas una ubicación para tus datos, ten en cuenta esta información:

Multirregiones

Debes especificar los recursos de Google Cloud ubicados en la misma área geográfica grande:

  • Una conexión en la multirregión EE.UU. de BigQuery puede hacer referencia a un servidor del historial de Spark o a Dataproc Metastore en cualquier región individual de la región geográfica de EE.UU. como us-central1, us-east4 o us-west2.

  • Una conexión en la multirregión UE de BigQuery puede hacer referencia a un servidor de historial de Spark o un almacén de metadatos de Dataproc en Estados miembros de la Unión Europea, como europe-north1 o europe-west3

Regiones individuales

Una conexión en una sola región solo puede hacer referencia a recursos de Google Cloud en la misma región. Por ejemplo, una conexión en la región única us-east4 solo puede hacer referencia a un servidor de historial de Spark o a un Dataproc Metastore en us-east4.

Crear conexiones

Selecciona una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. Para crear una conexión, haz clic en Agregar Agregar datos y, luego, en Conexiones a fuentes de datos externas.

  3. En la lista Tipo de conexión, selecciona Apache Spark.

  4. En el campo ID de conexión, ingresa un nombre para tu conexión, por ejemplo, spark_connection.

  5. En la lista Ubicación de los datos, selecciona una región.

    Puedes crear una conexión en regiones y multirregiones que sean compatibles con BigQuery. Para obtener más información, consulta Consideraciones sobre la ubicación.

  6. En la lista Servicio de almacén de metadatos, selecciona un Dataproc Metastore (opcional).

  7. En el campo Clúster del servidor de historial, ingresa un Servidor del historial persistente de Dataproc (opcional).

  8. Haga clic en Crear conexión.

  9. Haz clic en Ir a la conexión.

  10. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso siguiente.

bq

  1. En un entorno de línea de comandos, usa el comando bq mk para crear una conexión:

    bq mk --connection --connection_type='SPARK' \
     --properties=PROPERTIES \
     --project_id=PROJECT_ID \
     --location=LOCATION
     CONNECTION_ID
    

    Reemplaza lo siguiente:

    • PROPERTIES: Es un par clave-valor para proporcionar parámetros específicos de la conexión en formato JSON.

      Por ejemplo:

      --properties='{
      "metastoreServiceConfig": {"metastoreService": "METASTORE_SERVICE_NAME"},
      "sparkHistoryServerConfig": {"dataprocCluster": "DATAPROC_CLUSTER_NAME"}
      }'
      

      Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto de Google Cloud.

    • LOCATION: es la ubicación en la que deseas almacenar la conexión, por ejemplo, US.

    • CONNECTION_ID: el ID de conexión, por ejemplo, myconnection.

      Cuando ves los detalles de conexión en la consola de Google Cloud, el ID de conexión es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemplo projects/.../locations/.../connections/myconnection.

  2. Recupera y copia el ID de cuenta de servicio porque lo necesitarás en otro paso:

    bq show --location=LOCATION --connection PROJECT_ID.LOCATION.CONNECTION_ID
    

    El resultado es similar a este:

    Connection myproject.us.myconnection
    
           name           type                    properties
    ---------------------- ------- ---------------------------------------------------
    myproject.us.myconnection  SPARK   {"serviceAccountId": "bqserver@example.iam.gserviceaccount.com"}
    

Para obtener información sobre cómo administrar las conexiones, consulta Administra conexiones.

Otorga acceso a la cuenta de servicio

A fin de permitir que un procedimiento almacenado para Apache Spark acceda a tus recursos de Google Cloud, debes otorgar a la cuenta de servicio asociada con la conexión del procedimiento almacenado y los permisos de IAM necesarios. Como alternativa, puedes usar tu cuenta de servicio personalizada para acceder a los datos.

  • Para leer y escribir datos desde y hacia BigQuery, debes otorgarle a la cuenta de servicio los siguientes permisos de IAM:

    • bigquery.tables.* en tus tablas de BigQuery
    • bigquery.readsessions.* en tu proyecto

    El rol de IAM roles/bigquery.admin incluye los permisos que la cuenta de servicio necesita para leer y escribir datos desde y hacia BigQuery.

  • Para leer y escribir datos en Cloud Storage y en él, debes otorgar a la cuenta de servicio el permiso storage.objects.* en tus objetos de Cloud Storage.

    El rol de IAM roles/storage.objectAdmin incluye los permisos que la cuenta de servicio necesita para leer y escribir datos desde y hacia Cloud Storage.

  • Si especificas Dataproc Metastore cuando creas una conexión, para que BigQuery recupere detalles sobre la configuración de almacén de metadatos, debes otorgar a la cuenta de servicio el permiso metastore.services.get en Dataproc Metastore.

    El rol predefinido roles/metastore.metadataViewer incluye el permiso que necesita la cuenta de servicio para recuperar detalles sobre la configuración del almacén de metadatos.

    También debes otorgar a la cuenta de servicio el rol roles/storage.objectAdmin en el bucket de Cloud Storage para que tu procedimiento almacenado pueda acceder al directorio de almacenes de Hive de tu Dataproc Metastore (hive.metastore.warehouse.dir). Si tu procedimiento almacenado realiza operaciones en el almacén de metadatos, es posible que debas otorgar permisos adicionales. Para obtener más información sobre los roles y los permisos de IAM en Dataproc Metastore, consulta Roles y permisos predefinidos de Dataproc Metastore.

  • Si especificas un servidor de historial persistente de Dataproc cuando creas una conexión, debes otorgar a la cuenta de servicio los siguientes roles:

    • El rol roles/dataproc.viewer en el servidor de historial persistente de Dataproc que contiene el permiso dataproc.clusters.get
    • El rol roles/storage.objectAdmin en el bucket de Cloud Storage que especificas para la propiedad spark:spark.history.fs.logDirectory cuando creas el servidor del historial persistente de Dataproc

    Para obtener más información, consulta Servidor de historial persistente de Dataproc y Roles y permisos de Dataproc.

Comparte conexiones con usuarios

Puedes otorgar los siguientes roles para permitir que los usuarios consulten datos y administren conexiones:

  • roles/bigquery.connectionUser: Permite que los usuarios usen conexiones para conectarse con fuentes de datos externas y ejecutar consultas en ellas.

  • roles/bigquery.connectionAdmin: Permite que los usuarios administren conexiones.

Para obtener más información sobre los roles y los permisos de IAM en BigQuery, consulta Roles y permisos predefinidos.

Selecciona una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

    Las conexiones se enumeran en tu proyecto, en un grupo llamado Conexiones externas.

  2. En el panel Explorador, haz clic en el nombre de tu proyecto > Conexiones externas > conexión.

  3. En el panel Detalles, haz clic en Compartir para compartir una conexión. A continuación, sigue estos pasos:

    1. En el cuadro de diálogo Permisos de conexión, agrega o edita las principales para compartir la conexión con otros principales.

    2. Haz clic en Guardar.

bq

No puedes compartir una conexión con la herramienta de línea de comandos de bq. Para compartir una conexión, usa la consola de Google Cloud o el método de la API de conexiones de BigQuery.

API

Consulta el método projects.locations.connections.setIAM en la sección de referencia de la API de REST de las conexiones de BigQuery y proporciona una instancia del recurso policy.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

¿Qué sigue?