Accélérer Google Cloud Serverless pour Apache Spark avec Lightning Engine

Ce document explique comment activer Lightning Engine pour accélérer les charges de travail par lot et les sessions interactives Serverless pour Apache Spark.

Présentation

Lightning Engine est un accélérateur de requêtes hautes performances optimisé par un moteur d'optimisation multicouche qui effectue des techniques d'optimisation habituelles, telles que l'optimisation des requêtes et de l'exécution, ainsi que des optimisations sélectionnées dans la couche du système de fichiers et les connecteurs d'accès aux données.

Comme le montre l'illustration suivante, Lightning Engine accélère les performances d'exécution des requêtes Spark sur une charge de travail de type TPC-H (taille de l'ensemble de données 10 TB).

Pour en savoir plus, consultez Présentation de Lightning Engine, la nouvelle génération de performances Apache Spark.

Disponibilité de Lightning Engine

  • Lightning Engine est disponible avec les environnements d'exécution Serverless pour Apache Spark compatibles qui sont en disponibilité générale (actuellement les environnements d'exécution 1.2, 2.2 et 2.3 ; non disponible dans l'environnement d'exécution Spark 3.0).
  • Lightning Engine n'est disponible qu'avec le niveau tarifaire premium de Serverless pour Apache Spark.
    • Charges de travail par lot : Lightning Engine est automatiquement activé pour les charges de travail par lot au niveau Premium. Aucune action n'est requise.
    • Sessions interactives : Lightning Engine n'est pas activé par défaut pour les sessions interactives. Pour l'activer, consultez Activer le moteur Lightning.
    • Modèles de session : Lightning Engine n'est pas activé par défaut pour les modèles de session. Pour l'activer, consultez Activer Lightning Engine.

Activer Lightning Engine

Les sections suivantes vous expliquent comment activer le moteur Lightning sur une charge de travail par lot Serverless pour Apache Spark, un modèle de session et une session interactive.

Charge de travail par lot

Activer Lightning Engine sur une charge de travail par lot

Vous pouvez utiliser la console Google Cloud , Google Cloud CLI ou l'API Dataproc pour activer Lightning Engine sur une charge de travail par lot.

Console

Utilisez la console Google Cloud pour activer Lightning Engine sur une charge de travail par lot.

  1. Dans la console Google Cloud  :

    1. Accédez à la page "Lots" de Dataproc.
    2. Cliquez sur Créer pour ouvrir la page Créer un lot.
  2. Sélectionnez et renseignez les champs suivants :

    • Conteneur :
    • Configuration des niveaux :

      • Sélectionnez Premium. Cela active et coche automatiquement l'option "Activer LIGHTNING ENGINE pour améliorer les performances Spark".

      Lorsque vous sélectionnez le niveau Premium, les niveaux de calcul du pilote et de l'exécuteur sont définis sur Premium. Ces paramètres de calcul de niveau Premium définis automatiquement ne peuvent pas être remplacés pour les lots utilisant des runtimes antérieurs à 3.0.

      Vous pouvez configurer les niveaux de disque du pilote et de l'exécuteur sur Premium ou conserver leur valeur par défaut Standard. Si vous choisissez un niveau de disque Premium, vous devez sélectionner la taille du disque. Pour en savoir plus, consultez Propriétés d'allocation des ressources.

    • Propriétés : facultatif. Saisissez la paire Key (nom de propriété) et Value suivante si vous souhaitez sélectionner le runtime Exécution de requêtes natives :

      Clé Valeur
      spark.dataproc.lightningEngine.runtime native

  3. Renseignez, sélectionnez ou confirmez les autres paramètres des charges de travail par lot. Consultez Envoyer une charge de travail par lot Spark.

  4. Cliquez sur Envoyer pour exécuter la charge de travail par lot Spark.

gcloud

Définissez les indicateurs de commande gcloud CLI gcloud dataproc batches submit spark pour activer un moteur Lightning sur une charge de travail par lot.

gcloud dataproc batches submit spark \
    --project=PROJECT_ID \
    --region=REGION \
    --properties=dataproc.tier=premium \
    OTHER_FLAGS_AS_NEEDED

