Utiliser le connecteur BigQuery Spark

Le connecteur spark-bigquery est utilisé avec Apache Spark pour lire et écrire des données depuis et vers BigQuery. Le connecteur tire profit de l'API BigQuery Storage lors de la lecture des données de BigQuery.

Ce tutoriel fournit des informations sur la disponibilité du connecteur préinstallé et explique comment mettre une version de connecteur spécifique à la disposition des tâches Spark. Un exemple de code vous montre comment utiliser le connecteur BigQuery Spark dans une application Spark.

Utiliser le connecteur préinstallé

Le connecteur Spark BigQuery est préinstallé et disponible pour les tâches Spark exécutées sur des clusters Dataproc créés avec les versions d'image 2.1 et ultérieures. La version du connecteur préinstallé est indiquée sur chaque page de version de l'image. Par exemple, la ligne BigQuery Connector sur la page Versions 2.2.x de l'image indique la version du connecteur installée sur les dernières versions d'images 2.2.

Rendre une version de connecteur spécifique disponible pour les tâches Spark

Si vous souhaitez utiliser une version de connecteur différente d'une version préinstallée sur un cluster de version d'image 2.1 ou ultérieure, ou si vous souhaitez installer le connecteur sur un cluster de version d'image antérieure à 2.1, suivez les instructions de cette section.

Important:La version spark-bigquery-connector doit être compatible avec la version de l'image du cluster Dataproc. Consultez la matrice de compatibilité du connecteur avec les images Dataproc.

Clusters de versions d'images 2.1 et versions ultérieures

Lorsque vous créez un cluster Dataproc avec une version d'image 2.1 ou ultérieure, spécifiez la version du connecteur en tant que métadonnées de cluster.

Exemple de gcloud CLI:

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --image-version=2.2 \
    --metadata=SPARK_BQ_CONNECTOR_VERSION or SPARK_BQ_CONNECTOR_URL\
    other flags

Remarques :

  • SPARK_BQ_CONNECTOR_VERSION: spécifiez une version de connecteur. Les versions du connecteur Spark BigQuery sont répertoriées sur la page spark-bigquery-connector/releases sur GitHub.

    Exemple :

    --metadata=SPARK_BQ_CONNECTOR_VERSION=0.42.1
    
  • SPARK_BQ_CONNECTOR_URL: spécifiez une URL qui pointe vers le fichier JAR dans Cloud Storage. Vous pouvez spécifier l'URL d'un connecteur listé dans la colonne link (Lien) de la section Downloading and Using the Connector (Télécharger et utiliser le connecteur) sur GitHub ou le chemin d'accès à un emplacement Cloud Storage où vous avez placé un fichier JAR de connecteur personnalisé.

    Exemples :

    --metadata=SPARK_BQ_CONNECTOR_URL=gs://spark-lib/bigquery/spark-3.5-bigquery-0.42.1.jar
    --metadata=SPARK_BQ_CONNECTOR_URL=gs://PATH_TO_CUSTOM_JAR
    

Clusters de versions d'images 2.0 et antérieures

Vous pouvez mettre le connecteur Spark BigQuery à la disposition de votre application de l'une des manières suivantes:

  1. Installez le connecteur spark-bigquery dans le répertoire de fichiers JAR Spark de chaque nœud en effectuant l'action d'initialisation des connecteurs Dataproc lors de la création de votre cluster.

  2. Indiquez l'URL du fichier JAR du connecteur lorsque vous envoyez votre tâche au cluster à l'aide de la console Google Cloud , de gcloud CLI ou de l'API Dataproc.

    Console

    Utilisez l'élément Fichiers JAR de la tâche Spark sur la page Dataproc Envoyer une tâche.

    gcloud

    Utilisez l'option gcloud dataproc jobs submit spark --jars.

    API

    Utilisez le champ SparkJob.jarFileUris.

    Spécifier le fichier JAR du connecteur lors de l'exécution de tâches Spark sur des clusters avec une version d'image antérieure à la version 2.0

    • Spécifiez le fichier JAR du connecteur en remplaçant les informations de version Scala et du connecteur dans la chaîne d'URI suivante:
      gs://spark-lib/bigquery/spark-bigquery-with-dependencies_SCALA_VERSION-CONNECTOR_VERSION.jar
      
    • Utiliser Scala 2.12 avec les versions d'image Dataproc 1.5+
      gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-CONNECTOR_VERSION.jar
      
      Exemple gcloud CLI:
      gcloud dataproc jobs submit spark \
          --jars=gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.23.2.jar \
          -- job args
      
    • Utilisez Scala 2.11 avec les versions d'image Dataproc 1.4 et antérieures:
      gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.11-CONNECTOR_VERSION.jar
      
      Exemple gcloud CLI:
      gcloud dataproc jobs submit spark \
          --jars=gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.11-0.23.2.jar \
          -- job-args
      
  3. Incluez le fichier JAR du connecteur dans votre application Scala ou Java Spark en tant que dépendance (consultez la section Compiler sur le connecteur).

