Conteneur Dataproc pour Spark

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 :

  1. 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
    
  2. 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
    
  3. 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 :

  1. 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
    
  2. É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.

  3. 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 commande kubectl. Pour en savoir plus, consultez la section Exemples d'applications.

  4. Vérifiez l'état de la demande.

  5. Facultatif : Examinez les journaux d'application. Pour en savoir plus, consultez la section Afficher les journaux d'une application Spark 3.

  6. 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 :

  1. 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"
    
  2. 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
    
  3. 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 :

  1. Pour exécuter une application SparkSQL qui sélectionne la valeur 1, utilisez la requête suivante :

    select 1;
    
  2. 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"
    
  3. 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 :

  1. 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")
    
  2. 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"
    
  3. 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 :

  1. 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)
    
  2. 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"
    
  3. 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 :

  1. Recherchez votre pod de pilote Spark :

    kubectl -n spark get pods
    
  2. 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 :

  1. Ouvrez le fichier YAML de la spécification SparkApplication.
  2. Recherchez le champ spec dans le fichier.
  3. Localisez le champ sparkConf imbriqué dans le champ spec.
  4. Recherchez la valeur du champ spark.eventLog.dir imbriqué dans la section sparkConf.
  5. 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.