Se connecter à Apache Spark

En tant qu'administrateur BigQuery, vous pouvez créer une connexion pour permettre aux analystes de données d'exécuter des procédures stockées pour Apache Spark.

Avant de commencer

Considérations relatives aux emplacements

Lorsque vous choisissez un emplacement pour les données, envisagez d'entreprendre les actions suivantes :

Emplacements multirégionaux

Vous devez spécifier des ressources Google Cloud situées dans la même zone géographique :

  • Une connexion dans l'emplacement multirégional BigQuery États-Unis peut faire référence à un serveur d'historique Spark ou à un métastore Dataproc dans n'importe quelle région des États-Unis (par exemple, us-central1, us-east4 ou us-west2).

  • Une connexion dans l'emplacement BigQuery multirégional EU peut faire référence à un serveur d'historique Spark ou à un Dataproc Metastore situé dans des États membres de l'Union européenne, tels que europe-north1 ou europe-west3.

Régions uniques

Une connexion dans une seule région ne peut référencer que des ressources Google Cloud situées dans la même région. Par exemple, une connexion dans la région unique us-east4 ne peut référencer qu'un serveur d'historique Spark ou un Dataproc Metastore situé dans us-east4.

Créer des connexions

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Pour créer une connexion, cliquez sur Ajouter des données, puis sur Connexions aux sources de données externes.

  3. Dans la liste Type de connexion, sélectionnez Apache Spark.

  4. Dans le champ ID de la connexion, saisissez un nom pour votre connexion. Par exemple, spark_connection.

  5. Dans la liste Emplacement des données, sélectionnez une région.

    Vous pouvez créer une connexion dans des régions et emplacements multirégionaux compatibles avec BigQuery. Pour en savoir plus, consultez la section Considérations relatives aux zones.

  6. Facultatif : dans la liste Service de métastore, sélectionnez métastore Dataproc.

  7. Facultatif : dans le champ Cluster de serveurs d'historique, saisissez un serveur d'historique persistant Dataproc.

  8. Cliquez sur Créer une connexion.

  9. Cliquez sur Accéder à la connexion.

  10. Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.

bq

  1. Dans un environnement de ligne de commande, utilisez la commande bq mk pour créer une connexion :

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

    Remplacez les éléments suivants :

    • PROPERTIES : paire clé-valeur permettant d'inclure des paramètres spécifiques à la connexion au format JSON

      Exemple :

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

      Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud

    • LOCATION : emplacement de stockage de la connexion, par exemple US

    • CONNECTION_ID : ID de connexion (par exemple, myconnection)

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/.../locations/.../connections/myconnection).

  2. Récupérez et copiez l'ID du compte de service, car vous en aurez besoin dans une autre étape :

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

    Le résultat ressemble à ce qui suit :

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

Pour en savoir plus sur la gestion des connexions, consultez la page Gérer les connexions.

Accorder l'accès au compte de service

Pour autoriser une procédure stockée pour Apache Spark à accéder à vos ressources Google Cloud, vous devez accorder les autorisations IAM nécessaires au compte de service associé à la connexion de la procédure stockée. Vous pouvez également utiliser votre compte de service personnalisé pour accéder aux données.

  • Pour lire et écrire des données depuis et vers BigQuery, vous devez accorder au compte de service les autorisations IAM suivantes :

    • bigquery.tables.* sur vos tables BigQuery
    • bigquery.readsessions.* sur votre projet

    Le rôle IAM roles/bigquery.admin inclut les autorisations dont le compte de service a besoin pour lire et écrire des données depuis et vers BigQuery.

  • Pour lire et écrire des données depuis et vers Cloud Storage, vous devez accorder au compte de service l'autorisation storage.objects.* sur vos objets Cloud Storage.

    Le rôle IAM roles/storage.objectAdmin inclut les autorisations dont le compte de service a besoin pour lire et écrire des données depuis et vers Cloud Storage.

  • Si vous spécifiez le métastore Dataproc lorsque vous créez une connexion, pour que BigQuery récupère les informations sur la configuration du métastore, vous devez attribuer au compte de service l'autorisation metastore.services.get sur votre métastore Dataproc.

    Le rôle prédéfini roles/metastore.metadataViewer inclut l'autorisation dont le compte de service a besoin pour récupérer les détails de la configuration du métastore.

    Vous devez également attribuer au compte de service le rôle roles/storage.objectAdmin sur le bucket Cloud Storage afin que la procédure stockée puisse accéder au répertoire d'entrepôt Hive de votre Dataproc Metastore (hive.metastore.warehouse.dir). Si votre procédure stockée effectue des opérations sur le métastore, vous devrez peut-être accorder des autorisations supplémentaires. Pour en savoir plus sur les rôles et les autorisations IAM dans le métastore Dataproc, consultez la page Rôles et autorisations prédéfinis du métastore Dataproc.

  • Si vous spécifiez un serveur d'historique persistant Dataproc lorsque vous créez une connexion, vous devez attribuer les rôles suivants au compte de service :

    • Le rôle roles/dataproc.viewer sur votre serveur d'historique persistant Dataproc, qui contient l'autorisation dataproc.clusters.get.
    • Le rôle roles/storage.objectAdmin sur le bucket Cloud Storage que vous spécifiez pour la propriété spark:spark.history.fs.logDirectory lorsque vous créez le serveur d'historique persistant Dataproc.

    Pour en savoir plus, consultez les pages Serveur d'historique persistant Dataproc et Rôles et autorisations Dataproc.

Partager des connexions avec les utilisateurs

Vous pouvez attribuer les rôles suivants pour permettre aux utilisateurs d'interroger des données et de gérer les connexions :

  • roles/bigquery.connectionUser permet aux utilisateurs de se connecter à des sources de données externes et d'y exécuter des requêtes.

  • roles/bigquery.connectionAdmin permet aux utilisateurs de gérer les connexions.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

    Les connexions sont répertoriées dans votre projet, dans un groupe appelé Connexions externes.

  2. Dans le volet Explorateur, cliquez sur votre nom de projet > Connexions externes > connexion.

  3. Dans le volet Détails, cliquez sur Partager pour partager une connexion. Ensuite, procédez comme suit :

    1. Dans la boîte de dialogue Autorisations de connexion, partagez la connexion avec d'autres comptes principaux en ajoutant ou en modifiant des comptes principaux.

    2. Cliquez sur Enregistrer.

bq

Vous ne pouvez pas partager de connexion avec l'outil de ligne de commande bq. Pour partager une connexion, utilisez la console Google Cloud ou la méthode de l'API BigQuery Connections permettant le partage de connexion.

API

Utilisez la méthode projects.locations.connections.setIAM dans la section de référence de l'API REST BigQuery Connections et fournissez une instance de la ressource policy.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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");
    }
  }
}

Étapes suivantes