Calculer les coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • Dataproc
  • BigQuery
  • Cloud Storage

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux Google Cloud utilisateurs peuvent bénéficier d'un essai gratuit.

Lire et écrire des données depuis et vers BigQuery

Cet exemple lit les données de BigQuery dans un DataFrame Spark pour effectuer un décompte de mots à l'aide de l'API de source de données standard.

Le connecteur écrit les données dans BigQuery en les mettant d'abord en mémoire tampon dans une table temporaire Cloud Storage. Ensuite, il copie toutes les données dans BigQuery en une seule opération. Le connecteur tente de supprimer les fichiers temporaires une fois l'opération de chargement BigQuery terminée, puis effectue une nouvelle tentative lorsque l'application Spark se termine. Si la tâche échoue, supprimez tous les fichiers Cloud Storage temporaires restants. En règle générale, les fichiers BigQuery temporaires se trouvent dans gs://[bucket]/.spark-bigquery-[jobid]-[UUID].

Configurer la facturation

Par défaut, le projet associé aux identifiants ou au compte de service est facturé pour l'utilisation de l'API. Pour facturer un autre projet, définissez la configuration suivante : spark.conf.set("parentProject", "<BILLED-GCP-PROJECT>").

Le projet à facturer peut également être défini au niveau des opérations de lecture/écriture, comme ceci : .option("parentProject", "<BILLED-GCP-PROJECT>").

Exécuter le code

Avant d'exécuter cet exemple, créez un ensemble de données nommé "wordcount_dataset" ou remplacez l'ensemble de données de sortie dans le code par un ensemble de données BigQuery existant dans votre projetGoogle Cloud .

Utilisez la commande bq pour créer l'élément wordcount_dataset :

bq mk wordcount_dataset

Utilisez la commande Google Cloud CLI pour créer un bucket Cloud Storage qui servira à l'exportation vers BigQuery:

gcloud storage buckets create gs://[bucket]

Scala

  1. Examinez le code et remplacez l'espace réservé [bucket] par le bucket Cloud Storage que vous avez créé précédemment.
    /*
     * Remove comment if you are not running in spark-shell.
     *
    import org.apache.spark.sql.SparkSession
    val spark = SparkSession.builder()
      .appName("spark-bigquery-demo")
      .getOrCreate()
    */
    
    // Use the Cloud Storage bucket for temporary BigQuery export data used
    // by the connector.
    val bucket = "[bucket]"
    spark.conf.set("temporaryGcsBucket", bucket)
    
    // Load data in from BigQuery. See
    // https://github.com/GoogleCloudDataproc/spark-bigquery-connector/tree/0.17.3#properties
    // for option information.
    val wordsDF =
      (spark.read.format("bigquery")
      .option("table","bigquery-public-data:samples.shakespeare")
      .load()
      .cache())
    
    wordsDF.createOrReplaceTempView("words")
    
    // Perform word count.
    val wordCountDF = spark.sql(
      "SELECT word, SUM(word_count) AS word_count FROM words GROUP BY word")
    wordCountDF.show()
    wordCountDF.printSchema()
    
    // Saving the data to BigQuery.
    (wordCountDF.write.format("bigquery")
      .option("table","wordcount_dataset.wordcount_output")
      .save())
  2. Exécutez le code sur votre cluster.
    1. Se connecter au nœud maître du cluster Dataproc via SSH
      1. Accédez à la page Clusters Dataproc dans la Google Cloud console, puis cliquez sur le nom de votre cluster. Page &quot;Clusters Dataproc&quot; de Cloud Console.
      2. Sur la page >Détails du cluster, sélectionnez l'onglet "Instances de VM". Cliquez ensuite sur SSH à droite du nom du nœud maître du cluster > Page &quot;Détails du cluster Dataproc&quot; dans Cloud Console. > 
        . Une fenêtre de navigateur s'ouvre dans votre répertoire d'accueil sur le nœud maître.
            Connected, host fingerprint: ssh-rsa 2048 ...
            ...
            user@clusterName-m:~$
            
    2. Créez le fichier wordcount.scala avec l'éditeur de texte vi, vim ou nano préinstallé, puis collez le code Scala à partir de la liste de codes Scala.
      nano wordcount.scala
        
    3. Lancez le REPL spark-shell.
      $ spark-shell --jars=gs://spark-lib/bigquery/spark-bigquery-latest.jar
      ...
      Using Scala version ...
      Type in expressions to have them evaluated.
      Type :help for more information.
      ...
      Spark context available as sc.
      ...
      SQL context available as sqlContext.
      scala>
      
    4. Exécutez "WordCount.scala" avec la commande :load wordcount.scala pour créer la table BigQuery wordcount_output. La liste de sortie affiche 10 lignes du résultat de la commande "wordcount".
      :load wordcount.scala
      ...
      +---------+----------+
      |     word|word_count|
      +---------+----------+
      |     XVII|         2|
      |    spoil|        28|
      |    Drink|         7|
      |forgetful|         5|
      |   Cannot|        46|
      |    cures|        10|
      |   harder|        13|
      |  tresses|         3|
      |      few|        62|
      |  steel'd|         5|
      | tripping|         7|
      |   travel|        35|
      |   ransom|        55|
      |     hope|       366|
      |       By|       816|
      |     some|      1169|
      |    those|       508|
      |    still|       567|
      |      art|       893|
      |    feign|        10|
      +---------+----------+
      only showing top 20 rows
      
      root
       |-- word: string (nullable = false)
       |-- word_count: long (nullable = true)
      

      Pour prévisualiser la table de sortie, ouvrez la page BigQuery, sélectionnez la table wordcount_output, puis cliquez sur Aperçu. Aperçu de la table sur la page &quot;Explorateur BigQuery&quot; de Cloud Console.

