Utiliser Lightning Engine
Lightning Engine est un environnement d'exécution hautes performances pour Apache Spark sur Managed Service pour Apache Spark qui accélère les charges de travail nécessitant beaucoup de ressources de calcul et réduit les coûts d'exécution sans nécessiter de modifications de votre code Spark. Il est conçu pour les ingénieurs de données et les professionnels de l'analyse qui exécutent des charges de travail nécessitant d'importantes ressources de calcul et qui utilisent les API Spark DataFrame, les API Spark Dataset ou les requêtes Spark SQL.
Avantages
Voici quelques-uns des avantages de Lightning Engine :
Opérations de données accélérées : bénéficiez de gains de performances et d'économies significatifs grâce aux optimisations de l'interaction avec Cloud Storage, y compris la gestion des métadonnées, les charges de travail d'écriture et les E/S vectorisées.
Exécution intelligente des requêtes : profitez d'améliorations avancées de l'optimiseur qui réduisent de manière dynamique les données analysées, optimisent le traitement des données et génèrent des plans d'exécution plus efficaces pour des requêtes plus rapides et plus rentables.
Charges de travail d'IA et de ML simplifiées : réduisez les temps de démarrage des clusters pour les charges de travail basées sur des GPU et simplifiez le déploiement dans des environnements sécurisés à l'aide d'images optimisées pour l'IA.
Bien que Lightning Engine offre des gains de performances substantiels, l'impact spécifique varie en fonction de la charge de travail.
Comparaison avec le moteur standard
Lightning Engine est une alternative au moteur standard utilisé pour exécuter des jobs Spark sur un cluster Managed Service pour Apache Spark. Le tableau suivant compare les propriétés d'activation, l'applicabilité des charges de travail et les principaux avantages de Lightning Engine par rapport au moteur standard.
| Fonctionnalité | Moteur standard | Lightning Engine |
|---|---|---|
| Option de la CLI | --engine=default ou annuler l'option |
--engine=lightning |
| Cas d'utilisation | Jobs d'usage général, développement et tests | Charges de travail d'entreprise nécessitant une accélération significative |
| Principaux avantages | Performances de référence | Interaction optimisée avec le stockage cloud, exécution intelligente des requêtes |
Exigences de Lightning Engine
Les exigences suivantes s'appliquent à la fonctionnalité Lightning Engine :
- Version d'image : Lightning Engine doit être utilisé avec la version d'image
2.3.3de Managed Service pour Apache Spark et les versions d'image secondaires2.3ultérieures, ou avec la version d'image3.0.2et les versions d'image secondaires3.0ultérieures (imagesdebian13etubuntu24). - Jobs compatibles : Spark, PySpark, SparkSQL et SparkR sont compatibles. Le moteur standard s'exécute sur d'autres types de missions envoyées à un cluster Lightning Engine.
Exécution native des requêtes
L'exécution native des requêtes est un composant optionnel de Lightning Engine qui fournit un niveau d'accélération plus élevé pour des jobs spécifiques. Il s'agit d'un moteur natif basé sur Apache Gluten et Velox, optimisé pour les appareils Google, qui améliore les performances en exécutant des parties d'une requête Spark en dehors de la JVM.
- Le NQE est recommandé pour :
- Tâches nécessitant d'importantes ressources de calcul qui exploitent les API Spark DataFrame et Spark Dataset, et requêtes Spark SQL qui lisent les données des fichiers et tables Parquet, ORC, Apache Iceberg et Delta Lake. Le format de fichier de sortie n'affecte pas ses performances.
- La NQE n'est pas recommandée pour :
- Jobs qui s'appuient fortement sur les ensembles de données distribués résilients (RDD), les fonctions définies par l'utilisateur (UDF), la plupart des bibliothèques de machine learning (ML) Spark et les opérations liées aux E/S avec des retards dus à l'accès au stockage.
Exécution native des requêtes sur ARM
Managed Service pour Apache Spark est compatible avec l'exécution de requêtes natives dans Lightning Engine sur l'architecture ARM, spécifiquement optimisée pour les processeurs Google Axion sur les VM ARM C4A (voir Types de machines ARM compatibles avec Managed Service pour Apache Spark) à l'aide de l'image 2.3-ubuntu22-arm. Les instances Google Axion C4A sont des VM basées sur ARM, construites sur des cœurs ARM Neoverse V2, qui offrent des améliorations significatives du rapport prix/performances.
L'exécution de NQE sur des instances ARM Google Axion combine un rapport prix/performances au niveau matériel et une bande passante mémoire élevée par cœur avec une accélération des requêtes vectorisées native au niveau logiciel, ce qui réduit considérablement les temps d'exécution des requêtes et le coût total de possession (TCO).
Voici les principaux avantages sur ARM :
- Vitesse 2,5 à 4 fois supérieure à celle de Spark Open Source : offre des performances 2,5 à 4 fois supérieures à celles d'Apache Spark Open Source sur les charges de travail analytiques.
- Optimisation des coûts : maximise l'avantage prix/performances des instances Google Axion C4A (qui offrent un rapport prix/performances jusqu'à 65% supérieur par rapport aux instances x86 comparables).
- Parité complète des opérateurs et des formats : parité complète avec les opérateurs NQE x86, avec accélération native pour les formats de table Cloud Storage Parquet, Apache Iceberg et Delta Lake.
- Aucune modification de code : activation fluide sur les clusters ARM à l'aide d'options de configuration standards, sans modifier le code de votre application Spark.
Exigences concernant l'exécution de requêtes natives
Les exigences suivantes s'appliquent à la fonctionnalité d'exécution de requêtes natives :
Moteur d'exécution : NQE n'est disponible que sur les clusters pour lesquels le moteur Lightning a été activé lors de la création du cluster.
Jobs compatibles : Spark, PySpark, Spark SQL et SparkR sont compatibles. Le moteur standard s'exécutera (sans NQE) sur les autres types de missions envoyés à un cluster Lightning Engine.
Pas de GPU ni d'accélérateurs : les jobs avec NQE activé envoyés sur des accélérateurs GPU échoueront (mais ils peuvent bénéficier de Lightning Engine sans NQE).
Types de données : les entrées des types de données suivants ne sont pas acceptées :
- Octet : ORC et Parquet
- Struct, Array, Map : Parquet
Exigences concernant l'architecture et le système d'exploitation
Les exigences de NQE diffèrent selon l'architecture du processeur :
| Architecture | Types de machines compatibles | Système d'exploitation et image compatibles |
|---|---|---|
| x86 | Familles de machines Intel et AMD | Debian-12 et Ubuntu-22 (version d'image 2.3.3 et versions ultérieures de 2.3) ; Debian-13 et Ubuntu-24 (version d'image 3.0.2 et versions ultérieures de 3.0) |
| ARM | Série de machines C4A (VM ARM Google Axion) | Image 2.3-ubuntu22-arm (versions 2.3.3 et ultérieures de 2.3) |
Tarifs
Pour en savoir plus sur les tarifs, consultez Tarifs de Managed Service pour Apache Spark.
Créer un cluster Lightning Engine
Cette section vous explique comment créer un cluster Managed Service pour Apache Spark qui active Lightning Engine sur les jobs Spark envoyés au cluster.
Vous pouvez également activer l'exécution de requêtes natives (NQE) sur le cluster lors de sa création, ou l'activer ultérieurement pour des jobs Spark spécifiques envoyés au cluster.
Avant de commencer
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the Dataproc API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Rôles requis
Certains rôles IAM (Identity and Access Management) sont requis pour créer un cluster Managed Service pour Apache Spark et lui envoyer des jobs. Selon les règles d'administration, un propriétaire de projet cloud ou un administrateur de service peut déjà vous avoir attribué ces rôles, ou les avoir attribués à un compte de service. Pour vérifier les attributions de rôles, consultez Devez-vous attribuer des rôles ?.
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Rôles utilisateur
Pour obtenir les autorisations nécessaires pour créer un cluster Managed Service pour Apache Spark, demandez à votre administrateur de vous accorder les rôles IAM suivants :
- Éditeur Dataproc (
roles/dataproc.editor) sur le projet - Utilisateur du compte de service (
roles/iam.serviceAccountUser) sur le compte de service Compute Engine par défaut
Rôle du compte de service
Pour vous assurer que le compte de service Compute Engine par défaut dispose des autorisations nécessaires pour créer un cluster Managed Service pour Apache Spark, demandez à votre administrateur d'accorder le rôle IAM Nœud de calcul Dataproc (roles/dataproc.worker) au compte de service Compute Engine par défaut sur le projet.
Créer le cluster
Les exemples suivants vous montrent comment créer un cluster Lightning Engine à l'aide de la console Cloud de Confiance , de la Google Cloud CLI, de l'API Dataproc, des bibliothèques clientes Cloud pour Python ou de Terraform. Vous pouvez également créer un cluster avec le moteur Lightning activé à l'aide des bibliothèques clientes Cloud Go, Java et Node.js.
Console
- Ouvrez la page Créer un cluster.
- Cliquez sur Configuration supplémentaire pour développer cette section.
- Modifiez Personnalisation et autres.
- Dans le panneau qui s'ouvre, vérifiez que la case Activer le moteur Lightning est cochée.
- Facultatif : Pour activer l'environnement d'exécution natif par défaut pour les jobs Spark, cochez la case Activer l'exécution native.
- Cliquez sur Enregistrer.
- Configurez les autres paramètres du cluster selon vos besoins.
- Cliquez sur Créer un cluster.
Créer un cluster ARM :
Pour créer un cluster ARM avec Google Axion et l'exécution de requêtes native :
- Dans Configuration du nœud de calcul, sélectionnez la série de machines C4A, puis choisissez votre type de machine ARM.
- Dans Image, sélectionnez l'image
2.3-ubuntu22-arm. - Dans Configuration supplémentaire > Personnalisation et autres, vérifiez que les options Activer le moteur Lightning et Activer l'exécution native sont sélectionnées.
- Cliquez sur Créer un cluster.
gcloud
Pour créer un cluster avec le moteur Lightning activé, exécutez la commande
gcloud dataproc clusters createavec l'option--engine=lightning. Pour en savoir plus, consultez Créer un cluster avec la gcloud CLI.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3Facultatif : Pour activer l'environnement d'exécution natif par défaut pour les jobs Spark, incluez la propriété
spark:spark.dataproc.lightningEngine.runtime=native.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3 \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'Créer un cluster ARM avec NQE : pour créer un cluster Managed Service pour Apache Spark avec des nœuds ARM Google Axion C4A et NQE activé :
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --image-version=2.3-ubuntu22-arm \ --master-machine-type=c4a-standard-16 \ --worker-machine-type=c4a-standard-16 \ --engine=lightning \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'
API
Pour créer un cluster avec le moteur Lightning activé, envoyez une requête clusters.create. Pour en savoir plus, consultez Créer un cluster avec l'API REST.
Dans le corps de la requête, définissez le champ
enginesurLIGHTNING.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3" } } }Facultatif : Pour activer l'environnement d'exécution natif par défaut pour tous les jobs, incluez la propriété
spark:spark.dataproc.lightningEngine.runtime.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } }
Python
Pour créer un cluster avec le moteur Lightning activé, utilisez la méthode
create_clusteret définissez le champenginesurLIGHTNINGdans la configuration du cluster. Pour en savoir plus, consultez Créer un cluster avec Python.from google.cloud import dataproc_v1 def create_lightning_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", }, } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")Facultatif : Pour activer l'environnement d'exécution natif par défaut pour les jobs Spark, incluez la propriété
spark:spark.dataproc.lightningEngine.runtime.from google.cloud import dataproc_v1 def create_lightning_native_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")
Terraform
- Dans la configuration de votre ressource
google_dataproc_cluster, définissez l'argumentenginesurLIGHTNING. - Pour en savoir plus et découvrir les options avancées, consultez la documentation Terraform officielle de la ressource
google_dataproc_cluster.
Vérifier le moteur du cluster
Console
- Dans la console Cloud de Confiance , accédez à la page Détails du cluster.
- Vérifiez que la valeur
Lightning Engineest listée dans le champ Moteur. - Si vous avez activé l'exécution native des requêtes, vérifiez que
nativeest listé dans le champ Exécution native.
gcloud
Pour vérifier le moteur et le NQE (si activé), exécutez la commande
gcloud dataproc clusters describe:gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGIONVérifiez la sortie des propriétés
engineetlightningEngine.runtime:clusterName: lightning-engine-cluster engine: lightningEngine lightningEngine.runtime: native
Envoyer un job avec Lightning Engine
Si vous avez activé Lightning Engine lors de la création d'un cluster, lorsque vous envoyez un job Spark au cluster, Lightning Engine est activé par défaut sur le job.
Activer l'exécution native des requêtes pour un job
Si vous avez activé l'exécution native des requêtes (NQE) lors de la création d'un cluster Lightning Engine, tous les jobs Spark s'exécutent avec la NQE activée, sauf si vous désactivez la NQE sur un job spécifique.
Si vous n'avez pas activé l'exécution native des requêtes lors de la création du cluster Lightning Engine, vous pouvez l'activer pour un job lorsque vous l'envoyez, comme illustré dans les exemples suivants.
gcloud
Pour activer l'exécution native des requêtes lorsque vous envoyez un job Spark, incluez la propriété spark.dataproc.lightningEngine.runtime=native :
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=native \
-- ...
API
Pour activer l'exécution native des requêtes lorsque vous envoyez un job Spark, incluez la propriété spark.dataproc.lightningEngine.runtime dans votre requête :
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"native"
}
}
}
}
Désactiver l'exécution native des requêtes pour un job
Si vous avez activé l'exécution de requêtes natives (NQE) lorsque vous avez créé un cluster Lightning Engine, tous les jobs Spark s'exécuteront avec la NQE activée, sauf si vous la désactivez pour un job spécifique.
Vous pouvez désactiver l'estimation de la qualité du réseau pour un job Spark spécifique lorsque vous l'envoyez, comme illustré dans les exemples suivants.
gcloud
Pour désactiver l'exécution native des requêtes lorsque vous envoyez un job Spark à un cluster Lightning Engine, incluez la propriété spark.dataproc.lightningEngine.runtime=default :
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=default \
-- ...
API
Pour désactiver l'exécution native des requêtes lorsque vous envoyez un job Spark à un cluster Lightning Engine, incluez la propriété spark.dataproc.lightningEngine.runtime=default :
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"default"
}
}
}
}
Vérifier l'exécution de requêtes natives pour un job
Après avoir envoyé un job à un cluster Lightning Engine, vous pouvez vérifier que l'exécution native des requêtes est activée pour ce job.
Console
- Dans la console Cloud de Confiance , accédez à la page Jobs.
- Cliquez sur l'ID du job pour ouvrir la page Informations sur le job.
- Vérifiez que
nativeest listé dans le champ Exécution native.
gcloud
Exécutez la commande
gcloud dataproc jobs describe:gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGIONVérifiez le résultat de
lightningEngine.runtimedans la section Propriétés :lightningEngine.runtime: native
Paramètres de configuration
Le tableau suivant récapitule les principaux paramètres de configuration pour Lightning Engine et l'exécution de requêtes natives.
| Nom du paramètre | Description | Moteur(s) concerné(s) | Valeur par défaut | Valeur par défaut (moteur Lightning) | Remplaçable par l'utilisateur (au niveau du job) | Champ d'application |
|---|---|---|---|---|---|---|
--engine |
Paramètre au niveau du cluster pour sélectionner le moteur lors de la création du cluster. | À l'échelle du cluster | default |
lightning |
Non | Cluster |
spark:spark.dataproc.lightningEngine.runtime |
Paramètre au niveau du cluster permettant de sélectionner l'environnement d'exécution du moteur Lightning lors de la création du cluster. | Lightning uniquement | default |
default |
Non | Cluster |
spark.dataproc.lightningEngine.runtime |
Active ou désactive l'exécution native des requêtes dans Lightning Engine. | Lightning uniquement | default |
default |
Oui. Peut être défini sur native ou default. |
Job |
Limites
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 remplacement de la charge de travail par le moteur Spark par défaut.
Créations de remplacement
L'exécution de requêtes natives dans les scénarios suivants peut entraîner le basculement d'une charge de travail vers le moteur d'exécution Spark :
- 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 se produire.
- 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 lorsque vous utilisez 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 se produisent avec des guillemets simples. L'utilisation de
*dans le chemin d'accès avec la fonctionget_json_objectrenvoieNULL. - Configuration de lecture Parquet :
- L'exécution de requêtes natives traite
spark.files.ignoreCorruptFilescomme s'il était défini sur la valeur par défautfalse, même s'il est défini surtrue. - L'exécution de requêtes natives ignore
spark.sql.parquet.datetimeRebaseModeInReadet ne renvoie que le contenu du fichier Parquet. Les différences entre l'ancien calendrier hybride et le calendrier grégorien proleptique ne sont pas prises en compte. Les résultats de Spark peuvent varier.
- L'exécution de requêtes natives traite
- NaN : non compatible. Des résultats inattendus peuvent se produire, par exemple, lorsque vous utilisez
NaNdans une comparaison numérique. - Lecture en colonnes Spark : une erreur fatale peut se produire, car le vecteur en colonnes Spark n'est pas compatible avec l'exécution de requêtes natives.
- Débordement : lorsque vous définissez un grand nombre de partitions de brassage, la fonctionnalité de débordement sur disque peut déclencher une erreur
OutOfMemoryException. Si cela se produit, réduire le nombre de partitions peut éliminer cette exception.