Google Distributed Cloud (GDC) sous air gap fournit un conteneur Dataproc pour Spark. Il s'agit d'un environnement Apache Spark pour le traitement des données. Pour en savoir plus sur Apache Spark, consultez https://spark.apache.org/
. Utilisez des conteneurs Dataproc Container pour Spark afin d'exécuter des applications Spark nouvelles ou existantes dans un cluster Kubernetes Distributed Cloud avec un minimum de modifications. Si vous connaissez les outils Spark, vous pouvez continuer à les utiliser.
Définissez votre application Spark dans un fichier YAML, et Distributed Cloud alloue les ressources pour vous. Le conteneur Dataproc pour Spark démarre en quelques secondes. Les exécuteurs Spark évoluent à la hausse ou s'arrêtent en fonction de vos besoins.
Configurez les conteneurs de Dataproc Container pour Spark sur Distributed Cloud afin d'utiliser du matériel spécialisé, tel que des nœuds matériels spécialisés ou des GPU.
Déployer le service Dataproc Container for Spark
L'administrateur de plate-forme (AP) doit installer les services Marketplace pour vous avant que vous puissiez les utiliser. Contactez votre responsable de compte si vous avez besoin de Dataproc Container pour Spark. Pour en savoir plus, consultez Installer un package logiciel GDC Marketplace.
Conditions préalables à l'exécution d'applications Spark
Vous devez disposer d'un compte de service dans les clusters d'utilisateur pour utiliser le service Dataproc Container for Spark. Le conteneur Dataproc pour Spark crée un pod de pilote Spark pour exécuter une application Spark. Un pod de pilote Spark a besoin d'un compte de service Kubernetes dans l'espace de noms du pod, avec les autorisations nécessaires pour effectuer les actions suivantes :
- Créer, obtenir, lister et supprimer des pods d'exécution.
- Créez un service Kubernetes sans adresse IP de cluster pour le pilote.
Avant d'exécuter une application Spark, procédez comme suit pour vous assurer de disposer d'un compte de service avec les autorisations précédentes dans l'espace de noms foo
:
Créez un compte de service pour qu'un pod de pilote Spark puisse l'utiliser dans l'espace de noms
foo
:kubectl create serviceaccount spark --kubeconfig AO_USER_KUBECONFIG --namespace=foo
Créez un rôle pour accorder les autorisations permettant de créer, d'obtenir, de lister et de supprimer les pods d'exécution, et créez un service Kubernetes sans adresse IP de cluster pour le pilote dans l'espace de noms
foo
:kubectl create role spark-driver --kubeconfig AO_USER_KUBECONFIG --verb=* \ --resource=pods,services,configmaps,persistentvolumeclaims \ --namespace=foo
Créez une liaison de rôle pour accorder au compte de service l'accès aux rôles dans l'espace de noms
foo
:kubectl create --kubeconfig AO_USER_KUBECONFIG \ rolebinding spark-spark-driver \ --role=spark-driver --serviceaccount=foo:spark \ --namespace=foo
Exécuter des exemples d'applications Spark 3
La conteneurisation des applications Spark simplifie l'exécution d'applications Big Data sur site à l'aide de Distributed Cloud. En tant qu'opérateur d'application (AO), exécutez les applications Spark spécifiées dans les objets GKE du type de ressource personnalisée SparkApplication
.
Pour exécuter et utiliser une application Apache Spark 3 sur Distributed Cloud, procédez comme suit :
Examinez l'image
spark-operator
dans votre projet pour trouver le$DATAPROC_IMAGE
à référencer dans votre application Spark :export DATAPROC_IMAGE=$(kubectl get pod --kubeconfig AO_USER_KUBECONFIG \ --selector app.kubernetes.io/name=spark-operator -n foo \ -o=jsonpath='{.items[*].spec.containers[0].image}' \ | sed 's/spark-operator/dataproc/')
Exemple :
export DATAPROC_IMAGE=10.200.8.2:10443/dataproc-service/private-cloud-devel/dataproc:3.1-dataproc-17
Écrivez une spécification
SparkApplication
et stockez-la dans un fichier YAML. Pour en savoir plus, consultez la section Écrire une spécification d'application Spark.Envoyez, exécutez et surveillez votre application Spark telle qu'elle est configurée dans une spécification
SparkApplication
sur le cluster GKE avec la commandekubectl
. Pour en savoir plus, consultez la section Exemples d'applications.Vérifiez l'état de la demande.
Facultatif : Examinez les journaux d'application. Pour en savoir plus, consultez la section Afficher les journaux d'une application Spark 3.
Utilisez l'application Spark pour collecter et afficher l'état du pilote et des exécuteurs à l'utilisateur.
Rédiger une spécification d'application Spark
Une spécification SparkApplication
comprend les composants suivants :
- Le champ
apiVersion
- Le champ
kind
- Le champ
metadata
- La section
spec
.
Pour en savoir plus, consultez la section Writing a SparkApplication Spec (Écrire une spécification SparkApplication) sur GitHub : https://github.com/kubeflow/spark-operator/blob/gh-pages/docs/user-guide.md#writing-a-sparkapplication-spec
Exemples d'applications
Cette section inclut les exemples suivants avec leurs spécifications SparkApplication
correspondantes pour exécuter des applications Spark :
Spark Pi
Cette section contient un exemple d'exécution d'une application Spark Pi gourmande en ressources de calcul, qui estime 𝛑 (pi) en lançant des fléchettes dans un cercle.
Suivez les étapes ci-dessous pour exécuter Spark Pi :
Appliquez l'exemple de spécification
SparkApplication
suivant dans le cluster d'utilisateur :apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi namespace: foo spec: type: Python pythonVersion: "3" mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/pi.py" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Vérifiez que l'exemple de spécification
SparkApplication
s'exécute et se termine en une à deux minutes à l'aide de la commande suivante :kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-pi -n foo
Affichez les journaux du pilote pour voir le résultat :
kubectl --kubeconfig AO_USER_KUBECONFIG logs spark-pi-driver -n foo | grep "Pi is roughly"
Le résultat ressemble à ce qui suit :
Pi is roughly 3.1407357036785184
Pour en savoir plus, consultez les ressources suivantes :
- Pour le code de l'application, consultez l'article Estimation de Pi de la documentation Apache Spark :
https://spark.apache.org/examples.html
. - Pour obtenir un exemple de fichier YAML Spark Pi, consultez Écrire une spécification d'application Spark.
Spark SQL
Suivez les étapes ci-dessous pour exécuter SparkSQL :
Pour exécuter une application SparkSQL qui sélectionne la valeur
1
, utilisez la requête suivante :select 1;
Appliquez l'exemple de spécification
SparkApplication
suivant dans le cluster d'utilisateur :apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: pyspark-sql-arrow namespace: foo spec: type: Python mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/sql/arrow.py" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Vérifiez que l'exemple de spécification
SparkApplication
s'exécute et se termine en moins d'une minute à l'aide de la commande suivante :kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication pyspark-sql-arrow -n foo
Spark MLlib
Pour exécuter Spark MLlib, procédez comme suit :
Utilisez l'exemple Scala suivant pour exécuter une instance Spark MLlib qui effectue une analyse statistique et affiche un résultat dans la console :
import org.apache.spark.ml.linalg.{Matrix, Vectors} import org.apache.spark.ml.stat.Correlation import org.apache.spark.sql.Row val data = Seq( Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))), Vectors.dense(4.0, 5.0, 0.0, 3.0), Vectors.dense(6.0, 7.0, 0.0, 8.0), Vectors.sparse(4, Seq((0, 9.0), (3, 1.0))) ) val df = data.map(Tuple1.apply).toDF("features") val Row(coeff1: Matrix) = Correlation.corr(df, "features").head println(s"Pearson correlation matrix:\n $coeff1") val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head println(s"Spearman correlation matrix:\n $coeff2")
Appliquez l'exemple de spécification
SparkApplication
suivant dans le cluster d'utilisateur :apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-ml namespace: foo spec: type: Scala mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.ml.SummarizerExample mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples_2.12-3.1.3.jar" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Vérifiez que l'exemple de spécification
SparkApplication
s'exécute et se termine en moins d'une minute à l'aide de la commande suivante :kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-ml -n foo
SparkR
Pour exécuter SparkR, procédez comme suit :
Utilisez l'exemple de code suivant pour exécuter une instance SparkR qui charge un ensemble de données groupées et imprime la première ligne :
library(SparkR) sparkR.session() df <- as.DataFrame(faithful) head(df)
Appliquez l'exemple de spécification
SparkApplication
suivant dans le cluster d'utilisateur :apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-r-dataframe namespace: foo spec: type: R mode: cluster image: "${DATAPROC_IMAGE?}" imagePullPolicy: Always mainApplicationFile: "local:///usr/lib/spark/examples/src/main/r/dataframe.R" sparkVersion: "3.1.3" restartPolicy: type: Never driver: cores: 1 coreLimit: "1000m" memory: "512m" serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m"
Vérifiez que l'exemple de spécification
SparkApplication
s'exécute et se termine en moins d'une minute à l'aide de la commande suivante :kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-r-dataframe -n foo
Afficher les journaux d'une application Spark 3
Spark comporte les deux types de journaux suivants que vous pouvez visualiser :
Utilisez le terminal pour exécuter des commandes.
Journaux des conducteurs
Pour afficher les journaux du pilote de votre application Spark, procédez comme suit :
Recherchez votre pod de pilote Spark :
kubectl -n spark get pods
Ouvrez les journaux du pod du pilote Spark :
kubectl -n spark logs DRIVER_POD
Remplacez
DRIVER_POD
par le nom du pod de pilote Spark que vous avez trouvé à l'étape précédente.
Journaux des événements
Vous trouverez les journaux d'événements au chemin d'accès spécifié dans le fichier YAML de la spécification SparkApplication
.
Pour afficher les journaux d'événements de votre application Spark, procédez comme suit :
- Ouvrez le fichier YAML de la spécification
SparkApplication
. - Recherchez le champ
spec
dans le fichier. - Localisez le champ
sparkConf
imbriqué dans le champspec
. - Recherchez la valeur du champ
spark.eventLog.dir
imbriqué dans la sectionsparkConf
. - Ouvrez le chemin d'accès pour afficher les journaux d'événements.
Pour obtenir un exemple de fichier YAML de la spécification SparkApplication
, consultez Écrire une spécification d'application Spark.
Pour en savoir plus, contactez votre responsable de compte.