PySpark

  1. Examinez le code et remplacez l'espace réservé [bucket] par le bucket Cloud Storage que vous avez créé précédemment.
    #!/usr/bin/env python
    
    """BigQuery I/O PySpark example."""
    
    from pyspark.sql import SparkSession
    
    spark = SparkSession \
      .builder \
      .master('yarn') \
      .appName('spark-bigquery-demo') \
      .getOrCreate()
    
    # Use the Cloud Storage bucket for temporary BigQuery export data used
    # by the connector.
    bucket = "[bucket]"
    spark.conf.set('temporaryGcsBucket', bucket)
    
    # Load data from BigQuery.
    words = spark.read.format('bigquery') \
      .option('table', 'bigquery-public-data:samples.shakespeare') \
      .load()
    words.createOrReplaceTempView('words')
    
    # Perform word count.
    word_count = spark.sql(
        'SELECT word, SUM(word_count) AS word_count FROM words GROUP BY word')
    word_count.show()
    word_count.printSchema()
    
    # Save the data to BigQuery
    word_count.write.format('bigquery') \
      .option('table', 'wordcount_dataset.wordcount_output') \
      .save()
  2. Exécuter le code sur votre cluster
    1. Se connecter au nœud maître du cluster Dataproc via SSH
      1. Accédez à la page Clusters Dataproc dans la Google Cloud console, puis cliquez sur le nom de votre cluster. Page &quot;Clusters&quot; (Clusters) dans Cloud Console
      2. Sur la page Détails du cluster, sélectionnez l'onglet "Instances de VM". Cliquez ensuite sur SSH à droite du nom du nœud maître du cluster. Sélectionnez SSH sur la ligne du nom du cluster sur la page &quot;Cluster details&quot; (Détails du cluster) de la console Cloud.
        Une fenêtre de navigateur s'ouvre dans votre répertoire d'accueil sur le nœud maître.
            Connected, host fingerprint: ssh-rsa 2048 ...
            ...
            user@clusterName-m:~$
            
    2. Créez le fichier wordcount.py avec l'éditeur de texte vi, vim ou nano préinstallé, puis collez le code PySpark à partir de la liste de code PySpark.
      nano wordcount.py
      
    3. Exécutez "wordcount" avec spark-submit pour créer la table BigQuery wordcount_output. La liste de sortie affiche 10 lignes du résultat de la commande "wordcount".
      spark-submit --jars gs://spark-lib/bigquery/spark-bigquery-latest.jar wordcount.py
      ...
      +---------+----------+
      |     word|word_count|
      +---------+----------+
      |     XVII|         2|
      |    spoil|        28|
      |    Drink|         7|
      |forgetful|         5|
      |   Cannot|        46|
      |    cures|        10|
      |   harder|        13|
      |  tresses|         3|
      |      few|        62|
      |  steel'd|         5|
      | tripping|         7|
      |   travel|        35|
      |   ransom|        55|
      |     hope|       366|
      |       By|       816|
      |     some|      1169|
      |    those|       508|
      |    still|       567|
      |      art|       893|
      |    feign|        10|
      +---------+----------+
      only showing top 20 rows
      
      root
       |-- word: string (nullable = false)
       |-- word_count: long (nullable = true)
      

      Pour prévisualiser la table de sortie, ouvrez la page BigQuery, sélectionnez la table wordcount_output, puis cliquez sur Aperçu. Aperçu de la table sur la page &quot;Explorateur BigQuery&quot; de Cloud Console.

Étapes suivantes