Remarques :

  • PROJECT_ID : ID de votre projet Google Cloud . Les ID de projet sont listés dans la section Informations sur le projet du tableau de bord de la console Google Cloud .
  • REGION : Région Compute Engine disponible pour exécuter la charge de travail.
  • --properties=dataproc.tier=premium. Si vous définissez le niveau Premium, les propriétés suivantes sont automatiquement définies sur la charge de travail par lot :

    • spark.dataproc.engine=lightningEngine sélectionne Lightning Engine pour la charge de travail par lot.
    • spark.dataproc.driver.compute.tier et spark.dataproc.executor.compute.tier sont définis sur premium (voir Propriétés d'allocation des ressources). Ces paramètres de calcul de niveau Premium définis automatiquement ne peuvent pas être remplacés pour les lots utilisant des runtimes antérieurs à 3.0.
  • Autres propriétés

    • Moteur de requête natif : spark.dataproc.lightningEngine.runtime=native Ajoutez cette propriété si vous souhaitez sélectionner l'environnement d'exécution Exécution de requête native.

    • Niveaux et tailles de disque : par défaut, les tailles de disque du pilote et de l'exécuteur sont définies sur les niveaux et tailles standard. Vous pouvez ajouter des propriétés pour sélectionner les niveaux et les tailles de disque premium (par multiples de 375 GiB).
      Pour en savoir plus, consultez Propriétés d'allocation des ressources.

  • OTHER_FLAGS_AS_NEEDED : consultez Envoyer une charge de travail par lot Spark.

API

Pour activer Lightning Engine sur une charge de travail par lot, ajoutez "dataproc.tier":"premium" à RuntimeConfig.properties dans votre requête batches.create. Si vous définissez le niveau Premium, les propriétés suivantes sont automatiquement définies sur la charge de travail par lot :

  • spark.dataproc.engine=lightningEngine sélectionne Lightning Engine pour la charge de travail par lot.
  • spark.dataproc.driver.compute.tier et spark.dataproc.executor.compute.tier sont définis sur premium (voir Propriétés d'allocation des ressources). Ces paramètres de calcul de niveau Premium définis automatiquement ne peuvent pas être remplacés pour les lots utilisant des runtimes antérieurs à 3.0.

Autre RuntimeConfig.properties :

  • Moteur de requête natif : spark.dataproc.lightningEngine.runtime:native. Ajoutez cette propriété si vous souhaitez sélectionner l'environnement d'exécution Native Query Execution.

  • Niveaux et tailles de disque : par défaut, les tailles de disque du pilote et de l'exécuteur sont définies sur les niveaux et tailles standard. Vous pouvez ajouter des propriétés pour sélectionner des niveaux et des tailles premium (par multiples de 375 GiB).
    Pour en savoir plus, consultez Propriétés d'allocation des ressources.

Consultez Envoyer une charge de travail par lot Spark pour définir d'autres champs de l'API de charge de travail par lot.

Modèle de session

Activer Lightning Engine sur un modèle de session

Vous pouvez utiliser la console Google Cloud , Google Cloud CLI ou l'API Dataproc pour activer Lightning Engine sur un modèle de session pour une session Jupyter ou Spark Connect.

Console

Utilisez la console Google Cloud pour activer Lightning Engine sur une charge de travail par lot.

  1. Dans la console Google Cloud  :

    1. Accédez aux modèles de sessions Dataproc.
    2. Cliquez sur Créer pour ouvrir la page Créer un modèle de session.
  2. Sélectionnez et renseignez les champs suivants :

    • Informations sur le modèle de session :
      • Sélectionnez "Activer Lightning Engine pour améliorer les performances Spark".
    • Configuration de l'exécution :
    • Propriétés : saisissez les paires Key (nom de propriété) et Value suivantes pour sélectionner le niveau Premium :

      Clé Valeur
      dataproc.tier premium
      spark.dataproc.engine lightningEngine

      Facultatif : Saisissez la paire Key (nom de propriété) et Value suivante pour sélectionner le runtime Exécution de requêtes natives :

      Clé Valeur
      spark.dataproc.lightningEngine.runtime native

  3. Renseignez, sélectionnez ou confirmez les autres paramètres du modèle de session. Consultez Créer un modèle de session.

  4. Cliquez sur Envoyer pour créer le modèle de session.

gcloud

Vous ne pouvez pas créer directement un modèle de session Serverless pour Apache Spark à l'aide de la gcloud CLI. Vous pouvez plutôt utiliser la commande gcloud beta dataproc session-templates import pour importer un modèle de session existant, le modifier pour activer le moteur Lightning et, éventuellement, le runtime Native Query, puis exporter le modèle modifié à l'aide de la commande gcloud beta dataproc session-templates export.

API

Pour activer Lightning Engine sur un modèle de session, ajoutez "dataproc.tier":"premium" et "spark.dataproc.engine":"lightningEngine" à RuntimeConfig.properties dans votre requête sessionTemplates.create.

Autre RuntimeConfig.properties :

  • Moteur de requête natif : spark.dataproc.lightningEngine.runtime:native Ajoutez cette propriété à RuntimeConfig.properties pour sélectionner l'environnement d'exécution Exécution de requête native.

Consultez Créer un modèle de session pour définir d'autres champs de l'API de modèle de session.

Session interactive

Activer Lightning Engine sur une session interactive

Vous pouvez utiliser la Google Cloud CLI ou l'API Dataproc pour activer Lightning Engine dans une session interactive Serverless pour Apache Spark. Vous pouvez également activer Lightning Engine dans une session interactive d'un notebook BigQuery Studio.

gcloud

Définissez les indicateurs de commande gcloud beta dataproc sessions create spark de gcloud CLI suivante pour activer Lightning Engine dans une session interactive.

gcloud beta dataproc sessions create spark \
    --project=PROJECT_ID \
    --location=REGION \
    --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine \
    OTHER_FLAGS_AS_NEEDED

Remarques :

  • PROJECT_ID : ID de votre projet Google Cloud . Les ID de projet sont listés dans la section Informations sur le projet du tableau de bord de la console Google Cloud .
  • REGION : Région Compute Engine disponible pour exécuter la charge de travail.
  • --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine. Ces propriétés activent le moteur Lightning pour la session.

  • Autres propriétés :

    • Moteur de requête natif : spark.dataproc.lightningEngine.runtime=native : Ajoutez cette propriété pour sélectionner l'environnement d'exécution Exécution de requête native.
  • OTHER_FLAGS_AS_NEEDED : consultez Créer une session interactive.

API

Pour activer Lightning Engine dans une session, ajoutez "dataproc.tier":"premium" et "spark.dataproc.engine":"lightningEngine" à RuntimeConfig.properties dans votre requête sessions.create.

Autre RuntimeConfig.properties :

* Moteur de requête natif : spark.dataproc.lightningEngine.runtime:native. Ajoutez cette propriété à RuntimeConfig.properties si vous souhaitez sélectionner l'environnement d'exécution Exécution de requête native.

Consultez Créer une session interactive pour définir d'autres champs de l'API de modèle de session.

Notebook BigQuery

Vous pouvez activer Lightning Engine lorsque vous créez une session dans un notebook PySpark BigQuery Studio.

from google.cloud.dataproc_spark_connect import DataprocSparkSession
from google.cloud.dataproc_v1 import Session
session = Session()

# Enable Lightning Engine.
session.runtime_config.properties["dataproc.tier"] = "premium"
session.runtime_config.properties["spark.dataproc.engine"] = "lightningEngine"

# Enable THE Native Query Execution runtime.
session.runtime_config.properties["spark.dataproc.lightningEngine.runtime"] = "native"

# Create the Spark session.
spark = (
   DataprocSparkSession.builder
     .appName("APP_NAME")
     .dataprocSessionConfig(session)
     .getOrCreate())

# Add Spark application code here:

Vérifier les paramètres du moteur Lightning

Vous pouvez utiliser la console Google Cloud , Google Cloud CLI ou l'API Dataproc pour vérifier les paramètres Lightning Engine sur une charge de travail par lot, un modèle de session ou une session interactive.

Charge de travail par lot

  • Pour vérifier que le niveau du lot est défini sur premium et que le moteur est défini sur Lightning Engine :

    • ConsoleGoogle Cloud  : sur la page Lots, consultez les colonnes Niveau et Moteur pour le lot. Vous pouvez également cliquer sur l'ID de lot pour afficher ces paramètres sur la page d'informations sur le lot.
    • gcloud CLI : exécutez la commande gcloud dataproc batches describe.
    • API : envoyez une requête batches.get.

Modèle de session

  • Pour vérifier que engine est défini sur Lightning Engine pour un modèle de session :

    • ConsoleGoogle Cloud  : sur la page Modèles de session, consultez la colonne Moteur pour votre modèle. Vous pouvez également cliquer sur le nom du modèle de session pour afficher ce paramètre sur la page d'informations du modèle de session.
    • gcloud CLI : exécutez la commande gcloud beta dataproc session-templates describe.
    • API : envoyez une requête sessionTemplates.get.

Session interactive

  • engine est défini sur Lightning Engine pour une session interactive :

    • ConsoleGoogle Cloud  : sur la page Sessions interactives, consultez la colonne Moteur pour le modèle. Vous pouvez également cliquer sur l'ID de session interactive pour afficher ce paramètre sur la page d'informations du modèle de session.
    • gcloud CLI : exécutez la commande gcloud beta dataproc sessions describe.
    • API : envoyez une requête sessions.get.

Exécution de requêtes natives

L'exécution de requêtes natives (NQE, Native Query Execution) est une fonctionnalité optionnelle de Lightning Engine qui améliore les performances grâce à une implémentation native basée sur Apache Gluten et Velox, conçue pour le matériel Google.

L'environnement d'exécution de l'exécution de requêtes natives inclut une gestion unifiée de la mémoire pour le basculement dynamique entre la mémoire hors tas et la mémoire dans le tas, sans nécessiter de modifications des configurations Spark existantes. NQE offre une compatibilité étendue avec les opérateurs, les fonctions et les types de données Spark, ainsi qu'une intelligence permettant d'identifier automatiquement les opportunités d'utiliser le moteur natif pour des opérations de pushdown optimales.

Identifier les charges de travail d'exécution des requêtes natives

Utilisez l'exécution de requêtes natives dans les scénarios suivants :

  • API Spark DataFrame, API Spark Dataset et requêtes Spark SQL qui lisent des données à partir de fichiers Parquet et ORC. Le format du fichier de sortie n'a aucune incidence sur les performances d'exécution des requêtes natives.

  • Charges de travail recommandées par l'outil de qualification de l'exécution des requêtes natives.

L'exécution de requêtes natives n'est pas recommandée pour les charges de travail avec des entrées des types de données suivants :

  • Octet : ORC et Parquet
  • Code temporel : ORC
  • Struct, Array, Map : Parquet

Limites d'exécution des requêtes natives

L'activation de l'exécution de requêtes natives dans les scénarios suivants peut entraîner des exceptions, des incompatibilités Spark ou le retour de la charge de travail au moteur Spark par défaut.

Créations de remplacement

L'exécution de requêtes natives peut entraîner un retour à l'exécution de charges de travail sur le moteur d'exécution Spark, ce qui peut entraîner une régression ou un échec.

  • ANSI : si le mode ANSI est activé, l'exécution revient à Spark.

  • Mode sensible à la casse : l'exécution de requêtes natives n'est compatible qu'avec le mode par défaut de Spark, qui n'est pas sensible à la casse. Si le mode sensible à la casse est activé, des résultats incorrects peuvent s'afficher.

  • Analyse de table partitionnée : l'exécution de requêtes natives n'est compatible avec l'analyse de table partitionnée que lorsque le chemin d'accès contient les informations de partition. Sinon, la charge de travail revient au moteur d'exécution Spark.

Comportement incompatible

Un comportement incompatible ou des résultats incorrects peuvent se produire lors de l'exécution de requêtes natives dans les cas suivants :

  • Fonctions JSON : l'exécution de requêtes natives accepte les chaînes entourées de guillemets doubles, et non de guillemets simples. Des résultats incorrects s'affichent avec les guillemets simples. L'utilisation de "*" dans le chemin d'accès avec la fonction get_json_object renvoie NULL.

  • Configuration de la lecture Parquet :

    • L'exécution de requêtes natives traite spark.files.ignoreCorruptFiles comme défini sur la valeur par défaut false, même lorsqu'il est défini sur true.
    • L'exécution de requêtes natives ignore spark.sql.parquet.datetimeRebaseModeInRead et ne renvoie que le contenu du fichier Parquet. Les différences entre l'ancien calendrier hybride (julien-grégorien) et le calendrier grégorien proleptique ne sont pas prises en compte. Les résultats Spark peuvent varier.
  • NaN : non compatible. Des résultats inattendus peuvent se produire, par exemple, lorsque vous utilisez NaN dans une comparaison numérique.

  • Lecture en colonnes Spark : une erreur fatale peut se produire, car le vecteur en colonnes Spark est incompatible avec l'exécution de requêtes natives.

  • Débordement : lorsque les partitions de répartition aléatoire sont définies sur un grand nombre, la fonctionnalité de débordement sur disque peut déclencher un OutOfMemoryException. Si cela se produit, vous pouvez éliminer cette exception en réduisant le nombre de partitions.